【问题标题】:Using Python to overwrite resource section in C program使用 Python 覆盖 C 程序中的资源部分
【发布时间】: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


【解决方案1】:

看起来像 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'))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-20
    • 2011-02-02
    • 2020-03-04
    • 2011-08-27
    • 2016-08-11
    • 2023-03-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多