如何通过 Idapython 获取 CPU 架构?

逆向工程 艾达 蟒蛇
2021-06-10 09:35:23

我找不到 API 函数来获取加载的二进制文件的 CPU 架构。在 中idaapi.py,有一个函数def set_processor_type(*args)但没有等价物,例如get_processor_type

我不想退回到运行一些额外的 (python) 工具,例如 file、readelf 或 python ELF 解析器。我也不喜欢解析显示在 IDA 程序集列表开头的字符串的想法。

必须有一种方法可以使用idc.py,idaapi.py或者idautils.py为此。

3个回答

您可以从idainfo结构中获取处理器的名称

import idaapi

info = idaapi.get_inf_structure()

if info.is_64bit():
    bits = 64
elif info.is_32bit():
    bits = 32
else:
    bits = 16

try:
    is_be = info.is_be()
except:
    is_be = info.mf
endian = "big" if is_be else "little"

print 'Processor: {}, {}bit, {} endian'.format(info.procName, bits, endian)
# Result: Processor: mipsr, 32bit, big endian

尽管如此,仍然没有找到字节序。

编辑:字节序可以由处理器名称确定。例如,mipsr是大端,mipsrl是小端。

编辑:
添加了正确的字节序检查(mf== MSB First)。基于这个答案

编辑:
从 IDA7 beta 3 (170724) 开始,idainfo.mf 被删除,必须使用 idainfo.is_be()。基于键区

并非所有处理器名称都有字节序信息。一般可以确定为:

BIG_ENDIAN if _idaapi.cvar.inf.mf else LITTLE_ENDIAN

这绝对不是确切的答案,但您可能可以利用

idaapi.ph_get_regnames() 

返回处理器模块中定义的寄存器名称列表

不同的平台有不同的寄存器集,如果你找不到关于精确 cpu 的解决方案,你可以试一试。这个函数存在于 IDA 6.8 中。