我试图写一个命令行应用程序,它可以修改使用十六进制值在特定地址的.so文件。
我使用IDA演示和HXD十六进制编辑器才能达到的需要更新的地址,然而,每次我试图修改该文件,不管我用哪种语言(bash的脚本,PHP,Python)的每一次我编辑的文件,它是我从IDA和HXD十六进制编辑器的地址有误补偿更新。
我已经看到了这方面的几个职位,但到目前为止,还没有一个能给出一个明确的答案,如何才能达到的HXD和IDA有没有问题找到地址:(
在蟒蛇我用mmap功能时尝试这种使用下面的;
import mmap
import contextlib
import os
filesize = os.stat("filetomodify.so").st_size
print int(filesize)
with open("filetomodify.so", 'r+b') as f:
with contextlib.closing(mmap.mmap(f.fileno(), access=mmap.ACCESS_WRITE)) as m:
m[0x173596] = "FF 20"
m[0x18D88E] = "FF 20"
m.close()
这将使用os
库以确定哪个被返回作为文件的大小10025936
,然而,每次我添加length=filesize
之间参数f.fileno()
和access=mmap.ACCESS_WRITE
我总是得到一个mmap.error: [Errno 22] Invalid argument
的错误消息,但是当我省略参数,得到了一个m: TypeError: Required argument 'length' (pos 2) not found
我已经使用了bash脚本是一个,我发现在这里,这修改文件不错,但更新了错误的地址;
#!/bin/bash
# param 1: file
# param 2: offset
# param 3: value
# param 4: Size of Bytes
function replaceByte() {
printf "$(printf '\\x%02X' $3)" | dd of="$1" bs=$4 seek=$2 count=1 conv=notrunc &> /dev/null
}
# Usage:
replaceByte 'filetomod.so' "0x173596" "95 E5 0A 2F 66 1E 32 EE 4C B8 9A 6E BD EC 01" 15
调用上述功能更新的文件,并把它确定,但是当我在更新的字节串做一个查找(例如95 E5 0A 2F 66 1E 32 EE 4C B8 9A 6E BD EC 01 - 只需一个长期唯一的字符串你不希望在文件中找到),它在不正确的地址被插入,或者它告诉我,偏移量是文件大小之外。
最后,PHP代码我用(我没想到反正有很大的成功)是;
<?php
$fp = fopen('binary_file.bin', 'w+b');
fseek($fp, 173596, );
fwrite($fp, '95 E5 0A 2F 66 1E 32 EE 4C B8 9A 6E BD EC 01');
fclose($fp);
?>
然而,不是编辑二进制文件的十六进制值,该添加的字符串作为一个字符串在HXD地址二进制文件0002A61C
与十六进制代码为39 35 20 45 35 20 30 41 20 32 46 20 36 36 20 31 45 20 33 32 20 45 45 20 34 43 20 42 38 20 39 41 20 36 45 20 42 44 20 45 43 20 30 31
其具有的输出95 E5 0A 2F 66 1E 32 EE 4C B8 9A 6E BD EC 01
任何帮助,将不胜感激。 我的答案唯一的要求是,它可以从命令行运行,无论是PHP的,bash中,蟒蛇,爪哇等。
先感谢您。