我尚未定义一个代码块,我想通过遍历该区域同时解码未定义的字节并分别为每条指令调用idc.MakeCode来手动重建此块。块头上的“”导致整个块被转换为代码。我无法在IDA Python / IDC中找到任何可以实现的目标。我是否需要设置分析标记以防止此行为?

评论

您正在使用哪个处理器?

我在IDA中使用MetaPC目标处理器。我正在分析x64二进制文件。

如果这是某种练习,请改用一些简单的线性反汇编程序,例如radare :)

#1 楼

这是一个棘手的问题,因为从技术上讲MakeCode并不是导致其余代码被分析为代码的原因。这可能是因为MakeCode实际上返回了当前指令的长度。直到后来,其他的后续字节才被转换为代码(如果可能的话)。

事情是IDA要做IDA擅长的事情(即成功地分解大型代码库)。有自己的后台代码分析器。该代码分析器负责协调高级反汇编操作,例如弄清楚函数从何处开始,确保分析所有函数,尽力处理重叠代码等。 IDA代码分析器的功能之一就是代码分析堆栈。该堆栈包含指向其他未开发代码的“线索”,并提示可能在何处找到其他汇编代码。尽管idc.MakeCode实际上仅将一条指令转换为代码,但它在代码分析器中注册了该指令的末尾,然后代码分析器继续进行分析,并将其余的二进制代码转换为代码(只要找到有效的指令)。 >
要禁用在后台运行的自动分析,请单击“选项”菜单及其中的“常规”功能。在对话框中,选择“分析”选项卡,然后取消选中左侧标记为“启用”的复选框,如下图所示。


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

#2 楼

NirIzr的答案有一个主要缺点:解码指令之后的所有那些位置仍被添加到分析器队列中,只是不被处理。这意味着,如果您再次启用分析功能,IDA将返回并对其进行处理,从而完全消除了脚本所做的任何事情。

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