【发布时间】:2018-11-28 20:54:47
【问题描述】:
我有一个包含资源部分的 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....'
第二次更新: 似乎资源部分字符串表确实存储在 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.
【问题讨论】:
-
用
bs = b'\x00B'*40替换它们?你的 B 只占 A 的一半...... -
我更新了我的第一篇文章。我可以按照您的建议进行操作,但这仅适用于这样的小事。我正在生成一个十六进制字符串,我想把它放到资源部分。然后当程序运行时,它将解密字符串并使用它得到的内容。所以我想知道,我应该使用我的十六进制字符串并在每个字节后添加“00”吗?这样它就可以像 A 的 '41 00' 一样适合资源部分?
-
什么是 C 程序中的“资源部分”,为什么
C语言在这个问题中有任何意义?这看起来很像编辑二进制文件。最好的解决方案:永远不要编辑二进制文件,编辑 C 源代码。是的,如果您使用wchar_t,它是(全部都是)实现定义的类型,并且可能是 2 个(或更多)字节长,并且可以使用实现定义的方式将字符存储在 2 个字节中,中间有零,为什么不呢。当您使用 Visual Studio 时,可以假设它是 Windows,所以是的 - wchar_t (可能)是 2 个字节长。仍然不清楚您要做什么以及为什么与 C 相关 -
如果你连我在说什么都不知道,为什么还要发表评论?
-
@Halloween 您正在编辑其二进制文件的程序是用 C 编写的这一事实确实无关紧要。您正在编辑 Windows 资源记录,它们的结构独立于用于实现二进制文件的编程语言。所以卡米尔是正确的。此外,您的简单编辑是可用的,但您必须验证您的假设并检查二进制文件中是否没有其他长字符串 A:您只需要一个字符串,如果还有更多,那么您不知道该选择哪一个。
标签: python python-3.x embedded-resource portable-executable