我已经使用 Hex-rays IDA 来查找我需要在 Windows 可执行文件中更改的代码字节。我想编写一个 python 脚本,以编程方式编辑这些字节。
我知道地址(在 hex-rays IDA 中给出)并且我知道我希望用它覆盖它的十六进制。我如何在python中做到这一点?我确定有一个简单的答案,但我找不到。
(例如:地址 = 0x00436411,新的十六进制 = 0xFA)
我已经使用 Hex-rays IDA 来查找我需要在 Windows 可执行文件中更改的代码字节。我想编写一个 python 脚本,以编程方式编辑这些字节。
我知道地址(在 hex-rays IDA 中给出)并且我知道我希望用它覆盖它的十六进制。我如何在python中做到这一点?我确定有一个简单的答案,但我找不到。
(例如:地址 = 0x00436411,新的十六进制 = 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头结构并做很多复杂的逻辑,没有理由这样做。
我相信当使用 hex-ray IDA 作为静态反汇编程序时,在所有默认设置下,它给你的地址是代码和数据段将被映射到内存中的地址,如果它们不被强制重定位的话。显然,这些不是文件中的偏移量。