如何从 Python 中的二进制文件读取和写入 "Unicode (UTF-16 little endian)" 文本?
How to read and write "Unicode (UTF-16 little endian)" text to and from a binary file in Python?
我有一个二进制文件“x.bin”,它是一个 windows 可执行文件。
我正在尝试使用 Python 修改此可执行文件中的字符串值,在文本编辑器中查看此字符串我被告知文本编码是“Unicode (UTF-16 little endian)”我可以看到空字节环绕在字符串中的文本周围。
但是,当我尝试以 Python 的二进制模式读取此文件,然后将其转换为十六进制时,我被告知执行 [=13= 时文件中不存在十六进制] 因此无法替换任何数据。
我也无法使用 encoding="utf-16-le"
在 "r"
模式下访问文件,因为这会尝试解码数据并失败。
有没有办法在 Python 中使用 UTF-16 编码访问二进制数据?
编辑:
_hex是调用data.hex()
后的结果
我正在使用这种方法从文件中读取
with open("resources\rfreeze.bin", "rb") as f:
data = f.read()
您的问题有点不清楚,但要编辑可执行文件,您只需将目标字节替换为另一组相同长度的字节即可。这是一个例子:
test.c - 带有嵌入式 UTF-16LE 字符串的简单程序(在 Windows 中):
#include <stdio.h>
int main() {
wchar_t* s = L"Hello";
printf("%S\n",s);
return 0;
}
test.py - 用另一个字符串替换字符串
with open('test.exe','rb') as f:
data = f.read()
target = 'Hello'.encode('utf-16le')
replacement = 'ABCDE'.encode('utf-16le')
if len(target) != len(replacement):
raise RuntimeError('invalid replacement')
data = data.replace(target,replacement)
with open('new_test.exe','wb') as f:
f.write(data)
演示:
C:\>cl /W4 /nologo test.c
test.c
C:\>test.exe
Hello
C:\>test.py
C:\>new_test.exe
ABCDE
我有一个二进制文件“x.bin”,它是一个 windows 可执行文件。
我正在尝试使用 Python 修改此可执行文件中的字符串值,在文本编辑器中查看此字符串我被告知文本编码是“Unicode (UTF-16 little endian)”我可以看到空字节环绕在字符串中的文本周围。
但是,当我尝试以 Python 的二进制模式读取此文件,然后将其转换为十六进制时,我被告知执行 [=13= 时文件中不存在十六进制] 因此无法替换任何数据。
我也无法使用 encoding="utf-16-le"
在 "r"
模式下访问文件,因为这会尝试解码数据并失败。
有没有办法在 Python 中使用 UTF-16 编码访问二进制数据?
编辑:
_hex是调用data.hex()
后的结果我正在使用这种方法从文件中读取
with open("resources\rfreeze.bin", "rb") as f:
data = f.read()
您的问题有点不清楚,但要编辑可执行文件,您只需将目标字节替换为另一组相同长度的字节即可。这是一个例子:
test.c - 带有嵌入式 UTF-16LE 字符串的简单程序(在 Windows 中):
#include <stdio.h>
int main() {
wchar_t* s = L"Hello";
printf("%S\n",s);
return 0;
}
test.py - 用另一个字符串替换字符串
with open('test.exe','rb') as f:
data = f.read()
target = 'Hello'.encode('utf-16le')
replacement = 'ABCDE'.encode('utf-16le')
if len(target) != len(replacement):
raise RuntimeError('invalid replacement')
data = data.replace(target,replacement)
with open('new_test.exe','wb') as f:
f.write(data)
演示:
C:\>cl /W4 /nologo test.c
test.c
C:\>test.exe
Hello
C:\>test.py
C:\>new_test.exe
ABCDE