调试篇---安卓arm/x86平台之IDA or GDB长驱直入
最近移动比较火,许久不发帖了来一发。使用过的调试器里面用着感觉最爽的要数Windbg了,毕竟是微软是他爹调试微软系统时运行流畅,界面朴实;色彩单调;数据窗口却不失全面,当然多半操作需要命令行来操作,魅力之处就在于此了,可能liunx下用lldb/gdb调试也是这个感觉了。不足的地方就是只限定与windows平台.
所以这时候windows/android/mac全平台支持的IDA就开始派上用场了,不太明白好多人抱怨IDA不适合调试,或许这只是习惯问题吧,毕竟每个人的方法不同。唯独感觉IDA有些不便是不像windbg 可以用命令便利的对内存下任意长度的读/写断点。(IDA需要通过设置硬件读/写断点)
因为工作原因前段时间一直用IDA调试安卓arm平台设备,由于是从网上取的IDA6.6版本,只支持调试安卓4.x及以下的版本,面对5.0/6.0的设备就调不起来,(当然前几天强大的网友把6.8版本共享了,可以完美调试5.0/6.0) 当时看了看官网IDA6.8的价格找领导试探了下,结果给出的回复是”自己解决”,无奈就只能另寻方法,看网上说可以用GDB+gdbserver远程调试,于是上手操作了一下,发现GDB/IDA+gdbserver调试安卓也是很强大的,而且不受IDA版本的限制,对于安卓的arm和x86平台通吃,尽管大家很少会用到x86的设备。
对于IDA+android_server调试的方法网上一搜一箩筐这里就不做叙述了,重点介绍下GDB/IDA+gdbserver的使用。
正题一:IDA+gdbserver调试x86程序
操作环境:android_ndk+IDA6.8 +豌豆荚+有root权限x86手机
步骤
1.usb插上手机保证豌豆荚能够识别,手机首次连接电脑会安装手机驱动
2.安装待调试程序hello-jni_all.apk到手机adb install -r xxx/hello-jni_all.apk
3.cmd运行后推送ndk/prebuilt对应的arm/x86 gdbserver到手机 adb push gdbserver /data/local/tmp
4.修改可执行权限adb shell进入操作模式 su获取root权限这时$会变成#,没有root权限就不要调试了 而后进入/data/local/tmp目录chmod 755 gdbserver
5.向手机转发调试端口adb forward tcp:23946 tcp:23946
6.启动程序activity以备调试am start -D -n am start -D -n com.example.hellojni/.HelloJni
7.查看进程pid ps|grep hello为6060
8.启动gdbserver附加目标程序./gdbserver :23946 --attach 6060
9.启动IDA附加进程选择remote gdb debugger 端口保持一致为23946确定之后弹出choose process窗口选择默认项0
10.然后让程序飞起来jdb -connect com.sun.jdi.SocketAttach:hostname=127.0.0.1,port=8700
之后手机就进入了被调试状态,注意一下如果IDA附加不成功,可以停止gdbserver,重启启动目标程序记下pid,再次启动gdbserver试一下,每次重启程序时gdbserver也要跟着改attach的进程pid。进入被调试状态之后会发现,没有代码空间即便你用IDA打开的程序文件同样是断不到的,因为gdb附加程序之后进程空间是全系统空间0~0xffffffff,需要确认目标程序地址后下断。确认地址可以通过用IDA打开程序文件记下偏移地址,然后加上模块加载基地址就是真实的手机中程序地址了。
具体来看图
11.比如ibhello-jni.so目标位置是Java_com_example_hellojni_HelloJni_Test1函数偏移0x05D0
12.查看模块加载基地址cat /proc/7009/maps |grep hello 一共三条注意是带x可执行权限的f2f27000;加上偏移就是f2f275d0
13.回到IDA暂停程序后快捷键G跳转到f2f275d0地址下f2断点,F5运行程序,在手机中点击按钮,断点触发;之后就跟踪就是了
正题二:gdb+gdbserver调试x86程序
操作环境:android_ndk+gdb+豌豆荚+arm/x86有root权限手机若干
步骤1-11同上;注意这里不需要IDA可以忽略相关步骤
打开gdb 连接gdbserver调试器target remote localhost:23946 依次打开汇编指令回显set disassemble-next on 打开单步调试set step-mode on
连上之后gdbserver会显示Remote debugging from host 127.0.0.1
13.gdb执行c命令先让程序跑起来;这时候手机程序就运行起来了然后同步骤12查看模块基地址这里是0xf312f000+0x5d0=0xf312f5d0
14. Ctrl+c暂停程序后Gdb下断点使用b *0xf312f5d0(!!记住星号是必须的否则断点下不到);不放心可以用display看一下指令 display /10i 0xf312f5d0
15.单步执行n命令操起来了~ 执行的时候如果回显结果太烦人,可以用delete display去掉
hello-jni_all.apk附件
hello-jni_all.apk
说明
A 便于区分gdbserver版本可以通过重命名gdb_arm/gdb_x86来区分;
B IDA+GDBSERVER调试arm试了下貌似行不通调试起来的时候IDA汇编指令直接被现实为x86指令。
C 对于apk中只包含arm目录的程序,不要用 x86手机来调试,因为同样arm指令会被反编译为x86汇编指令,
而且即便下断点执行时,也不会触发不太清楚英特尔libhoudini.so模拟arm的机制。有了解的同志请告诉我,谢谢
另外手头有几本PC的书也用不上了,送有缘人吧,北京地区离立水桥近的朋友可以来取,附上书单 (因为0day是朋友送的,想了想还是留着吧)卫生纸也不送!!!
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
上传的附件: