首页
论坛
专栏
课程

[原创]IDA + GDBServer实现iPhone程序远程调试

2011-8-9 09:32 206948

[原创]IDA + GDBServer实现iPhone程序远程调试

obaby
18
2011-8-9 09:32
206948
IDA + GDBServer实现iPhone程序远程调试

By:obaby

在早期的IDA中包含了一个iphoneserver的程序,这个程序就是配合IDA实现远程调试的。但是在最新版的IDA中这个东西已经不复存在了,因而下载的破解版的IDA中没有那个文件并不是被删除掉了,而是本来就没有,*^_^*。所以一直以来调试iPhone上的二进制程序只能悲催的使用ssh+gdb进行调试,虽然调试器的功能还算可以,但是每次调试都需要设置显示,只能使用命令进行控制,因而用起来还是不是十分爽。
其实网上关于IDA实现ios设备远程调试的文章从网上也是可以找到的,但是说的都不是十分具体。本文主要是介绍下IDA实现远程iPhone程序调试的方法,当然这样调试还存在一些问题,如果大家有什么好的解决方案还请不吝赐教。
需要注意的是要想调试ios设备上的程序并不是简单的吧gdbserver拷贝到ios设备上行就可以了,此时如果使用gdbserver启动进程将得到类似如图1所示的提示信息:

图1
提示文件没有找到,但是如果设备曾经链接过xcode进行过程序调试则不会出现下面的情况。这是因为xcode在进行程序调试的时候会将所需要的文件拷贝到Develop目录下,这样的话不论gdbserver在哪个目录下程序都是可以正常执行的。同样在上面的命令中看到的debugserver是苹果自己编译的一个gdbserver调试服务器,而实际使用则基本是没有任何的差异和影响的。
首先来配置下设备上的调试环境,从xcode的/Developer/Platforms/iPhoneOS.platform/DeviceSupport/3.2目录下找到DeveloperDiskImage.dmg文件,而3.2则是对应的ios设备上的系统版本,在DeviceSupport目录下通常会包含如如2所示的版本列表:

图02
在实际的调试过程中只需要选择相应的版本就可以了。在每个目录下都存在一个DeveloperDiskImage.dmg文件,用ultraiso打开这个文件可以看到如图3的文件目录列表:

图3
在调试的过程中需要将整个dmg文件下的所有目录和文件拷贝到设备上的/Developer目录下,如图4所示。这一步可以使用ios的文件管理工具,或者使用winscp上传文件,不建议使用后者,太卡了~,如果使用过xcode开发调试过程序那么这个目录下的所有东西应该都是存在的,可以无需手工复制。

图4
另外还需要在设备上安装ssh服务端,这个直接从cydia源中安装即可。最后就是程序的调试了。
在这里的调试可以使用预先分析文件和直接attach的方式进行调试。直接attach的方式比较简单一些,使用ssh客户端连接到设备(需要无线网络支持,如果木有,那我也冇办法哦~),在win下可以使用putty。
登录后默认会在root目录下,如图5所示。

切换到/Develop/usr/bin/目录下,给debugserver增加执行权限,如图6所示。

图6
现在就可以执行一个程序了,以AppleAssistantHD为例,执行./debugserver port:2008 /var/mobile/Applications/ABDEE3BA-02BE-4251-A57B-ECC363813133/AppleAssistantHD.app/AppleAssistantHD,此时debugserver会执行目标程序并且同时打开一个端口监听远程连接,如图7所示

图7
现在就可以运行ida链接远程调试器了。执行ida直接点go进入到程序界面即可,如图8所示。

图8
进入之后点击菜单的Debugger->Attach->Remote GdbDebuger,如图9所示

执行之后将会打开如图10所示的调试器附加窗口。

图10
在Hostname中输入设备的ip,port中输入debugserver的监听端口。点击Debug options打开调试选项,如图11所示。

图11
执行Edit exceptions打开异常处理选项窗口,如图12所示。

图12
编辑11号异常,去掉stop program的勾,如图13,否则在调试的过程中会非常的痛苦。

图13
关闭所有的设置窗口,现在就可以进行附加了,点击ok之后将会弹出如图14所示的进程列表。

图14
选择进程id为0的进程进行附加,如果成功将会弹出如图15所示的窗口。

图15
现在就可以进行调试了,如图16所示。

图16
上面的是直接attach的方法,这种方法能看到的只有内存数据,所以在实际的调试中并不是最好的方法。另外一种方式是直接用ida载入文件之后采用链接远程调试器的方式。首先将调试器设置为Remote gdb debuger然后编辑ida的Debug application setup:gdb设置,如图17所示:

