首页 > 代码库 > Android 逆向初探(二)
Android 逆向初探(二)
一、对android app进行分析时, 需要对其进行动态调试。
1、IDA 附加进行调试
将ida目录中的android_server push到安卓手机上
adb push android_server /data/local/tmp
1)、执行android_server:
adb shell /data/local/tmp/android_server
2)、端口转发:
adb forward tcp:23946 tcp:23946
3)、调试模式启动程序,手机界面会出现Waiting For Debugger页面
ddms
adb shell am start -D -n 包名/类名
4)、打开32位的IDA,IDA附加并设置调试选项
GO -> Debugger -> Remote ARMLinux/Android debugger
Debugger — Debugger Options
5)命令行中执行:
ddms(为了使用jdb命令)
jdb -connect com.sun.jdi.SocketAttach:hostname=127.0.0.1,port=8700
其中port=8700是从ddms中看到的。
6)、下断点
附加完成之后,会停在so模块中。此时按下Ctrl + S,弹出模块列表框,搜索so文件名。
记录下基地址。要下断点的函数加上ida静态分析时的偏移地址,得到内存中的地址,G跳转到该函数处,F2下断点。
7)、 F9运行
8)、 断下
使用F8进行单步调试,F7进行单步跳入调试。
2、dd命令直接dump内存中so的数据
1)、运行app
2)、将内存里的数据拷贝出来。
adb shell
su
ps | grep com.tyomcat.crackme 获取so的进程ID
cat /proc/(PID)/maps | grep libcrackme.so 获取so在内存中的基地址
dd if=/proc/(PID)/mem of=/sdcard/1.mem bs=1 skip=(so的基地址) count=(so文件大小)
adb pull /sdcard/1.mem
3、用kill命令杀死进程
1)、执行android_server:adb shell /data/local/tmp/android_server
2)、端口转发adb forward tcp:23946 tcp:23946
3)、运行程序
4)、ps 获取pid
5)、命令:kill -19 <pid> 可以让进程暂停
6)、IDA附加,动态调试。
二、反调试技术
1、循环检测TracePid的值,如果为0,那么代表app进程在被trace,那么就直接停止退出程序。
IDA是使用android_server在root环境下注入到被调试的进程中,那么这里用到一个技术就是Linux中的ptrace,那么Android中如果一个进程被另外一个进程ptrace了之后,在他的status文件中有一个字段:TracerPid 可以标识是被哪个进程trace了,我们可以使用命令查看我们的被调试的进行信息。
cat /proc/(PID)/status
2、执行jdb命令时报错
无法连接到目标的VM,那么这种问题大部分都出现在被调试程序不可调试,在AndroidManifest.xml添加android:debuggable属性:
回编译:java -jar apktool.jar b -d out -o debug.apk
签名apk:java -jar .\sign\signapk.jar .\sign\testkey.x509.pem .\sign\testkey.pk8 debug.apk debug.sig.apk
Android 逆向初探(二)