我正在学习反汇编和分析Objective-C二进制文件。我的沮丧之一是在Hopper和IDA中,似乎没有保留正确的交叉引用和控制流程。我相信这是由于Objective-C的消息传递技术所致。

例如,这是我正在研究的一个关键基因:


这很难遵循。一切似乎都在消息发送时合并在一起,几乎没有指示控制流实际上从何处开始。例如,我正在尝试确定什么叫mk。显然,它是通过消息发送进行路由的,但是呼叫从何而来?当然,IDA提供的交叉引用似乎止于任何Objective-C功能-很难确定谁在调用它。

我已经尝试过该插件:https://github.com/zynamics/objc-helper-plugin-ida

,但结果是“没有补丁”。

IDA可以提供帮助吗?如果需要的话,我该如何手工查找?

有些人已经建议我通过动态分析来解决此问题,但我更希望了解静态分析的正确方法。

评论

我一直在从事一个特定目标的项目,以重建目标C控制流。调试与重构是完全不同的任务,因为调试将始终仅遵循一条可能的执行路径。

有什么公开的吗?

@Div并非总是可以使用调试器来逐步执行代码,例如,在针对没有越狱功能的iOS版本分析系统框架时。

#1 楼

可悲的是,没有现成的解决方案。即使在学术研究中,大多数解决此问题的项目也受到严格限制。在哪个对象上调用哪个函数。这个问题可能无法解决,但可以近似解决,例如使用向后切片和污点分析。根据恢复的参数,可以插入函数存根并重定向调用,以生成更具表现力的CFG。

评论


根据我的经验,在反汇编的objc代码中:99.99%的时间中,特定objc_msgSend调用的self和_cmd参数始终相同,并且不依赖于当时的控制流。实际上,大多数情况下,选择器会在objc_msgSend调用之前加载到x1中。我不明白为什么至少在很多时候(即使不是全部)都很难做到这一点。

–布伦南·文森特(Brennan Vincent)
16-10-16在6:06

只需玩一些心理游戏,我相信您会找到很多例子,为什么无论如何都不可能做到这一点。只是问问自己,如果您试图混淆这些电话,您会怎么做。没有任何魔力...在Objective-C之前就存在指针混淆和混淆。大部分逆向工程与良性软件无关。

–诺德瓦尔德
16-10-17在5:36