图17
在application和input file中输入设备上的文件的绝对路径,其余的设置与attach的方式是完全一致的。设置完成之后就可以启动调试器了,此时会提示已经有远程进程在被调试,是否附加到,如图18.

图18
点击yes之后就可以进行调试了,如果附加成功将会弹出提示信息。这样调试的时候代码看起来还是比较清晰的,如图19

图19
虽然现在可以调试了,但是还有几个问题。也是我现在没有处理掉的:
1.        在静态分析的时候设置的断点会变为无效,如图20所示;

图20
2.        一旦将进程挂起之后重启启动进程已经卡死了,没有任何的响应。
由于上面的两个问题导致现在ida虽然可以附加到进程或者启动独立的进程进行调试,但是实际的效果并不理想。明显是一锤子买卖,一旦暂停就完全死翘翘了,这也就是在文章开始处提到的那个问题。所以对于上面的两个问题哪位大大有好的解决办法还望不吝赐教。
Pdf版本下载: IDA +DbgServer.pdf

[推荐]看雪企服平台,提供安全分析、定制项目开发、APP等级保护、渗透测试等安全服务!

上传的附件:
上一主题 下一主题
最新回复 (66)
yjd 2011-8-9 09:50
2
0

这个强。
yingyue 2011-8-9 09:53
3
0
翻译辛苦了,每帖必顶
obaby 18 2011-8-9 10:34
4
0
话说俺的这个不是翻译滴
才情岁月 2011-8-9 10:46
5
0
学习了!辛苦了!
OnlyLoveMM 2011-8-9 14:11
6
0
正是我所想要的东西。感谢楼主,感谢看雪论坛。感谢党国。
pmma 1 2011-8-9 14:52
7
0
找了很久了,zhiweili大侠讲的模棱两可,俺很蛋疼啊,我在第一步就卡住了,一直没搞定,郁闷
OnlyLoveMM 2011-8-9 15:35
8
0
请问一下楼主,我的设备是4.3.3的iOS。没发现这个版本的。你能不能给我传一个?
快雪时晴 4 2011-8-9 15:46
9
0
我越来越感觉心力不遂跟不上时代脚步了
obaby 18 2011-8-9 16:21
10
0
主版本号对应就可以啦。没有那么细的~
OnlyLoveMM 2011-8-9 17:27
11
0
-iPad:/Developer/usr/bin root# ./debugserver port:2008 /var/mobile/Applications/4598434B-0EDE-459C-B2CD-749D6C019B83/QQGame-iPad.app/QQGame-iPad
debugserver-50 for armv6 Copyright (c) 2007-2009 Apple, Inc.  All Rights Reserved.
error: failed to launch process /var/mobile/Applications/4598434B-0EDE-459C-B2CD-749D6C019B83/QQGame-iPad.app/QQGame-iPad: failed to get the task for process 146
OnlyLoveMM 2011-8-9 17:28
12
0
按楼主的方法,先在设备上运行这个gdb的服务。出如上问题呢。
obaby 18 2011-8-9 17:44
13
0
的确有的进程会出现这样的问题,至于为什么目前我也不太清楚~
OnlyLoveMM 2011-8-9 20:23
14
0
楼主说一下你的具体的环境?设备、iOS版本等?
OnlyLoveMM 2011-8-9 20:39
15
0
不是有的进程会出现这样的问题,在我的设备上是所有的进程都出现这个问题。我估计是debugserver与iOS版本不对应的原因。
pmma 1 2011-8-9 21:19
16
0
attach的时候,我也遇到这个问题 failed to get the task for process 146,app先运行,3秒以后退出,attach失败。
ida直接load文件的时候,没找到远程debugger的设置部分,参考mobile和mac的调试设置,链接失败,郁闷中,提示

---------------------------
Warning
---------------------------
The file can't be loaded by the debugger plugin.
Please verify that the parameters are valid.
---------------------------
OK   
---------------------------

默认的短信app,不需要设置啥参数的吧?
pmma 1 2011-8-9 21:21
17
0
请教楼主。

另外一种方式是直接用ida载入文件之后采用链接远程调试器的方式。首先将调试器设置为Remote gdb debuger然后编。。。

载入文件以后,如何将调试器设置为Remote gdb debuger?

载入文件,链接iphone的远程debugger的话,putty端的命令行是写./debugserver port:2008 /var/mobile/Applications/ABDEE3BA-02BE-4251-A57B-ECC363813133/AppleAssistantHD.app/AppleAssistantHD还是./debugserver port:2008?

我这边无论哪种模式都失败,蛋疼中。。。。期待楼主解惑

