如何在 IDA-Pro 中获取恢复的内存引用?

逆向工程 艾达 蟒蛇 符号
2021-06-14 00:47:44

我想收集数据段中所有 IDA 恢复的符号信息(此信息可以是函数名,也可以是跳转表的条目,也可以是对其他数据段引用)。

以下是来自 IDA 反汇编二进制文件的数据段示例。

在此处输入图片说明

数据部分基本上有三个恢复的符号,我想以这样的格式收集这些信息:

0x804a018 : sub_804847b
0x804a01dc : _strchr
0x804a020 : sub_80484AE

我想遍历二进制数据部分的所有内存地址,并检查每个地址的内容,看它是否是恢复的符号。

但基本上如何在迭代地址时读取可疑符号?我阅读了idc界面,但我找不到任何正确的 api 来这样做。有人可以帮我解决这个问题吗?我很感激。

- - - - - - - - - - - - 解释 - - - - - - - - - - - -

我在那篇文章中没有得到答案,此外,我认为我在那篇文章中解释的内容在某种程度上具有误导性。

1个回答

据我了解您的问题,您将需要以下 IDAPython api:

  • 从特定内存地址获取内容: idc.Dword(address) 或 idc.Qword(address) - 您应该根据指针大小选择函数。
  • 获取地址名称:idc.Name(address)

所有提到的IDAPython apis在idc中都有类似的东西

因此,对于您的特定示例,您将获得如下所需的输出(IDAPython):

import idc
addresses = [0x804a018, 0x804a01dc ,0x804a020 ]

for a in addresses:
    print hex(a)," : ", idc.Name(idc.Dword(a))

过滤 .data 部分中的数据是完全不同的故事。

例如,您可以执行以下操作(并非 100% 正确):

import idc

segstart = your_code_segment_start
segend = your_code_segment_end
ptrstep = your_system_pointer_size_in_bytes

for a in range(segstart, segend, ptrstep):
    data = idc.Dword(a) #replace with qword if working with 64 bit)
    if a < segstart or a >= segend:
        continue
    if not idc.Name(data) is None:
        print hex(a), " --> ", idc.Name(data)