我使用 Hex-rays IDA 来查找 Windows 可执行文件中需要更改的代码字节。我想编写一个 python 脚本来以编程方式编辑这些字节。
我知道地址(如十六进制 IDA 中给出的),并且我知道我想要覆盖它的十六进制。我如何在Python中做到这一点?我确信有一个简单的答案,但我找不到。
(例如:地址 = 0x00436411,新的十六进制 = 0xFA)
您只需将可执行文件作为文件打开,以二进制模式进行写入;然后寻找你想写的位置;然后写。所以:
with open(path, 'r+b') as f:
f.seek(position)
f.write(new_bytes)
Run Code Online (Sandbox Code Playgroud)
如果您要更改大量字节,您可能会发现它使用起来更简单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
# ...
Run Code Online (Sandbox Code Playgroud)
如果您尝试写入多字节值(例如,32 位 int),您可能需要使用该struct模块。
如果您知道的是运行时内存中的地址,而不是文件位置,则必须能够将其映射到可执行文件中的正确位置。这甚至可能是不可能的(例如,内存映射区域)。但如果是的话,您应该能够从调试器中找出它的映射位置。从调试器内部,这很容易;从外部来看,您需要解析PE头结构并执行大量复杂的逻辑,并且没有理由这样做。
我相信,当使用 hex-ray IDA 作为静态反汇编器时,在所有默认设置下,它为您提供的地址是代码和数据段将被映射到内存的地址(如果它们不被强制重新定位)。显然,这些不是文件中的偏移量。