备注:俺的debugserver是xcode自己装的,应该不存在什么蛋疼的问题,我的iphone是用红雪越狱的,不知道那个带命令行的调试错误是不是和越狱有关?
yangya 2011-8-9 22:03
18
0
mark!!!
可爱的雨 2011-8-10 01:04
19
0
看到国产越狱和解锁的希望了~
djxh 2011-8-10 04:26
20
0
以后用得着,支持一下楼主~
OnlyLoveMM 2011-8-10 09:48
21
0
能否说一下,iOS和xcode各是什么版本?我得自己复制过去的。
pmma 1 2011-8-10 13:07
22
0
ios 433,xcode 326
hacker一疒亻 2011-8-10 22:28
23
0
你这篇文章贡献了! 真的!!!  
最近刚刚看来到一个关于智能手机病毒的消息,可以实现信息的窃取……貌似太狠了吧,哈哈。
有没有谁有样本可以来一个呢?

我不知道这个病毒的名字,只知道这个地址里有介绍:http://www.shxb.net/html/20110809/20110809_287693.shtml
=======有相信是正常网址的朋友可以掠过了,只当知道有这么个事儿============
龙岱客 2011-10-1 11:14
24
0
同样failed to get the task for process
网上查了一翻,好像和签名有关,Entitlements.plist、get-task-allow set to YES,看了zhiweili大侠的,说要给debugserver打补丁,,没环境没法研究
紫色的魚 2011-10-2 21:54
25
0
收藏一下,谢谢楼主。
geekchi 2012-2-15 20:38
26
0
看得一头雾水啊
救世猪 1 2012-5-4 02:15
27
0
收藏!。。。
wawt 2012-7-27 00:07
28
0
太难了!没看懂!
a圣a 2012-8-16 14:15
29
0
只是路过学习一下,越高深我就越蛋疼...
pendan2001 4 2012-8-17 20:25
30
0
辛苦了。呵呵。
hackbozy 2012-9-5 00:02
31
0
学习了,标记下
enjon 2012-9-20 00:04
32
0
楼主好牛X
waruqi 3 2012-11-29 11:06
33
0
不错。。不过我还是习惯 在ios  放个gdb。。直接调试。。= =
vbcs 2 2012-12-17 11:09
34
0
写了这么多,楼主辛苦了。有时间搞一下,看看比GDB会不会好用
waruqi 3 2013-3-29 15:04
35
0
这个是因为调试的app 没有 get-task 权限。。得在app加上  Entitlements.plist 的签名才行:

codesign -f -s "iPhone Developer" --entitlements Entitlements.plist demo.app

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>get-task-allow</key>
    <true/>
</dict>
</plist>
shangrila 2013-4-5 22:47
36
0
学习了,谢谢~~
airbus 2013-5-3 11:26
37
0
可以用91助手来加载那个 /Developer
dalao 1 2013-5-22 14:37
38
0
有谁成功过没有!测试了一下无效!
曾半仙 9 2013-5-23 00:35
39
0
并非暂停后不正常, 而是那个debugserver一直在后面输出未知协议的提示. IDA前面没认为自己流程错了.
用xcode或者sdk里的client可以远程调试
hero3000 2013-7-2 09:57
40
0
收藏,活到老学到老
fanliugen 2013-7-2 13:47
41
0
先回帖再学习
ztxbeyond 2013-9-20 11:49
42
0
请问,attach成功以后,弹出个框框,标题是please wait,内容是running,这要等多久啊,好像一个多小时了还没结束。。什么都不能操作
kyyix 2013-9-20 11:56
43
0
牛人啊大神啊。。
kgxxx 2014-2-12 14:55
44
0
之前武腾辉同学说可以不用无线 直接pp助手开个端口连接usb调试的,上次我用gdb调试也是一锤子买卖,断点不好使,是不是gdb版本问题?
RegKiller 10 2014-3-13 03:06
45
0
求个 IOS 7.X 版本的 DeveloperDiskImage.dmg 提取版
obaby 18 2014-3-13 09:31
46
0
http://pan.baidu.com/share/link?shareid=1249780344&uk=3188888025
RegKiller 10 2014-3-13 21:40
47
0
Thanks
RegKiller 10 2014-3-14 03:02
48
0
貌似7X的不能监听了.难道不支持无线调试.只支持USB模式了?
obaby 18 2014-3-14 09:36
49
0
我的目前还是6.1.2没升,找时间看看~
exediy 1 2014-3-15 17:31
50
0
USB模式怎么调试!?
游客
登录 | 注册 方可回帖
返回