温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

android 中怎么利用so库实现逆向调试

发布时间:2021-08-13 14:29:10 来源:亿速云 阅读:174 作者:Leah 栏目:开发技术

android 中怎么利用so库实现逆向调试,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

创建默认的native application

打开as,选择File -> new project -> naive c++  创建包含c++的原生工程。

android 中怎么利用so库实现逆向调试

默认的native工程,帮我们实现了stringFromJNI方法,那我们就来探索如何hook这个stringFromJNI,并修改他的值。

修改stringFromJNI方法,便于调试

as默认实现的stringFromJNI只有在Activity onCreate的时候调用,为了便于调试,我们增加一个点击事件,每次点击重新调用,并且返回一个随机的值。

java代码增加如下方法:

	binding.sampleText.setOnClickListener {
		Log.e("MainActivity", "stringFromJNI")
		binding.sampleText.text = stringFromJNI()
	}

修改native-lib.cpp代码:

#include <jni.h>
#include <string>

using namespace std;

int max1(int num1, int num2);
#define random(x) rand()%(x)

extern "C" JNIEXPORT jstring JNICALL
Java_com_noober_naticeapplication_MainActivity_stringFromJNI(
        JNIEnv* env,
        jobject /* this */) {
    int result = max1(random(100), random(100));
    string hello = "Hello from C++";
    string hello2 = hello.append(to_string(result));
    return env->NewStringUTF(hello2.c_str());
}


int max1(int num1, int num2)
{
    // 局部变量声明
    int result;

    if (num1 > num2)
        result = num1;
    else
        result = num2;

    return result;
}

修改的代码很简单,相信不会 c++ 的同学也看得懂,就是随机输入两个数,取其中小的那一位拼接在“Hello from C++”后面,并返回。主要目的是让我们每次点击的时候,返回内容可以动态。

修改androidManifest文件

在application中增加下面两行代码:

android:extractNativeLibs="true"
    android:debuggable="true"

android:debuggable: 让我们可以对apk进行调试,如果是第三方已经打包好了app,我们需要对其manifest文件进行修改,增加这行代码,然后进行重打包,否则无法进行so的调试。

android:extractNativeLibs: 很多人在进行调试的时候发现ida pro一切正常,但是却一直没有加载我们的libnative
-lib.so, 是因为缺少这行代码。如果不加,可能会使so直接自身的base.apk进行加载,导致ida pro无法识别。

修改CMakeLists.txt

在cmakelists中增加下面代码。so文件生成路径,这样编译之后就可以在main-cpp-jniLibs目录下找到生产的so文件。

set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/jniLibs/${ANDROID_ABI})

编译运行,获取so

上述工作做好之后,直接编译运行,同时会生成4个so文件,我们取手机运行时对应使用的那个so进行hook。
我这边使用的是arm64-v8a目录下的libnative-lib.so。

android 中怎么利用so库实现逆向调试

hook环境准备

  • 系统:windows 10 64位

  • 工具ida pro 7.5

  • java8环境

  • android sdk tools和adb工具

  • arm64-v8a目录下的libnative-lib.so

  • android 真机

使用ida pro进行hook

adb与手机的准备

1、首先找到ida pro的dbgsrv文件夹,里面有很多server文件

android 中怎么利用so库实现逆向调试

64代表的含义是64位,否则就是32位,我们根据我们需要调试的so的指令集进行选择。因为我这边调试的是arm64-v8a,这里我们就选择android_server64的文件。连接真机后,打开cmd,输入以下指令:

adb push "\\Mac\Home\Desktop\IDA PRO 7.5 (x86, x64, ARM, ARM64)\dbgsrv\android_server64"  /data/local/tmp

2、如果是真机,则需要输入su,模拟器不需要

 #真机
 su

3、修改权限

 chmod 777 /data/local/tmp/android_server64

4、运行

 /data/local/tmp/android_server64

android 中怎么利用so库实现逆向调试

5、新打开一个cmd,在本地执行adb 做端口转发

 adb forward tcp:23946 tcp:23946

ida pro的工作准备

1、打开ida pro,因为我们的so是64位的,所以打开ida64.exe。点击new,选择libnative-lib.so。

2、选择debugger-select debugger

android 中怎么利用so库实现逆向调试

3、选择Remote ARM Linux/Android debugger

android 中怎么利用so库实现逆向调试

4、点击debugger-Debugger options

勾选Suspend on process entry point ,也就是在断点处进行挂起暂停

android 中怎么利用so库实现逆向调试

5、点击debugger-Process options

填写hostname为localhost

android 中怎么利用so库实现逆向调试

6、找到exports标签,ctrl+f,搜索java关键字,找到我们要hook的函数。

android 中怎么利用so库实现逆向调试

7、双击打开,按F5,进行反汇编操作。这样就可以看到反汇编之后的c ++代码了。然后我们随便加上断点进行调试。

android 中怎么利用so库实现逆向调试

8、执行adb命令,进入调试状态,也就是打开我们要调试的app的启动activity,我这边如下:

 adb shell am start -D -n com.noober.naticeapplication/com.noober.naticeapplication.MainActivity

9、点击debugger-Attach to process

选择我们需要调试的进程。

android 中怎么利用so库实现逆向调试

10、adb 执行如下命令,关联运行的so与本地要调试的so。

jdb -connect com.sun.jdi.SocketAttach:hostname=127.0.0.1,port=8700

11、此时ida卡在libc.so的位置,点击继续执行,弹出如下界面,关联so到本地,选择same。如果没有弹出则需要通过快捷键ctrl+s, 打开所有已经加载的so,找到我们的libnative-lib.so

android 中怎么利用so库实现逆向调试

12、此时就会自动进入断点。

android 中怎么利用so库实现逆向调试

使用ida pro进行调试

ida pro 常用调试快捷键

  • F2下断点

  • F7单步步入

  • F8单步步过

  • F9执行到下个断点

  • G调到函数地址

  • Debugger-debugger windows-locals 查看变量

进行调试

简单分析反汇编代码,我们发现返回值是v5,通过f8,执行到return的上一行。打开locals, 获取所有变量的值。

android 中怎么利用so库实现逆向调试

复制bytes的地址0x7FFE2CDEB9LL,切换到代码界面,输入快捷键g,输入地址跳转。这样我们便从内存中得到了数据结果,可以看出本次返回的值就是"Hello from c++89"

android 中怎么利用so库实现逆向调试

关于android 中怎么利用so库实现逆向调试问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注亿速云行业资讯频道了解更多相关知识。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI