如何使用python按地址/偏移量/字节编辑可执行文件,就像在十六进制编辑器中一样



我使用Hex-rays IDA来查找我需要在windows可执行文件中更改的代码字节。我想写一个python脚本,将以编程方式编辑这些字节。

我知道地址(在十六进制IDA中给出),我知道我想用十六进制覆盖它。在python中怎么做呢?我肯定有一个简单的答案,但是我找不到。

(例如:address = 0x00436411, new十六进制= 0xFA)

您只需要以二进制模式打开可执行文件,以便写入;然后寻找你想写的职位;然后写。所以:

with open(path, 'r+b') as f:
    f.seek(position)
    f.write(new_bytes)

如果您要更改大量字节,您可能会发现使用mmap更简单,它允许您将文件视为一个巨大的list:

with open(path, 'r+b') as f:
    with contextlib.closing(mmap.mmap(f.fileno(), access=mmap.ACCESS_WRITE)) as m:
        m[first_position] = first_new_byte
        m[other_position] = other_new_byte
        # ...

如果你想写多字节值(例如,32位int),你可能想使用struct模块。


如果您知道的是运行时内存中的地址,而不是文件位置,那么您必须能够将其映射到可执行文件中的正确位置。这甚至可能是不可能的(例如,内存映射区域)。但如果它是,您应该能够从调试器中找出它映射到哪里。在调试器内部,这很容易;从外部看,您需要解析PE头结构并执行许多复杂的逻辑,而没有理由这样做。

我相信当使用十六进制射线IDA作为静态反汇编器时,所有默认设置,它给你的地址是代码和数据段的地址,如果它们不被强制重新定位,它们将被映射到内存中。这些显然不是文件中的偏移

最新更新