Recon Montreal 2018
(译者按:原文来自于一个安全会议上的演讲PPT,有疑问处请直接访问这里)
Instruments是一个由苹果开发的调试工具集
– 时间分析
– 泄露检测
– 追踪文件I/O操作
所有的这些任务都能在iOS上运行
为此,苹果实现了一个服务器,该服务器旨在为在OSX上运行的Instruments前端提供iOS调试统计数据
这个服务器简直就是我们所有想要的有用信息的宝库
不管怎么说,我们会和iOS的一个内部进程通信(通常在iOS上被禁止)
MobileDevice.framework提供了OSX上应用和iOS上进程通信的能力,也就是 “Services”
这是IDA和iOS debugserver通信的方式
$ hdiutil mount DeveloperDiskImage.dmg
– com.apple.debugserver.plist
– com.apple.instruments.remoteserver.plist
– com.apple.instruments.deviceservice.plist
浏览 Xcode IDE 二进制文件, 我们在 IDEiPhoneSupport 中发现了这一点:
这个关键的代码块实际上是一个反编译的block函数。原始源代码可能类似于:
结论: DTXMessage 是一种通过网络传输Objective-C消息的机制。这允许进程在另一个进程中有效地 "调用" 给定的方法 (可以在完全独立的设备上运行)
现在怎么办?
可以从反汇编中逆向工程序列化Objective-C消息的, 但这是一个艰难的战斗
即使我们完全理解消息序列化, 它仍然没有把故事讲完整。如果服务器只响应特定的消息序列, 该怎么办?
另一种方法是获取通过导线传输的原始数据的样本。静态 + 方法动态获取的成功几率更高。
再次, iOS 调试器的救援!
特别设置的断点将允许我们记录服务器收到的每个序列化消息:
我开发了一个 IDA 插件自动记录消息
https://github.com/troybowman/dtxmsg
插件使用反汇编的微代码检测在内存中序列化消息的位置和时间, 并将字节转储到文件
更多关于微码, 详见Ilfak在Recon Brussels 2018的谈话
该插件还可以反序列化每个截获的消息, 并以纯文本的形式将有效负载打印到文件中 (稍后再详细介绍)
它看起来像是使用 NSKeyedArchiver 序列化方法选择器, 但是方法参数呢?
runningProcesses 不接受任何参数, 所以让我们看一个不同的消息:
真相正在浮出水面, 但仍然有一个缺失的链接: 消息接收器。谁来决定接收邮件的对象?
记得, 我们注意到这样的东西在 Xcode:
-[DTXConnection makeChannelWithIdentifier:] 似乎确定消息接收器。这个方法做了什么?请注意, 我们捕获了此消息:
让我们总结一下:
在查询进程列表时, Xcode 向仪器发送了5条消息
服务器:
请记住, 我们的目标是独立地与服务器通信, 而无需 Apple 代码的帮助。
我们对序列化消息的理解必须是完美的
幸好我们已经有了很多线索
IDA 在这里是无价之宝。我们可以积极改进反编译迄今为止我们已经找到了的所有关键方法。
反编译产生一些重要的结构体:
我们终于准备好开始自己发送消息了
独立应用程序 (dtxmsg_client) 也包含在 dtxmsg 插件源中。
此应用程序能够调用 runningProcesses 方法, 检索其返回值, 并以纯文本形式打印它
目标完成!
此应用程序的源代码可供参考
我们还有其他一些可能感兴趣的方法:
dtxmsg_client 可以调用所有这些方法
它们提供了对如何处理复杂方法参数和返回值的更多了解
Instruments服务器负责的不仅仅是简单的进程控制
DTXMessage 也被其他 iOS 开发工具使用
希望这只是个开始!
谢谢大家赏脸!
原文:https://github.com/troybowman/dtxmsg/blob/master/slides.pdf
翻译:daemond【看雪翻译小组】
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课