Android IDA 动态调试so(过掉JNI_Onload调试检测)笔记

链接:https://pan.baidu.com/s/1oOH9RgukXJcXianq8jgYhg 
提取码:5lzf 
这个是我调试的样本APK,是阿里逆向前几年的一道题。

Android IDA 动态调试so(过掉JNI_Onload调试检测)笔记_第1张图片拿到APK,先用apktool 解包

apktool d ali.apk ,解包之后打开文件夹发现存在so文件,于是用JEB或者android killer打开APK

Android IDA 动态调试so(过掉JNI_Onload调试检测)笔记_第2张图片

先查找入口主类,发现是com.yaotong.crackme.MainActivity 

然后看到android:bebuggable ="true"这个属性并没有在APK里面,想要动态调试APK的话,那么待会我就需要添加这段代码 。

先点开主类查看函数

 Android IDA 动态调试so(过掉JNI_Onload调试检测)笔记_第3张图片

主界面只有一个Button,所以button点击的函数事件就是检测密码,然后这个函数securityCheck()是注册在so文件里面的, 使用IDA 打开so文件,查看securityCheck()函数 

Android IDA 动态调试so(过掉JNI_Onload调试检测)笔记_第4张图片

然后F5反汇编,其中这段代码是说输入密码和正确密码逐位对比,所以我们可以动态调试so输出正确密码

Android IDA 动态调试so(过掉JNI_Onload调试检测)笔记_第5张图片 

但是这题不可能有这么简单,CTRL+S查看init_array,没发现什么异常,再检测JNI_Onload,看到里面有一大堆代码,猜测应该是用来反调试用的(反调试手段不可能就只有个android:debuggable="false"或者不加这个属性这么简单,大多数情况会在init_array或者JNI_Onload开启线程检测TracePid或者端口23946之类的,因为程序启动的时候最先JNI_Onload和init_array是在主界面启动之前响应,所以在这里面加入反调试代码最好)

Android IDA 动态调试so(过掉JNI_Onload调试检测)笔记_第6张图片

然后修改 AndroidManifest.xml添加android:debuggable="true",打包APK:apktool b ali -o ll.apk,使用签名工具对ll.apk进行签名,这里我用的是android killer进行签名,使用adb 命令将APK安装到手机 adb install C:\Users\a1046\Desktop\SecretJungle\ll_sign.apk

想要动态调试so文件,需要将IDA pro里面的android_server push 到手机 /data/local/tmp文件夹下,并赋予777权限

adb push XXXXX(路径)\android_server /data/local/tmp 

adb shell 

su 

cd /data/local/tmp

chmod -R 777 android_server,然后ls -al 查看,然后./android_server启动,重开一个cmd,输入adb forward tcp:23946 tcp:23946,然后以调试模式启动程序 adb shell am start -D -n com.yaotong.crackme/.MainActivity

Android IDA 动态调试so(过掉JNI_Onload调试检测)笔记_第7张图片

打开IDA ,点击debugger->select debugger ,这样选择,然后确定

Android IDA 动态调试so(过掉JNI_Onload调试检测)笔记_第8张图片

然后再Debugger->process options 进行如下设置

Android IDA 动态调试so(过掉JNI_Onload调试检测)笔记_第9张图片

然后Debugger->attach to process ,找到目标进程 点击进去

 

接下来出现的选项点yes,然后Debugger->Debugger options进行如下设置

Android IDA 动态调试so(过掉JNI_Onload调试检测)笔记_第10张图片

设置好了之后按F9,启动程序,打开ddmx(SDK tools 文件夹),打开cmd输入jdb -connect com.sun.jdi.SocketAttach:hostname=127.0.0.1,port=8700,然后接着f9,直到jdb attach 住了(IDA出现的界面选项中 有yes点yes,有same 点same);

Android IDA 动态调试so(过掉JNI_Onload调试检测)笔记_第11张图片

再linker加载进来之后ctrl+s搜索目标so ,看到so已经加载进来

Android IDA 动态调试so(过掉JNI_Onload调试检测)笔记_第12张图片

cancel,然后再右侧moudules中搜索so 打开Jni_onload,下个断点,F9,出现选项点yes;

Android IDA 动态调试so(过掉JNI_Onload调试检测)笔记_第13张图片 

Android IDA 动态调试so(过掉JNI_Onload调试检测)笔记_第14张图片

 

接着开始F7 F8单步调试。多次调试发现在运行玩BLX R7之后程序会退出,那么此处应该就是反调试检测机制了。

打开R7寄存器 出现pthread_create ,证明猜测正确

Android IDA 动态调试so(过掉JNI_Onload调试检测)笔记_第15张图片

然后使用用IDA pro静态打开so 文件 找到汇编代码,产看blx R7 的十六进制,37 FF 2F E1

Android IDA 动态调试so(过掉JNI_Onload调试检测)笔记_第16张图片

使用010 Editor或者win hex修改成 00 00 00 00 就是直接nop掉这条指令(直接删除指令的话,文件会发生错乱,因为so文件有固定的格式,比如很多段的内容,每个段的偏移值都是保存的,这样删除的话会影响偏移值)。

然后重新打包,签名,安装到手机,之后就是正常的动态调试了,启动程序,启动android_server ,转发端口

打开IDA->Debugger ->attach->Remote Armlinux/Android Debugger ,确定

Android IDA 动态调试so(过掉JNI_Onload调试检测)笔记_第17张图片

找到com.yaotong.crackme进程点击进去。在modules查看crackme.so 打开SecurityCheck函数,下个断点,F9在手机上随便输入密码:crackSample,开始单步调试

Android IDA 动态调试so(过掉JNI_Onload调试检测)笔记_第18张图片

Android IDA 动态调试so(过掉JNI_Onload调试检测)笔记_第19张图片

调试到这的时候,点击R0寄存器查看 发现是我输入的密码

Android IDA 动态调试so(过掉JNI_Onload调试检测)笔记_第20张图片

那么R2应该就是正确密码了,为aiyou,bucuoo(0x61为a)

Android IDA 动态调试so(过掉JNI_Onload调试检测)笔记_第21张图片

打开程序检测 输入 ,正确 搞定

Android IDA 动态调试so(过掉JNI_Onload调试检测)笔记_第22张图片

 

 

 

你可能感兴趣的:(android逆向学习笔记)