在 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'))