我正在尝试获取 IDA 中符号名称的完整列表。所有返回名称的函数主要围绕查看特定地址和符号表中的相应条目进行操作,而不是查看符号表本身的所有条目。
这没有问题,直到您有位于相同地址的符号,例如类C1and 的构造函数和析构函数C2,D1和D2(如 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
注意如何C1和C2具有相同的地址。
现在,使用 IDAPython,我们可以使用idautils.Names()(按照建议)或之前讨论过的任何其他方法,代码如下:
import idautils
for name in idautils.Names():
print name
我们得到的结果看起来像,在其他不相关的信息中,这个:
(4195654L, '_ZN5appleC2Ei')
(4195668L, '_ZN5appleD2Ev')
注意它如何只找到C2andD2构造函数/析构函数,而不是C1and D1。是否可以使用 IDA “找到”C1和D1构造函数/析构函数?