将十六进制字节粘贴到 IDA Pro 十六进制视图中

逆向工程 艾达 Python 蟒蛇 十六进制 记忆
2021-06-21 09:43:24

是否可以将一系列字节粘贴到 IDA 的十六进制视图中?假设我有一个大缓冲区,我需要用一个特定的值填充,并且我将它以大多数十六进制编辑器输出的形式... 0A AB EF FF 00 01...十六进制视图?或者通过 IDAPython 做到这一点?

编辑:

使用 PatchByte 解决,如下所示:

def PatchArr(dest, str):
  for i, c in enumerate(str):
    idc.PatchByte(dest+i, ord(c));

# usage: patchArr(start address, string of bytes to write)
patchArr(0xCAFEBABE, "\x01\x02\x03")

请注意,我不喜欢对易失性调试内存进行编辑,导致 IDA 抱怨 IDB 在调试后被修补......

3个回答

在 IDA 的十六进制视图中,您可以转到Edit->Patch Program->Change Byte,但我认为这一次只能修补 16 个字节。如果您需要修补更多字节,您可以使用 IDAPython 的idc.PatchByte / idc.PatchWord / idc.PatchDword来更改 IDA 数据库中的字节。

编辑:

请注意,如果您希望将补丁应用于加载到 IDA 中的原始文件,则需要在对 idb 中的字节进行补丁后转到Edit->Patch Program->Apply patch to input file

下面是来自fwrapper 的两个函数,它们给出了如何修补 IDB 和从文件导入数据的示例。我建议检查代码。我一直将它用于解码/解密数据的样本,或者当我必须手动转储一块内存并修补 IDB 时。

def patch(self, temp = None):
    '''patch idb with data in fwrapper.buffer'''
    if temp != None:
            self.buffer = temp
    for index, byte in enumerate(self.buffer):
         PatchByte(self.start+index, ord(byte))

def importb(self):
    '''import file to save to buffer'''
    fileName = AskFile(0, "*.*", 'Import File')
    try:
        self.buffer = open(fileName, 'rb').read()
    except:
        sys.stdout.write('ERROR: Cannot access file')

尽管已经回答了这个问题,但 IDA 是作为调试器使用的。不是作为修补工具,这与 IDA 存储的工作方式有很大关系。IDA 创建了一个数据库文件,允许您在先加载 exe 后将其删除。当您处理知识产权/恶意软件时,这非常有用。我建议使用 ImmDBG 来满足您的修补需求。