首页
社区
课程
招聘
调试篇---安卓arm/x86平台之IDA or GDB长驱直入
发表于: 2015-12-22 16:47 33008

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

2015-12-22 16:47
33008

调试篇---安卓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是朋友送的,想了想还是留着吧)卫生纸也不送!!!


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 3
支持
分享
最新回复 (41)
雪    币: 1844
活跃值: (35)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
2
说它不适合调试,并非指 ANDROID ,主要是 X86 平台,由于 OD 太优秀,以至于 IDA debugger 犹如鸡肋
2015-12-22 17:49
0
雪    币: 188
活跃值: (167)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
3
第四本不用看也知道是关于0day的那本书。第二本是经典。倒数第三本是垃圾。第一本和第四本入门不错。其余的感觉一般般
2015-12-22 17:54
0
雪    币: 8201
活跃值: (2701)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
有电子版的好收藏
2015-12-22 18:01
0
雪    币: 269
活跃值: (906)
能力值: ( LV12,RANK:345 )
在线值:
发帖
回帖
粉丝
5
倒数第三本垃圾中的战斗机,竟然花钱买这种书。。
2015-12-22 18:19
0
雪    币: 440
活跃值: (1163)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
6
楼主好人啊,这是要找基友的节奏啊,,,,,卫生纸
2015-12-22 18:48
0
雪    币: 42
活跃值: (196)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
真的好近。。。。
2015-12-22 20:36
0
雪    币: 1140
活跃值: (4217)
能力值: ( LV5,RANK:69 )
在线值:
发帖
回帖
粉丝
8
这个实用   谢谢
2015-12-23 08:07
0
雪    币: 4522
活跃值: (2146)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
9
我是有缘人
2015-12-23 10:32
0
雪    币: 102
活跃值: (2050)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
10
我按正题一的方法,执行到第九步,IDA正常附加了,但第十步(jdb -connect com.sun.jdi.SocketAttach:hostname=127.0.0.1,port=端口号)老是提示 致命错误:无法附加到目标 VM。
请问是什么原因呢?
2015-12-23 11:31
0
雪    币: 191
活跃值: (848)
能力值: ( LV12,RANK:530 )
在线值:
发帖
回帖
粉丝
11
这些书我都有,哈哈
2015-12-23 12:47
0
雪    币: 341
活跃值: (143)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
12
要显示器
2015-12-23 13:02
0
雪    币: 29235
活跃值: (7759)
能力值: ( LV15,RANK:3306 )
在线值:
发帖
回帖
粉丝
13
卫生纸送了也不要
2015-12-23 13:34
0
雪    币: 269
活跃值: (906)
能力值: ( LV12,RANK:345 )
在线值:
发帖
回帖
粉丝
14
koflfy你好,你可能没有调试过android so,我确实忽略了一步,需要打开Dalvik Debug Monitor(DDMS),不过难得这么有心。这个帖子一般用到的时候才会去看
2015-12-23 14:24
0
雪    币: 3593
活跃值: (774)
能力值: ( LV4,RANK:45 )
在线值:
发帖
回帖
粉丝
15
ddms要打开,app的debuggable要为true,实在不行的话都关掉再重新开始
2015-12-23 18:05
0
雪    币: 3593
活跃值: (774)
能力值: ( LV4,RANK:45 )
在线值:
发帖
回帖
粉丝
16
回复的时候LZ的恢复没有刷新出来..丢人了。。。。
2015-12-23 18:07
0
雪    币: 269
活跃值: (906)
能力值: ( LV12,RANK:345 )
在线值:
发帖
回帖
粉丝
17
gdbserver调试不需要改debug权限
2015-12-23 18:30
0
雪    币: 3593
活跃值: (774)
能力值: ( LV4,RANK:45 )
在线值:
发帖
回帖
粉丝
18
好丢人呀,快逃
2015-12-23 18:36
0
雪    币: 153
活跃值: (260)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
19
第四本还打码了,
倒地是啥书这么神秘??
2015-12-24 09:40
0
雪    币: 24
活跃值: (39)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
20
第四本书名叫什么?
2015-12-24 17:33
0
雪    币: 115
活跃值: (23)
能力值: (RANK:20 )
在线值:
发帖
回帖
粉丝
21
windows驱动开发!可否送给我,盆友
2015-12-25 11:21
0
雪    币: 269
活跃值: (906)
能力值: ( LV12,RANK:345 )
在线值:
发帖
回帖
粉丝
22
离我近的话可以加我qq,来拿
2015-12-25 13:11
0
雪    币: 83
活跃值: (319)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
大牛用的gbgserver是用的sdk自带的还是自己编译的?
2015-12-28 09:12
0
雪    币: 269
活跃值: (906)
能力值: ( LV12,RANK:345 )
在线值:
发帖
回帖
粉丝
24
DNK里自带各个版本够用了,没自己编译过
2015-12-29 20:40
0
雪    币: 102
活跃值: (2050)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
25
我有打开DDMS,正常附加了,但是貌似没法调试,不知道哪里出了问题。
还有,我jdb连接的端口那里,因为我调试的是安卓模拟器,端口非8600/8700,所以我把这里的端口改成了安卓模拟器通信端口(64XXX),这应该没问题吧?

非常感谢你的回复。
2015-12-30 16:57
0
游客
登录 | 注册 方可回帖
返回
//