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,欢迎反馈给我们以帮助我们将他开发得更加完善。
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)