为什么IDA Pro会生成这种代码(把宏名和变量名弄乱了)?

逆向工程 艾达 拆卸 部件 纳姆
2021-07-03 13:39:44

我使用IDA Pro 6.1反汇编ELF文件,该文件是在32位Linux上编译的,gcc 4.6.3

我修改了代码并尝试重新组装,在这里发现了一个问题(这是IDA Pro直接创建的):

main    proc near
......
mov     dword ptr [esp+4], offset msgid
......
......
foo     proc near
msgid   =  dword ptr -18d
......
mov     [esp+1Ch+msgid], 1

section .rodata
msgid           db 'extra operand %s',0

所以如果我做一些修改工作和组装它使用nasm,它会产生这个错误:

error: label or instruction expected at start of line 

定位在这条线上:

msgid           db 'extra operand %s',0

如果我像这样修改它:

main    proc near
......
mov     dword ptr [esp+4], offset msgid111
......
......
foo     proc near
msgid   =  dword ptr -18d
......
mov     [esp+1Ch+msgid], 1

section .rodata
msgid111           db 'extra operand %s',0

那么这部分就没有错误了。

所以我的问题是:

  1. 为什么 IDA Pro 会使用变量名作为宏名?
  2. 有没有比修改变量名更好的方法来绕过这个错误?

谢谢!

1个回答
  1. 如果您以某种方式重命名,IDA 将使用此变量名称。这个变量名对于函数来说是局部的,因为它是一个堆栈偏移量。

  2. 没有比修改名称更好的方法了。您可以通过编写脚本来解决这种特定类型的错误,该脚本.rodata通过将g_前缀应用于其中的任何对象来重命名部分中的任何内容。

代码如下所示:

#Use carefully, I didn't check this code
#beware errors

import idautils
import idc

prefixes = {".rodata": "g_ro_",
            ".data": "g_"}

#Passing over all non default names
for (ea, name) in idautils.Names():
    seg_name = idc.SegName(ea)
    # if the name is in required segment
    if seg_name in prefixes:
        if not name.startswith(prefixes[seg_name]):
            # renaming it by adding required prefix
            # if the prefix is not added yet
            name = prefixes[seg_name] + name
            idc.MakeName(ea, name)