如何一次为一条指令调用 IDA Pro 的 MakeCode?

逆向工程 艾达 蟒蛇 idapro插件 idapro-sdk
2021-06-14 02:24:44

我未定义一个代码块,我想通过在解码未定义字节并分别调用idc.MakeCode每个指令的同时迭代该区域来手动重建该块

我已经禁用了自动分析,但是在块的头部调用 MakeCode 会导致整个块被转换为代码。我在 IDA Python/IDC 中找不到任何不是钩子的东西。是否需要设置分析标志以防止这种行为?

2个回答

这是一个有点棘手的问题,因为从技术上讲 ,这MakeCode并不是导致其余代码被分析为代码的原因。对此的提示可能是MakeCode实际返回当前指令的长度的事实仅在稍后将附加的后续字节转换为代码(如果可能)。

事实是,为了让 IDA 做 IDA 擅长的事情(即成功反汇编大型代码库),它有自己的后台代码分析器。该代码分析器负责编排高级反汇编操作,例如找出函数从哪里开始,确保分析所有函数,尽其所能处理重叠代码等......

IDA 的代码分析器的功能之一是代码分析堆栈。该堆栈包含指向其他未探索代码的“线索”以及可能找到其他汇编代码的提示。虽然idc.MakeCode确实只将单个指令转换为代码,但它会向代码分析器注册该指令的结尾,然后代码分析器继续分析并将其余二进制代码转换为代码(只要找到有效指令)。

要禁用在后台运行的自动分析,请点击“选项”菜单和其中的“常规”功能。在对话框中选择“Analysis”选项卡并取消选中左侧标记为“Enabled”的复选框,如下图所示 禁用自动分析

有趣的事实:您可以调用idaapi.analyzer_options()以显示该对话框。您仍然需要取消选中复选框并点击“确定”按钮。不幸的是,似乎没有 API。

NirIzr 的回答有一个主要缺点:解码指令之后的所有位置仍然添加到分析器队列中,只是没有被处理。这意味着如果您再次启用分析,IDA 将返回并处理它们,完全消除您的脚本所做的一切。

更好的解决方案是在运行脚本之前进入“内核选项 1”并取消选中“跟踪执行流程”。这是负责在解码指令后立即将地址添加到分析队列的人,因此这些地址不会首先添加到队列中。脚本完成后,您可以返回并再次检查并在启用分析的情况下继续使用 IDA。