在 C 程序中使用 Python 覆盖资源段
Using Python to overwrite resource section in C program
我有一个包含资源部分的 C 程序。
IDS_STRING 87 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
在十六进制编辑器中它看起来像这样
我在 Python 中使用这样的代码来搜索和替换 A:
str = b'\x00A'*40
str1 = b"BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
if str in file:
print("A in file")
f.write(file.replace(str, str1))
这使得新文件看起来像这样:
所以我想知道为什么 A 存储为“41 00”,然后当我覆盖它们时它们只是“42”。
这是 WCHAR 的东西吗?
我做了一个测试,我加载了字符串并将其打印出来。
This is some text.AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
但是当我使用我的 Python 并用 B 覆盖 A 时,它会这样做..
This is some text.???????????????????????????????????????B
所以我对 C 的了解有限,如果我想把东西放到资源部分,我应该把它们放在 WCHAR 中吗?
更新:
我的主要问题是我有一个类似于下面的十六进制字符串:
'685308358035803507835083408303508350835083508350835083083508'
我想把它放到资源部分。但是如果我这样做类似于我正在替换的方式,那么通过做
f.write(file.replace(str, '685308358035803507835083408303508350835083508350835083083508'))
然后将其放入资源部分:
如果它像这样进入,它会导致事情中断,因为它似乎一次抓取 2 个字节。
我问这个的原因是因为当我用我的十六进制和 运行 程序替换 A 时。这是行不通的。但是,如果我将十六进制直接放入 Visual Studio 和 运行 中的资源部分,它确实有效。当我用 Python 替换时它是 '34322424...' 但是当相同的字符串放在资源部分时它是 '3400220042004....'
第二次更新:
似乎资源部分字符串 table 确实存储在 2 个字节中。
https://docs.microsoft.com/en-us/windows/desktop/debug/pe-format#the-rsrc-section
Resource Directory Strings
Two-byte-aligned Unicode strings, which serve as string data that is pointed to by directory entries.
好像是utf-16编码。因此,您可以使用常规 python unicode 字符串,并确保以文本模式打开和写入文件,并使用 utf16 编码。
如果您使用二进制模式,您写入的每个 ascii 字符将以单个字节表示。如果你使用文本模式,你写的每个字符将由两个字节表示。如果您编写的文本仅使用低 unicode 代码点,则会出现一堆空字节。如果你写一些中文文本,你需要两个字节。
您发布的十六进制转储在开头没有显示 BOM,因此您可能必须使用 utf-16le
而不是 utf-16
。
with open('foo.txt', 'r', encoding='utf-16le') as fp:
text = fp.read()
with open('foo.txt', 'w', encoding='utf-16le') as fp:
fp.write(text.replace('AAAAAA', 'BBBBBB'))
我有一个包含资源部分的 C 程序。
IDS_STRING 87 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
在十六进制编辑器中它看起来像这样
我在 Python 中使用这样的代码来搜索和替换 A:
str = b'\x00A'*40
str1 = b"BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
if str in file:
print("A in file")
f.write(file.replace(str, str1))
这使得新文件看起来像这样:
所以我想知道为什么 A 存储为“41 00”,然后当我覆盖它们时它们只是“42”。
这是 WCHAR 的东西吗?
我做了一个测试,我加载了字符串并将其打印出来。
This is some text.AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
但是当我使用我的 Python 并用 B 覆盖 A 时,它会这样做..
This is some text.???????????????????????????????????????B
所以我对 C 的了解有限,如果我想把东西放到资源部分,我应该把它们放在 WCHAR 中吗?
更新: 我的主要问题是我有一个类似于下面的十六进制字符串:
'685308358035803507835083408303508350835083508350835083083508'
我想把它放到资源部分。但是如果我这样做类似于我正在替换的方式,那么通过做
f.write(file.replace(str, '685308358035803507835083408303508350835083508350835083083508'))
然后将其放入资源部分:
如果它像这样进入,它会导致事情中断,因为它似乎一次抓取 2 个字节。
我问这个的原因是因为当我用我的十六进制和 运行 程序替换 A 时。这是行不通的。但是,如果我将十六进制直接放入 Visual Studio 和 运行 中的资源部分,它确实有效。当我用 Python 替换时它是 '34322424...' 但是当相同的字符串放在资源部分时它是 '3400220042004....'
第二次更新: 似乎资源部分字符串 table 确实存储在 2 个字节中。
https://docs.microsoft.com/en-us/windows/desktop/debug/pe-format#the-rsrc-section
Resource Directory Strings
Two-byte-aligned Unicode strings, which serve as string data that is pointed to by directory entries.
好像是utf-16编码。因此,您可以使用常规 python unicode 字符串,并确保以文本模式打开和写入文件,并使用 utf16 编码。
如果您使用二进制模式,您写入的每个 ascii 字符将以单个字节表示。如果你使用文本模式,你写的每个字符将由两个字节表示。如果您编写的文本仅使用低 unicode 代码点,则会出现一堆空字节。如果你写一些中文文本,你需要两个字节。
您发布的十六进制转储在开头没有显示 BOM,因此您可能必须使用 utf-16le
而不是 utf-16
。
with open('foo.txt', 'r', encoding='utf-16le') as fp:
text = fp.read()
with open('foo.txt', 'w', encoding='utf-16le') as fp:
fp.write(text.replace('AAAAAA', 'BBBBBB'))