看雪论坛
发新帖
7

调试篇---安卓arm/x86平台之IDA or GDB长驱直入

AJISky 2015-12-22 16:47 16018
调试篇---安卓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是朋友送的,想了想还是留着吧)卫生纸也不送!!!
上传的附件:
本主题帖已收到 0 次赞赏,累计¥0.00
最新回复 (38)
yingyue 2015-12-22 17:49
2
说它不适合调试,并非指 ANDROID ,主要是 X86 平台,由于 OD 太优秀,以至于 IDA debugger 犹如鸡肋
cacorothuo 2015-12-22 17:54
3
第四本不用看也知道是关于0day的那本书。第二本是经典。倒数第三本是垃圾。第一本和第四本入门不错。其余的感觉一般般
option 2015-12-22 18:01
4
有电子版的好收藏
7
AJISky 2015-12-22 18:19
5
倒数第三本垃圾中的战斗机,竟然花钱买这种书。。
猫子 2015-12-22 18:48
6
楼主好人啊,这是要找基友的节奏啊,,,,,卫生纸
小科ken 2015-12-22 20:36
7
真的好近。。。。
小菜鸟一 2015-12-23 08:07
8
这个实用   谢谢
cqzhou 2015-12-23 10:32
9
我是有缘人
1
koflfy 2015-12-23 11:31
10
我按正题一的方法,执行到第九步,IDA正常附加了,但第十步(jdb -connect com.sun.jdi.SocketAttach:hostname=127.0.0.1,port=端口号)老是提示 致命错误:无法附加到目标 VM。
请问是什么原因呢?
11
Netfairy 2015-12-23 12:47
11
这些书我都有,哈哈
2
地狱怪客 2015-12-23 13:02
12
要显示器
9
风间仁 2015-12-23 13:34
13
卫生纸送了也不要
7
AJISky 2015-12-23 14:24
14
koflfy你好,你可能没有调试过android so,我确实忽略了一步,需要打开Dalvik Debug Monitor(DDMS),不过难得这么有心。这个帖子一般用到的时候才会去看
kiyaa 2015-12-23 18:05
15
ddms要打开,app的debuggable要为true,实在不行的话都关掉再重新开始
kiyaa 2015-12-23 18:07
16
回复的时候LZ的恢复没有刷新出来..丢人了。。。。
7
AJISky 2015-12-23 18:30
17
gdbserver调试不需要改debug权限
kiyaa 2015-12-23 18:36
18
好丢人呀,快逃
hjbfa 2015-12-24 09:40
19
第四本还打码了,
倒地是啥书这么神秘??
PoetYellow 2015-12-24 17:33
20
第四本书名叫什么?
我是谁! 2015-12-25 11:21
21
windows驱动开发!可否送给我,盆友
7
AJISky 2015-12-25 13:11
22
离我近的话可以加我qq,来拿
wanglisong 2015-12-28 09:12
23
大牛用的gbgserver是用的sdk自带的还是自己编译的?
7
AJISky 2015-12-29 20:40
24
DNK里自带各个版本够用了,没自己编译过
1
koflfy 2015-12-30 16:57
25
我有打开DDMS,正常附加了,但是貌似没法调试,不知道哪里出了问题。
还有,我jdb连接的端口那里,因为我调试的是安卓模拟器,端口非8600/8700,所以我把这里的端口改成了安卓模拟器通信端口(64XXX),这应该没问题吧?

非常感谢你的回复。
7
AJISky 2015-12-31 10:05
26
jdb端口跟DDMS里面显示的一致就可以,这个调试的手机或者模拟器需要是x86处理器架构
LShang 2016-1-6 16:07
27
感谢楼主分享经验,收藏了~
keeslient 2016-1-6 18:10
28
谢谢分享
川美 2016-4-9 21:40
29
你用模拟器调试成功了吗?
天高 2016-4-9 22:38
30
mark
1
采臣·宁 2016-4-10 11:13
31

不多说了
上传的附件:
miaoerst 2016-8-23 14:08
32
你好, 我ida attach的时候就失败了, 提示我可能没有足够的权限, 重启了几次还是这样, 一般是为什么呢?
7
AJISky 2016-8-24 09:21
33
保证两点
1.确保手机已经root
2.启动android_server之前输入su进入超级模式
qianxiao 2016-8-24 09:58
34
看看如何使用gdb调试 gdb可以源码调试么?
petersonhz 2016-11-18 02:21
35
0day的那本书什么名字呢
pkiller 2016-11-18 17:50
36
请问楼主, 帖子中提到的"可以用命令便利的对内存下任意长度的读/写断点。(IDA需要通过设置硬件读/写断点)"有些疑问.  IDA具体怎么设置硬件读写断点呢?
7
AJISky 2016-11-22 15:11
37
硬件断点在处理器中有专门的dr0~4寄存器,arm平台没有对应硬件寄存器所以不支持硬件断点
xunbu 2016-11-23 15:16
38
请问楼主用的是x86真机还是模拟器?我gdbserver+ida(x86模拟器)ida老是卡在runing
7
AJISky 2016-11-23 15:18
39
自从加入正规军,就不再用模拟器了,要稳定尽量还是用真机吧。模拟器不确定性比较高
返回



©2000-2017 看雪学院 | Based on Xiuno BBS | 微信公众号:ikanxue
Time: 0.018, SQL: 14 / 京ICP备10040895号-17