好友
阅读权限10
听众
最后登录1970-1-1
|
链接:https://pan.baidu.com/s/1oOH9RgukXJcXianq8jgYhg
提取码:5lzf
这个是我调试的样本APK,是阿里逆向前几年的一道题。
apktool d ali.apk ,解包之后打开文件夹发现存在so文件,于是用JEB或者android killer打开APK
​
先查找入口主类,发现是com.yaotong.crackme.MainActivity
然后看到android:bebuggable ="true"这个属性并没有在APK里面,想要动态调试APK的话,那么待会我就需要添加这段代码 。
先点开主类查看函数
​
主界面只有一个Button,所以button点击的函数事件就是检测密码,然后这个函数securityCheck()是注册在so文件里面的, 使用IDA 打开so文件,查看securityCheck()函数
​
然后F5反汇编,其中这段代码是说输入密码和正确密码逐位对比,所以我们可以动态调试so输出正确密码
​
但是这题不可能有这么简单,CTRL+S查看init_array,没发现什么异常,再检测JNI_Onload,看到里面有一大堆代码,猜测应该是用来反调试用的(反调试手段不可能就只有个android:debuggable="false"或者不加这个属性这么简单,大多数情况会在init_array或者JNI_Onload开启线程检测TracePid或者端口23946之类的,因为程序启动的时候最先JNI_Onload和init_array是在主界面启动之前响应,所以在这里面加入反调试代码最好)
​
然后修改 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
​
​
打开IDA ,点击debugger->select debugger ,这样选择,然后确定
​
然后再Debugger->process options 进行如下设置
​
然后Debugger->attach to process ,找到目标进程 点击进去
​
接下来出现的选项点yes,然后Debugger->Debugger options进行如下设置
​
设置好了之后按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);
​
​
再linker加载进来之后ctrl+s搜索目标so ,看到so已经加载进来
​
cancel,然后再右侧moudules中搜索so 打开Jni_onload,下个断点,F9,出现选项点yes;
​
​
接着开始F7 F8单步调试。多次调试发现在运行玩BLX R7之后程序会退出,那么此处应该就是反调试检测机制了。
打开R7寄存器 出现pthread_create ,证明猜测正确
​
然后使用用IDA pro静态打开so 文件 找到汇编代码,产看blx R7 的十六进制,37 FF 2F E1
​
使用010 Editor或者win hex修改成 00 00 00 00 就是直接nop掉这条指令(直接删除指令的话,文件会发生错乱,因为so文件有固定的格式,比如很多段的内容,每个段的偏移值都是保存的,这样删除的话会影响偏移值)。
然后重新打包,签名,安装到手机,之后就是正常的动态调试了,启动程序,启动android_server ,转发端口
打开IDA->Debugger ->attach->Remote Armlinux/Android Debugger ,确定
​
找到com.yaotong.crackme进程点击进去。在modules查看crackme.so 打开SecurityCheck函数,下个断点,F9在手机上随便输入密码:crackSample,开始单步调试
​
​
调试到这的时候,点击R0寄存器查看 发现是我输入的密码
​
那么R2应该就是正确密码了,为aiyou,bucuoo(0x61为a)
​
打开程序检测 输入 ,正确 搞定
​
附上我博客原文地址
https://blog.csdn.net/Viewz/article/details/97757862
|
免费评分
-
查看全部评分
|
发帖前要善用【论坛搜索】功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。 |
|
|
|
|