逆向之旅--越狱手机动态调试 App Store 应用

在逆向过程中,我们需要通过各种工具和方法分析程序,找到合适的突破点破解程序,其中最重要的分析手段是静态分析和动态调试。
静态分析是指在不运行程序的前提下进行程序分析的一种方法,一般会配合已经得到的线索和分析工具来进行分析。静态分析相关的文章比较多,工具也比较丰富,类似 Hopper Disassembler、IDA、class-dump 等,这里不再赘述。
这篇文章重点来讲下动态调试部分,如何在越狱手机上动态调试 App Store 下载的应用(以微博为例)。先列举下自己的设备情况

准备调试工具

LLDB 原理

正向开发过程中,相信没有哪个开发者会没用到过 LLDB 进行调试。
通过 Xcode 调试,实际上是把调试指令发送到手机上的 debugserver 服务端,debugserver 是专门用来连接 Mac 上的 LLDB 客户端,并接收 LLDB 所提供的命令,从而达到调试的目的。
当手机设备连接到 Mac 进行真机调试的时候,debugserver 才会被安装到 Developer/usr/bin 目录下。但是,debugserver 默认只能对自己开发的 App 进行调试,要想调试其他 App 的话,需要进行如下的工作:

获取 debugserver

首先将手机里的 debugserver 拷贝到 Mac 中,这里通过 iFunBox 进行拷贝。用 USB 线将手机连接到 Mac,打开 iFunBox,左侧边栏选中文件系统,进入目录 /Developer/usr/bin,将 debugserver 文件拖拽到 Mac 端桌面上,如下图所示

拷贝 debugserver

给 debugserver 赋予权限

在桌面新建 entitlements.plist 文件,写入以下内容:

<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
        <key>com.apple.springboard.debugapplications</key>
        <true/>
        <key>get-task-allow</key>
        <true/>
        <key>task_for_pid-allow</key>
        <true/>
        <key>run-unsigned-code</key>
        <true/>
</dict>
</plist>

使用 codesign 进行签名,命令如下:

codesign -s - --entitlements entitlements.plist -f debugserver

将 debugserver 复制回手机

通过 iFunBox 将修改好的 debugserver 拷贝到手机的 /usr/bin/ 目录下,然后就可以对从 App Store 下载的 App 进行调试了🎉🎉🎉

调试实战

准备好上述的 debugserver 之后就可以开始对从 App Store 下载的 App 进行调试了,这里以微博为例。
这里说明一下,动态调试通常是建立在静态调试的基础之上的。比如已经通过 class-dump 生成了头文件并找到了疑似的调用点,然后通过 Hopper Disassembler 反编译基本确认了这个调用点就是我们逆向的入口,那么此时就可以通过动态调试获取寄存器的值证实我们的猜测,还可以修改寄存器的值寻找可能的方法,最终达到破解的目的。
比如我们想要破解微博的登录功能(下图)

微博登录界面

我们已经通过 class-dump 和 Hopper Disassembler 找到了疑似的调用点 - [WBLoginViewController loadloginEngineWithUserName:password:],查看一下这个函数的实现:
函数反编译

先记录下函数对应的偏移地址 0x00000001014affc8(以下简称 D1),待会会用到。

LLDB 连接手机

现在就可以通过 LLDB 动态调试来验证一下我们的猜测,新建一个终端窗口(以下简称终端 A),通过 USB 线 SSH 2222 端口连接到手机,点击微博让进程运行起来,然后输入
ps aux 命令找到微博对应的进程 ID 为 798:

进程 ID

找到目标进程之后就可以通过进程 ID 进行调试了,在终端 A 输入以下命令:

debugserver *:1234 -a 798

此时微博界面会卡住,进入等待连接的状态。然后新建一个终端窗口(以下简称终端 B),输入 iproxy 1234 1234 命令进行端口转发。
新建一个终端窗口(以下简称终端 C),输入 lldb 并回车进入调试状态,然后输入以下命令连接上手机的 debugserver 服务端:

process connect connect://localhost:1234

可以看到终端 C 有下图所示的输出,代表连接成功,可以开始调试了:

LLDB 连接

终端 C 输入命令 c 然后回车让程序继续运行并响应外部事件。

打印寄存器的值

我们现在需要在函数 - [WBLoginViewController loadloginEngineWithUserName:password:] 上打一个断点好让程序执行到这个函数的时候可以断下来,那么就需要将模块的基地址加上之前说到的函数偏移地址 D1 得到函数在内存中的真实地址。在终端 C 中输入以下命令可以获取模块的基地址(以下简称 D0):

image list -o -f "Weibo"

结果如下图:


获取模块的基地址

函数在内存中的真实地址 = D0 + D1,执行以下命令对该函数下断点:

br s -a 0x00000000000b0000+0x00000001014affc8

对函数下断点

下完断点后在终端 C 中输入 c 然后回车让程序可以继续运行。
在微博上输入用户名 10010 和密码 123,点击登录按钮
输入用户名和密码

可以看到微博再次卡住,终端 C 输出了断点对应的信息:
断点

在终端 C 中用 po 命令打印出各个寄存器的值:
打印寄存器的值

参考文章:深入iOS系统底层之函数调用可知,x0、x1 分别为函数隐藏的参数 self 和 cmd,而 x2、x3、x4...分别对应函数的参数,可以看到我们输入的用户名 10010 和密码 123 都被正确打印出来了。至此,我们成功地在越狱手机上对 App Store 下载的应用进行动态调试🎉🎉🎉
接下来,我们可以用 bt 打印当前堆栈信息、通过 expression 命令修改寄存器的值等等,这些命令我们平时正向开发都有用到,可以参考文章与调试器共舞 - LLDB 的华尔兹,这里不再赘述。

结语

这是逆向之旅系列的第一篇文章,实现了用命令行动态调试第三方应用的功能。
但是我们可以发现过程比较繁杂,用到的命令也比较多,而且因为没有符号表,所以断点输出的信息很多都是没被符号化的,不够完美。接下来会撰文总结如何用熟悉的 Xcode 调试第三方应用,以及如何恢复符号表信息,从而可以在调试过程中获取更多的信息,最终达成破解的目的。


To be continued
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,390评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,821评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,632评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,170评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,033评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,098评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,511评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,204评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,479评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,572评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,341评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,893评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,171评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,486评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,676评论 2 335

推荐阅读更多精彩内容