首页
社区
课程
招聘
[推荐]gikdbg系列教程3.3-调试App
发表于: 2014-5-21 14:14 10705

[推荐]gikdbg系列教程3.3-调试App

2014-5-21 14:14
10705
PS:实在抱歉,插入图片太累了,只复制了文字,看图片的访问 http://gikir.com/blog/?p=88 .

void usage(void) {

printf(“原创文章,欢迎转载和引用,不过请附上原始链接( http://gikir.com/blog/?p=88 )和本申明,否则嘛,哼哼…\n”);

}

本篇文章我们将介绍如何使用gikdbg调试iOS App, 此处我们以系统计算器App为例进行Step by step的操作与解释以及一些注意事项的说明。

Step 0.前置说明

手机端:iPhone 5,iOS 7.0.4,gikir_iserver v1.1.build140520.1;

PC端:ParallelDesktop虚拟机,Windows 8.0,gikdbg v1.1.build140520.1;

Step 1.连接设备

手机端点击gikir_iserver的图标运行服务程序,PC端执行iDebug/Device/Login (USB)菜单,得到如下输出说明连接成功:

app-connect

如果在这一步出现无法连接的情况请逐一检查:

1) 是否有之前遗留的lldb.exe进程,手工杀掉然后重启gikdbg并连接;

2) 是否gikir_iserver使用的6080端口被之前遗留的gikir_iserver_root或者/bin/sh进程占用,手工杀掉或者重启设备然后重启gikir_iserver;

3) 是否有使用Apple USB驱动服务的其他程序与gikdbg冲突,手工杀掉这类程序然后重启gikdbg并连接。

连接成功后,我们可以通过iDebug/Option/Debugger选择不同的调试模式,它们的特点如下:

GDB模式—-在32位设备上调试进程的主线程或者调试指定函数时推荐使用,调试过程中的符号由gikdbg提供;

LLDB模式—-深度调试进程时推荐使用,这个模式加载时间长,LLDB可以分析它需要的一些符号信息,调试过程中的符号由gikdbg以及lldb提供;

LLDB FAST模式—-验证性的调试时推荐使用,这个模式加载时间短,调试过程中的符号由gikdbg提供。该模式相对于GDB模式增加了64位设备调试32位代码以及多线程调试的功能。

Step 2.选择App进程

在iDebug/File/Attach菜单中弹出的进程列表窗口中找到计算器进程:

app-proclist

双击或者点击Attach完成进程选择的步骤;

Step 3.确定补丁操作

如果是第一次调试该App,则会弹出如下确认对话框:

app-patch

对首次调试的App进行的补丁主要有:

1) 删除MH_PIE标志,让进程每次加载基址固定;

2) 记录App的UUID值;

3) 如果是FAT格式的App则禁用最低以及最高的架构版本;

4) 如果是加密的App则解密该App;

5) 注入调试辅助动态库gikir_iserver_injecter.dylib;

以上补丁可以通过进程列表和控制台程序列表右键的unpatch菜单去除,恢复到App补丁之前的原始状态。

如果选择取消将无法调试App,如果选择确定将执行上述补丁操作并传回整个App文件夹到$(GIKDBG)/iosapp/encrypted目录下面,解密后的App可执行文件将传回到$(GIKDBG)/iosapp/decrypted目录下面。此时可以通过ida或者gikdbg对解密后的可执行文件进行静态分析。

补丁正确执行之后会提示重启该App:

app-patch-ok

重启App后重复Step2进入Step4.

Step 4.挂接App进程

app-attaching

这一步GDB和LLDB FAST模式会比较快,LLDB模式会根据App大小和复杂程度等待2-10分钟左右;

如果长时间(5分钟以上)等待还未进入CPU主窗口,可以手工取消等待.

Step 5.进入Cpu主窗口

一切顺利的话就会进入如下CPU主界面:

app-cpumain

Step 6.选择主模块

执行iDebug/View/Module得到如下窗口:

app-modlist

选中主模块然后双击跳转到主模块CPU窗口。

Step 7.查看主模块信息

在主模块CPU窗口反汇编列表中执行鼠标右键View object以及View mach-o可以对其进行静态数据分析:

app-maininfo

Step 8.下断点调试

找到我们感兴趣的函数后F2下断点并运行,操作界面击中该断点:

app-hitbkpt

这个时候就可以调试我们感兴趣的函数了,有如下注意事项:

GDB模式—-有可能F7 F8会一直停留在有断点的地址上,这个是GDB的Bug,可以通过取消该断点再F7 F8解决;

LLDB模式—-F8无法单步步过函数调用,这个是LLDB的Bug,可以通过F4到指定地址解决。

Step 9.查看objc消息调用链

如果我们想查看该App的消息调用链,可以通过$detectobjc命令实现:

app-detectobjc

该功能在LLDB FAST模式下无法使用。如果想定制输出,可以Hook注入到调试进程中的动态库gikir_iserver_injecter.dylib中的函数:

int filter_objc_message(const char *cls,const char *sel);

cls是类名,sel是消息名,返回0表示打印输出,返回1表示忽略;

其他更多的细节,可以前往 http://gikir.com/product.php 下载使用。在使用gikdbg的过程中有任何改进意见和Bug,欢迎反馈给我们以帮助我们将他开发得更加完善。

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (7)
雪    币: 2664
活跃值: (3401)
能力值: ( LV13,RANK:1760 )
在线值:
发帖
回帖
粉丝
2
关注...
2014-5-21 14:19
0
雪    币: 245
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
app-patch 之后 , app就启动不起来了, 没办法调试.
2014-9-17 13:45
0
雪    币: 207
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
用了下,的确lldb虽然加载慢,f8单步函数就跑飞,其他的还算ok
2014-10-27 09:31
0
雪    币: 177
活跃值: (278)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
attach之后,就没响应了。另外一台机器上索性连连接设备都失败了
2015-1-22 13:53
0
雪    币: 628
活跃值: (358)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
6
先顶再看。。。
2015-1-22 15:31
0
雪    币: 188
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
赞一个,学习。
2015-1-22 15:49
0
雪    币: 32
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
赞一个,学习ing..................
2015-2-13 03:37
0
游客
登录 | 注册 方可回帖
返回
//