IDA允许使用N快捷方式重命名程序实体(例如寄存器,变量,函数)。是否可以在IDA中获得此类用户定义名称的列表?

评论

您是用“变量”来表示十六进制变量吗?如果是,此脚本将转储几乎所有用户定义的东西到特定的反编译器函数中:github.com/idapython/src/blob/master/examples/vds4.py

此外,idautils.Names()可用于检索命名的全局实体。

#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");
}