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

时间:2013-04-03 21:41:02

标签: python

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

我知道地址(用十六进制IDA给出),我知道我希望用它覆盖十六进制。我怎么在python中这样做?我确信有一个简单的答案,但我找不到它。

(例如:address = 0x00436411,new hexadecimal = 0xFA)

1 个答案:

答案 0 :(得分:4)

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

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头结构并做很多复杂的逻辑,没有理由这样做。

我相信当使用hex-ray IDA作为静态反汇编程序时,使用所有默认设置,它给你的地址是代码和数据段将被映射到内存的地址,如果他们不被强迫搬迁。显然,这些不是文件的偏移。