0

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

我知道地址(在 hex-rays IDA 中给出)并且我知道我希望用它覆盖它的十六进制。我如何在python中做到这一点?我确定有一个简单的答案,但我找不到。

(例如:地址 = 0x00436411,新的十六进制 = 0xFA)

4

1 回答 1

5

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

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 作为静态反汇编程序时,在所有默认设置下,它给你的地址是代码和数据段将被映射到内存中的地址,如果它们不被强制重定位的话。显然,这些不是文件中的偏移量。

于 2013-04-03T21:45:13.680 回答