例如,这是我正在研究的一个关键基因:
这很难遵循。一切似乎都在消息发送时合并在一起,几乎没有指示控制流实际上从何处开始。例如,我正在尝试确定什么叫mk。显然,它是通过消息发送进行路由的,但是呼叫从何而来?当然,IDA提供的交叉引用似乎止于任何Objective-C功能-很难确定谁在调用它。
我已经尝试过该插件:https://github.com/zynamics/objc-helper-plugin-ida
,但结果是“没有补丁”。
IDA可以提供帮助吗?如果需要的话,我该如何手工查找?
有些人已经建议我通过动态分析来解决此问题,但我更希望了解静态分析的正确方法。
#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
评论
我一直在从事一个特定目标的项目,以重建目标C控制流。调试与重构是完全不同的任务,因为调试将始终仅遵循一条可能的执行路径。有什么公开的吗?
@Div并非总是可以使用调试器来逐步执行代码,例如,在针对没有越狱功能的iOS版本分析系统框架时。