检索 Objective-C 控制流?

逆向工程 艾达 男子气概 控制流图
2021-06-19 07:31:06

我正在学习反汇编和分析 Objective-c 二进制文件。我的一个挫折是,在 Hopper 和 IDA 中,似乎没有保留正确的交叉引用和控制流。我相信这是因为 Objective-C 的消息传递技术。

例如,这是我正在研究的一个关键基因: 在此处输入图片说明

如您所见,很难遵循。一切似乎都在消息发送时合并,几乎没有迹象表明控制流实际上是从哪里开始的。例如,我试图确定什么叫 mk。显然它是通过消息发送路由的,但是呼叫是从哪里发起的?当然,IDA 提供的交叉引用似乎停留在任何 Objective-C 函数上——这使得很难确定是谁在调用它。

我试过这个插件:https : //github.com/zynamics/objc-helper-plugin-ida

但这会导致“无事可修补”。

IDA 有帮助解决这个问题的功能吗?如果需要,我如何手动追踪?

有些人已经建议我只是通过动态分析来解决这个问题,但我更愿意了解静态分析它的正确方法。

1个回答

遗憾的是,没有现成的解决方案。即使在学术研究中,大多数解决这个问题的项目也受到严格限制。

为了能够重建控制流图,您需要有关objc_msgSend参数的所有可能值的信息,以便确定在哪个对象上调用了哪个函数。这个问题可能无法解决,但可以近似,例如使用反向切片和污点分析。

话虽如此,您应该能够使用这种方法重建良性软件中的大多数调用。根据恢复的参数,您可以插入函数存根并重定向调用以生成更具表现力的 CFG。