当 IDA pro 将值错误标记为 loc_ 时我该如何解决

逆向工程 艾达 反编译
2021-06-27 05:54:17

有时候IDA生成的伪代码让人莫名其妙

v8 = (signed int)&loc_100010; //ida
v8 = 0x100010; //actual code

当它只是一个值时,这还不错,但有时成员变量的偏移量也会以这种方式扭曲

v2 = a1 + (_DWORD)&loc_2043B90 - 33831600); //ida
v2 = a1 + 224; //actual offset

这导致了糟糕的可读性,对于数组来说更糟。有没有办法解决这个问题?

这在浮点数中经常发生

v63 = **(float **)((char *)&loc_15D9503 + 33831601)

我应该补充一下这是一个 MACH-O x86 二进制文件(如果这很重要)

1个回答

如果 IDA 认为它是该地址的代码,则会生成带有 loc_ 前缀的名称。所以现在 IDA 认为 2043B90 和 100010 有代码。

您应该转到 2043B90(在反汇编视图中),取消定义 IDA 创建的代码段并在那里创建数据结构,然后指定类型信息(Y 键),它是一个类似“int myarray[300]”的数组。这只是一个例子,你需要自己确定数据的类型。

至于loc_100010,如果你认为有文字,你也应该去地址100010取消定义那里的代码并创建一个字符串。

然后在您的函数中再次按 F5 以更新反编译器输出。

ps IDA 可能希望即使在您取消定义代码段之后保留 loc_ 名称,因此您需要删除此 loc_ 名称以使 IDA 生成新的名称。