阅读目录
IOS平台GDB动态调试介绍
发布于:2016-4-26 11:40 | 193552次阅读 作者: 管理员 | 原作者: TP | 来自: 原创
1. IOS越狱开发环境搭建 1.1 Xcode下载 搭建越狱开发环境前,首先要下载Xcode开发工具,Xcode 是运行在操作系统Mac OS X上的集成开发工具(IDE),由苹果公司开发。我们可以直接在APP STORE中搜索Xcode来下载该app,若网络连接不畅,可以通过腾讯bugly平台的镜像资源链接下载 。值得注意的是,Xcode最新版本对操作系统有最低的版本要求,比如Xcode7.2版本就要求操作系统版本高于OS X 10.10.5。 1.2 安装TheOS 接下来安装越狱开发工具IOSOpenDev,不过在此之前需要先安装TheOS工具包,Theos大幅简化了编写越狱程序的流程,IOSOpenDev正是基于TheOS。TheOS安装步骤可以参考这篇文档: 1.2.1 打开Terminal,设置环境变量: export THEOS=/opt/theos 1.2.2 接着,从网上下载最新的TheOS版本: sudo svn co http://svn.howett.net/svn/theos/trunk $THEOS 1.2.3 输入密码回车,等待自动下载完成 1.2.4 安装ldid,命令如下: sudo curl -s http://dl.dropbox.com/u/3157793/ldid > /tmp/ldid sudo cp /tmp/ldid $THEOS/bin/ sudo chmod +x $THEOS/bin/ldid rm /tmp/ldid 1.3 安装IOSOpenDev 最后,从IOSOpenDev官网下载安装包即可,地址为http://iosopendev.com/download/。此处我们下载的版本为1.6-2,点击安装的过程中可能会失败,原因是Xcode7以上的版本在文件夹中缺少一些文件,下载这些文件并复制到相应目录即可,下载地址可以从这个网页下载,目录: 将Specifications1文件夹重命名为Specifications放到/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/ 将Specifications2文件夹重命名为Specifications放到/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/Library/Xcode/ 将usr3重命名为usr放到/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/ 2. IOS调试环境搭建 2.1 openSSH、GNU Debugger、adv-cmds下载 2.1.1 openSSH 通过openSSH工具,我们可以用命令行的方式访问远程终端,方法是在越狱后的ios设备cydia中搜索openSSH直接进行安装。安装完毕后打开Mac的命令行(windows平台下可以使用putty工具),随后查看自己ios设备的ip地址(如这次我的ip地址为10.66.213.47),打开命令行输入如下命令: ssh root@10.66.213.47 接下来输入密码,初始密码为alpine,随后可以输入passwd来修改该密码。 2.1.2 GNU Debugger 在越狱ios设备的cydia中添加源cydia.radare.org,随后搜索GNU Debugger,下载并安装即可。 2.1.3 adv-cmds 在越狱ios设备的cydia中添加源apt.saurik.com,随后搜索adv-cmds,下载并安装即可。 2.2 Clutch下载和使用 Clutch是一款命令行破解工具,之前可以通过cydia下载该工具,但现在cydia已不提供支持,我们可以通过github直接下载该工具。下载完后利用91助手等工具将下载好的Cluntch文件复制到ios设备的/bin文件夹下,此时我们即可从命令行使用Clutch工具。 Clutch工具使用比较简单,首先在PC端输入ssh命令访问自己的ios终端,随后输入Clutch,便可输出已安装的app;随后使用Clutch -d [ID]命令即可解密app文件至手机目录;随后利用91助手等工具在目录下查看解密后的ipa文件,如我自己的手机环境破解后的文件就在/User/Documents/Dumped目录。得到解密后的ipa文件后就能利用ida等逆向工具对其进行逆向分析。
2.3 gdb调试常用指令 2.3.1 获取进程pid 所有的环境配置好后即可开始使用gdb调试,首先用ssh连接到自己的ios设备,随后使用ps -ax命令得到当前运行进程的pid,在列表中找到要调试的程序pid。具体的结果如下图所示:
2.3.2 附加到进程 随后便可使用gdb调试进程。命令为gdb -p [pid],等待命令行出现...in mach_msg_trap()时即可开始调试,此时程序会中断。 比如我们看到的pid为242,则输入gdb -p 242,则会出现如下信息。
2.3.3 遍历模块 我们在ida中逆向分析,想对某一地址下断点分析时,需要知道其实际运行的地址,比如某游戏中的注册接口代码如下:
我们想将断点断在0x007BDA00处,要得到其实际运行时的地址,得遍历程序加载的模块基址,命令为info sh,在列表中可以找到要分析的模块地址,值得注意的是,列表中有两个地址,其中括号内的offset为实际的模块基址,接下来只需将该基址加上0x007BDA00即可。比如在测试环境下,其基址如下图所示: 因此实际的断点地址为0x007BDA00加上基址0x47000得到0x804A00。 2.3.4 断点操作 接下来我们就可以根据计算得到的断点地址下断点,命令为b [method name]或者b *[address],前者是在知道方法名的情况下对该方法下断点,后者是直接在具体的地址下断点。 下完断点后可以使用info b命令来查看当前存在的所有断点和其状态。 同时,如果不确定下的断点对不对可以利用x/ 10ih [address]命令来查看其反汇编代码,将该代码与ida中的相应代码作对比即可确认(更多查看内存和寄存器的指令可以参见下一小结): 通过对比发现断点处反汇编出的代码和上面ida中列举的目标地址的代码一样,因此可以确认断点正确。 此外还可利用delete/disable/enable [breakID] 删除/取消/激活 断点。breakID为在info b中的断点号。 下好断点后我们即可输入continue命令让程序继续执行,程序执行到断点时会停下,此时我们便可对当前的内存和寄存器进行分析或修改。另外,也可以使用nexti 和stepi 命令进行单步补过和单步步入调试(相当于od的F8和F7)。
2.3.5 查看、修改寄存器和内存 程序在相应断点断下后,我们便可对当前的环境进行内存和寄存器的查看和修改。查看寄存器信息可以直接使用info reg命令:
我们也可以使用p命令打印特定的变量: 查看内存我们使用x命令x /nfu 0x 修改内存和寄存器使用set命令set *ADDRESS=VALUE以及set $REGISTER=VALUE,值得注意的是,修改寄存器的值在寄存器编号前要加上$。比如要设置0x17d54eb0的值为0,我们可以使用set *0x17d54eb0=0命令;要设置r1寄存器的值为1,我们可以使用set $r0=1命令:
2.3.6 dump内存 我们也可以查看当前程序的汇编代码。其命令如下: (gdb) disassemble START,END (gdb) disassemble START,+LENGTH 有两种格式,第一种指定要查看代码的地址范围,从START开始到END结束;第二种是指定从START开始的LENGTH条汇编代码。 同时也可以使用gdb的dump命令将某段内存dump到文件中,命令格式如下:dump binary [File] [start_addr] [end_addr]。其中第一个字段File为目标文件路径,后面两个字段指要dump的内存起始地址和结束地址。
以上便是游戏分析过程中常用的gdb调试命令,更多gdb相关的命令和使用可以参考这篇文档。 |
最新评论
发表评论