N
快捷方式重命名程序实体(例如寄存器,变量,函数)。是否可以在IDA中获得此类用户定义名称的列表?#1 楼
您可能会对idautils.Names
函数感兴趣,因为它返回了IDB中定义的所有名称及其所位于的ea的(ea, name)
元组的列表。此外,您还可以使用答案到Igor链接的问题(使用IDA python获取全局变量列表)以获取所有函数的列表。 ea是由用户命名的:def is_user_name(ea):
f = idc.GetFlags(ea)
return idc.hasUserName(f)
如果EA具有用户以编程方式或手动设置的名称,则此函数将返回true。
评论
我认为Names实用程序功能可在idautils下使用,而不是IDC。
–威廉·巴伦丁(Willi Ballenthin)
17年7月27日在15:32
API名称是idc.GetNames,而不是idc.getNames。我无法进行编辑,因为其差异少于6个字符。
–威廉·巴伦丁(Willi Ballenthin)
17年9月22日在17:49
@WilliBallenthin在我的评论中的任何地方都找不到对idc.getnames的引用。让我知道,我会编辑。
– NirIzr
17年9月22日在17:51
抱歉,对不起!我的意思是idc.GetFlags()。
–威廉·巴伦丁(Willi Ballenthin)
17年9月24日在0:53
即使对于分析过程中生成的库名,is_user_name似乎也返回True。
– dkaranovich
19年8月12日在4:30
#2 楼
您可以使用View-> Open subview-> Names或Shift-F4。请注意,该列表包括用户定义的所有名称以及IDA生成的所有名称(例如ASCII字符串名称)。评论
是否可以仅列出用户定义的名称,而不列出IDA生成的名称?
– Holmes.Sherlock
16年11月1日在18:42
#3 楼
运行此.idc脚本以导出所有用户定义的函数名称。在IDA 7.0上测试过的脚本。对于IDA <7.0:请使用功能hasUserName(addr)代替has_user_name(addr)
#include <idc.idc>
static FuncDump(start)
{
auto ea, str, count, ref;
auto end;
auto teststr;
ea = start;
while( ea != BADADDR )
{
str = GetFunctionName(ea);
if( str != 0 )
{
end = FindFuncEnd(ea);
count = 0;
ref = RfirstB(ea);
while(ref != BADADDR)
{
count = count + 1;
ref = RnextB(ea, ref);
}
teststr = sprintf("sub_%X", ea);
if(has_user_name(GetFlags(ea)) && !((GetFunctionFlags(ea) & FUNC_LIB) == FUNC_LIB) && teststr != str ) {
Message("-s 0x%X=%s\n", ea, str );
}
//Message("%s, 0x%d, 0x%x, 0x%x, 0x%x, %d\n", str, count, ea, end, end-ea, end-ea );
}
ea = NextFunction(ea);
}
}
static main()
{
Message("FuncDump: Start\n");
FuncDump(0x40000);
Message("FuncDump: Done\n");
}
评论
您是用“变量”来表示十六进制变量吗?如果是,此脚本将转储几乎所有用户定义的东西到特定的反编译器函数中:github.com/idapython/src/blob/master/examples/vds4.py此外,idautils.Names()可用于检索命名的全局实体。