超详细的android so库的逆向调试 |
您所在的位置:网站首页 › 逆向APP控件没有ID › 超详细的android so库的逆向调试 |
好久没有写博客了,最近的精力全放在逆向上面。目前也只是略懂皮毛。 android java层的逆向比较简单,主要就是脱壳 、反编译源码,通过xposed进行hook。 接下来介绍一下,如何去调试hook native层的源码,也就是hook so文件。 应用环境准备首先,为了方便学习,一上来就hook第三方app难度极大,因此我们自己来创建一个native的项目,自己来hook自己的项目作为学习的练手点。 创建默认的native application打开as,选择File -> new project -> naive c++ 创建包含c++的原生工程。 默认的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 #include 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。 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/tmp2. 如果是真机,则需要输入su,模拟器不需要 #真机 su3. 修改权限 chmod 777 /data/local/tmp/android_server644. 运行 /data/local/tmp/android_server64新打开一个cmd,在本地执行adb 做端口转发 adb forward tcp:23946 tcp:23946 ida pro的工作准备打开ida pro,因为我们的so是64位的,所以打开ida64.exe。点击new,选择libnative-lib.so。 选择debugger-select debugger 勾选Suspend on process entry point ,也就是在断点处进行挂起暂停 填写hostname为localhost 执行adb命令,进入调试状态,也就是打开我们要调试的app的启动activity,我这边如下: adb shell am start -D -n com.noober.naticeapplication/com.noober.naticeapplication.MainActivity点击debugger-Attach to process 选择我们需要调试的进程。 adb 执行如下命令,关联运行的so与本地要调试的so。 jdb -connect com.sun.jdi.SocketAttach:hostname=127.0.0.1,port=8700此时ida卡在libc.so的位置,点击继续执行,弹出如下界面,关联so到本地,选择same。如果没有弹出则需要通过快捷键ctrl+s, 打开所有已经加载的so,找到我们的libnative-lib.so 以上就是所有文章内容,主要是为了给没有接触过so调试的同学学习,以及自己记录。关于如何去进一步so hook,会在后面的研究后继续分享。 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |