我使用Hex-rays IDA来查找我需要在Windows可执行文件中更改的代码字节。我想编写一个python脚本,以编程方式编辑这些字节。
我知道地址(用十六进制IDA给出),我知道我希望用它覆盖十六进制。我怎么在python中这样做?我确信有一个简单的答案,但我找不到它。
(例如:address = 0x00436411,new hexadecimal = 0xFA)
答案 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作为静态反汇编程序时,使用所有默认设置,它给你的地址是代码和数据段将被映射到内存的地址,如果他们不被强迫搬迁。显然,这些不是文件的偏移。