如何在 IDA Python 中打印操作数的自定义名称?

逆向工程 蟒蛇
2021-06-25 18:21:31

我开始研究一个插件,当函数名称匹配时,将符号(堆栈变量名称、操作数名称、注释等)从一个数据库中的函数移植到另一个数据库中的函数。

我越来越熟悉 IDA api,现在我无法找到如何在 IDA Python 中获取操作数的自定义名称。

这是我的主要功能: 在此处输入图片说明

现在我只想能够打印我想要的信息,我想打印操作数名称:未定义自定义名称时的正常名称,以及为操作数设置自定义名称时的自定义名称(Alt+ F1 快捷键默认)。

这是我为我的主要功能想到的:

import idautils


for functionItem in idautils.FuncItems(0x140012400):
    if ida_bytes.is_code(ida_bytes.get_full_flags(functionItem)):
        instruction = idautils.DecodeInstruction(functionItem)
        print(idc.print_operand(instruction.ip, 0))

我希望它在最后打印出来:

rsp
rdi
rbp:myCustomName

此代码打印:

rsp
rdi
rbp

我试图用谷歌搜索,但找不到如何显示自定义操作数名称。我只能找到这两个相关链接:

1个回答

做了一堆搜索等之后operandmanualmanual operand在六角射线的IDA Python文档的网站,我终于设法找到了实现我想要的东西所需要的相应API。

import idautils


for functionItem in idautils.FuncItems(0x140012400):
    if ida_bytes.is_code(ida_bytes.get_full_flags(functionItem)):
        instruction = idautils.DecodeInstruction(functionItem)
        if(ida_bytes.is_forced_operand(instruction.ip, 0)):
            print(ida_bytes.get_forced_operand(instruction.ip, 0))
        else:
            print(idc.print_operand(instruction.ip, 0))

上面的代码在安装了 Python 3.9 的 IDA 7.6 上打印了所需的结果:

rsp
rdi
rbp:myCustomName

指令和操作数上的手动字符串的功能是: