如何获取 IDA-Pro 符号化了多少内存引用的数据?

逆向工程 艾达 符号
2021-06-27 04:02:13

我们都知道,在典型的程序中,存在一些引用。

在此处输入图片说明

编译时,链接器将在符号重定位步骤期间将所有内存引用转换为具体的内存地址通过进行一些快速实验(IDA-Pro 6.4),我注意到 IDA-Pro 可以帮助将这些内存地址提升回符号。

但是,我发现 IDA-Pro 的符号化功能可能会被某些情况误导。所以我感兴趣的是计算 IDA-Pro 恢复了多少引用。请问有没有办法获取“IDA-Pro恢复了多少内存引用”的信息

非常感谢@Jason 的回答,但我想做的不是收集所有标签。下面是一个例子:

在此处输入图片说明

请注意sub_80484AE地址中的符号0x804a020请注意,处理0x08, 0x04, 0x84, 0xae后的二进制文件中的 4 字节数据被视为一个符号,因为它等于 function 的起始地址sub_80484AE这是真实的。但是,由于没有指令指向 address 0x804A020,因此没有namein address 0x804a020

我要收集的是所有带有对应地址的符号,例如,在上面的例子中,我需要收集这个

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

我够清楚了吗?如果有人能给我一些帮助,我真的很感激!非常感谢!!

- - - - - - - - - - - - - - - - - - - - - - - - 更新 - -------------------------------------

我还不够清楚吗?

让我这样说吧。我可以获取以前由链接器解析的所有符号信息吗?比如说,在我更新的图片中,在编译链接器期间解析了三个符号,内存地址为 0x804a018、0x804a01dc、0x804a020。IDA-Pro 会恢复其中的一些信息。所以我想收集所有IDA恢复的符号信息(这个信息可以是函数名,也可以是跳转表的条目,也可以是跳转目标,如图所示)。

请注意,我想以每个解析符号与内存地址的格式恢复信息。例如在图片中,它应该是:

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

我正在考虑遍历二进制文件的所有内存地址,并检查每个指令的操作数(或内容,如果它在数据部分中),看看它是否是一个恢复的符号。如果是这样,我会将这个符号与这条指令(或数据)的内存地址一起存储。

但基本上如何检查指令中的 oprend 是否是一个符号?

1个回答

如果我正确理解您的问题,那么您是在问有多少地址有名称。

例如,在以下代码段中,代码段中的两个地址具有名称 (loc_4385E4dword_4385F8),因为它们都是从其他地址交叉引用的:

.text:004385E4 loc_4385E4:                             ; CODE XREF: sub_4254E0+1C0j
.text:004385E4                                         ; CODE XREF: sub_4254E0+1E6j
.text:004385E4                 push    ecx
.text:004385E5                 push    ecx
.text:004385E6                 push    0Eh
.text:004385E8                 pop     edx
.text:004385E9                 mov     ecx, offset dword_438618
.text:004385EE                 call    sub_4421A7
.text:004385F3                 jmp     loc_4256A6
.text:004385F3 ; END OF FUNCTION CHUNK FOR sub_4254E0
.text:004385F3 ; ---------------------------------------------------------------------------
.text:004385F8 dword_4385F8    dd 1000000Ah, 80204h, 10000h, 80010000h
.text:004385F8                                         ; DATA XREF: sub_4254E0+13092o

您可以使用下面的 IDC 脚本来计算反汇编中的所有命名地址:

auto ea;
auto names = 0;

for (ea = BeginEA(); ea != BADADDR; ea = NextNotTail(ea))
{
    if (Name(ea) != "")
    {
        names++;
    }
}

Message("%d named addresses found.\n", names);

编辑

您对原始问题所做的更改现在听起来像是您想要捕获所有函数名称。为此,请打开函数窗口(在菜单栏中:查看打开子视图函数),右键单击函数窗口,然后选择全部复制您现在可以将函数名称列表粘贴到文本编辑器或电子表格中。