为 IDA 中的一个地址获取多个函数名称

逆向工程 艾达 蟒蛇 小精灵
2021-06-23 09:31:05

我正在尝试获取 IDA 中符号名称的完整列表。所有返回名称的函数主要围绕查看特定地址和符号表中的相应条目进行操作,而不是查看符号表本身的所有条目。

这没有问题,直到您有位于相同地址的符号,例如类C1and 的构造函数和析构函数C2D1D2如 C++ ABI 中所述)。传统的方法get_func_name(ea)GetFunctionName(ea)不起作用,因为它们只给出一个给定地址的结果。

如果多个符号名称指向同一个有效地址,我如何获得所有这些符号名称?

编辑:

考虑以下代码:

class apple{
    public:
        apple(int a);
        ~apple();
};

apple::apple(int a){}
apple::~apple(){}

int main(){
    apple a = apple(1);
    return 0;
}

编译它g++ -o apple apple.cpp以获得我们的可执行文件然后运行readelf -s给我们,除其他条目外:

53: 0000000000400554    11 FUNC    GLOBAL DEFAULT   14 _ZN5appleD1Ev
57: 0000000000400546    14 FUNC    GLOBAL DEFAULT   14 _ZN5appleC1Ei
65: 0000000000400546    14 FUNC    GLOBAL DEFAULT   14 _ZN5appleC2Ei
70: 0000000000400554    11 FUNC    GLOBAL DEFAULT   14 _ZN5appleD2Ev

注意如何C1C2具有相同的地址。

现在,使用 IDAPython,我们可以使用idautils.Names()(按照建议)或之前讨论过的任何其他方法,代码如下:

import idautils
for name in idautils.Names():
    print name

我们得到的结果看起来像,在其他不相关的信息中,这个:

(4195654L, '_ZN5appleC2Ei')
(4195668L, '_ZN5appleD2Ev')

注意它如何只找到C2andD2构造函数/析构函数,而不是C1and D1是否可以使用 IDA “找到”C1D1构造函数/析构函数?

2个回答

IDA 在加载 ELF 文件时,将只选择一个名称并使用 if 用于特定地址,因为 IDA 无法为同一地址使用多个名称。所以你必须发明一些东西来扩展 elf 文件的 IDA 加载器,让它以某种方式存储地址的替代名称。

也许走另一条路可能是一种解决方法/解决方案?

您可以枚举idautils.Names()返回元组列表的所有名称(ea, name)然后您只需过滤函数地址并获得我假设的该位置的所有可能名称。