首页
论坛
课程
招聘
雪    币: 39
活跃值: 活跃值 (21)
能力值: ( LV12,RANK:330 )
在线值:
发帖
回帖
粉丝

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

2015-12-22 16:47 26799

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

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


[看雪官方培训]《安卓高级研修班(网课)》9月班开始招生!挑战极限、工资翻倍!

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

非常感谢你的回复。
雪    币: 39
活跃值: 活跃值 (21)
能力值: ( LV12,RANK:330 )
在线值:
发帖
回帖
粉丝
AJISky 活跃值 7 2015-12-31 10:05
26
0
jdb端口跟DDMS里面显示的一致就可以,这个调试的手机或者模拟器需要是x86处理器架构
雪    币: 42
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
LShang 活跃值 2016-1-6 16:07
27
0
感谢楼主分享经验,收藏了~
雪    币: 30
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
keeslient 活跃值 2016-1-6 18:10
28
0
谢谢分享
雪    币: 17
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
川美 活跃值 2016-4-9 21:40
29
0
你用模拟器调试成功了吗?
雪    币: 613
活跃值: 活跃值 (10)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
天高 活跃值 2016-4-9 22:38
30
0
mark
雪    币: 143
活跃值: 活跃值 (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
采臣·宁 活跃值 1 2016-4-10 11:13
31
0

不多说了
上传的附件:
雪    币: 12
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
miaoerst 活跃值 2016-8-23 14:08
32
0
你好, 我ida attach的时候就失败了, 提示我可能没有足够的权限, 重启了几次还是这样, 一般是为什么呢?
雪    币: 39
活跃值: 活跃值 (21)
能力值: ( LV12,RANK:330 )
在线值:
发帖
回帖
粉丝
AJISky 活跃值 7 2016-8-24 09:21
33
0
保证两点
1.确保手机已经root
2.启动android_server之前输入su进入超级模式
雪    币: 0
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
qianxiao 活跃值 2016-8-24 09:58
34
0
看看如何使用gdb调试 gdb可以源码调试么?
雪    币: 2359
活跃值: 活跃值 (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
petersonhz 活跃值 2016-11-18 02:21
35
0
0day的那本书什么名字呢
雪    币: 31
活跃值: 活跃值 (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
pkiller 活跃值 2016-11-18 17:50
36
0
请问楼主, 帖子中提到的"可以用命令便利的对内存下任意长度的读/写断点。(IDA需要通过设置硬件读/写断点)"有些疑问.  IDA具体怎么设置硬件读写断点呢?
雪    币: 39
活跃值: 活跃值 (21)
能力值: ( LV12,RANK:330 )
在线值:
发帖
回帖
粉丝
AJISky 活跃值 7 2016-11-22 15:11
37
0
硬件断点在处理器中有专门的dr0~4寄存器,arm平台没有对应硬件寄存器所以不支持硬件断点
雪    币: 4441
活跃值: 活跃值 (23)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
xunbu 活跃值 2016-11-23 15:16
38
0
请问楼主用的是x86真机还是模拟器?我gdbserver+ida(x86模拟器)ida老是卡在runing
雪    币: 39
活跃值: 活跃值 (21)
能力值: ( LV12,RANK:330 )
在线值:
发帖
回帖
粉丝
AJISky 活跃值 7 2016-11-23 15:18
39
0
自从加入正规军,就不再用模拟器了,要稳定尽量还是用真机吧。模拟器不确定性比较高
雪    币: 30
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
wgrui 活跃值 2018-6-3 22:56
40
0
感谢分享,很有用哈
雪    币: 222
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
stukd 活跃值 2018-7-27 19:20
41
0
楼主,感谢分享,我最近像学习一下安卓逆向知识,小白。看完后,运行了一下gdb和gdbserver 有几个问题想问一下,我用 am start -D -n 命令启动后 程序弹出 Application HelloJni is waiting for the debugger to attach. 后面用gdbserver attach到进程,还是没反应。然后用gdb连上后,出现了remote debugging from host 127.0.0.1.但是这时候不管在不在gdb里面运行程序 都用 cat /proc/pid/maps  看不到so库地址信息,只能看到 两个base.apk信息。 楼主不知道你还能否看到回复。。。如果有时间麻烦指教一下。万分感谢!!!
雪    币: 222
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
stukd 活跃值 2018-7-30 18:19
42
0
已经调试好了。。。IDA+gdbserver 也好了 原来gdb 下面也需要 这步 jdb -connect com.sun.jdi.SocketAttach:hostname=127.0.0.1,port=8700   。。。
游客
登录 | 注册 方可回帖
返回