如何修改二进制图像资源数据?

逆向工程 视窗 可执行 二进制编辑
2021-07-08 07:55:57

我多年来一直从事黑客和修改软件,并学到了很多东西,但仍有一些事情让我烦恼,这就是一个这样的案例。我注意到一些 PE 包含一个RCData部分,可以容纳大量不同类型的数据和信息。根据我的经验,数据通常是二进制文件或对话框类。在这种情况下,我试图弄清楚图像是如何存储在我只能描述为二进制的对话框的原始格式(感谢@Megabeets 刷新了我的记忆)。在我比较缺乏经验的日子里,我认为这些文件中的图像数据直接存储为纯文本或十六进制值。当我将资源数据中的数据与相关图像(以不同格式存储在不同的树中)进行比较时,它们不匹配。在某些情况下,这些数据是它自己的图像,没有可比的替代方案。以下是相关数据的屏幕截图: 二进制数据以蓝色高亮显示 我知道此数据用于图标,因为删除它也会删除应用程序中的图像。对于某些程序,此数据可以是对话 GUI 资产或位图。如何将此数据“转换”为图像或反之亦然以进行修改或替换?

作为潜在的替代解决方案,我可以修改脚本以直接引用主应用程序图标吗?

旁注:图像是一个包含四个图标的图标组,用作标题栏图标。

1个回答

首先,我们需要了解什么是RCDATA资源。这是它在MSDN 中的描述

RCDATA 为应用程序定义了原始数据资源。原始数据资源允许直接在可执行文件中包含二进制数据。

nameID RCDATA [optional-statements] {raw-data ...}

raw-data
由一个或多个整数或字符串组成的原始数据。整数可以用十进制、八进制或十六进制格式指定。为了与 16 位 Windows 兼容,整数存储为 WORD 值。您可以通过使用“L”后缀限定整数来将整数存储为 DWORD 值。

在您的示例中,我们看到其配置TfrmMain是源自TForm并用作程序用户界面的主要形式

考虑到这一点,我们可以理解Icon.Data为应用程序存储一个看起来像是它的十六进制表示的图标
事实上,如果我们查看IANAICO 注册信息,我们可以看到Magic NumberICO 文件的(文件中的前四个八位字节以十六进制表示)与您的示例中的相同:

附加信息:
1.幻数:00 00 01 00
2.文件扩展名:ico

当您将其Icon.Data与您所说的具有不同文件格式的另一个图像进行比较时,您将看不到匹配项,因为每种图像格式具有不同的结构和规格,因此,即使文件看起来相同,二进制数据也不同。

您可以使用 python 轻松地将十六进制字符串转换为图像并将图像转换为十六进制字符串:

import binascii

# open ico file and read its binary content
with open('example.ico', 'rb') as f:
    content = f.read()

# convert the binary content to hexadecimal string
hexstr = binascii.hexlify(content)

# write this hexadecimal string to output.ico as binary
with open('output.ico','wb') as f:
    f.write(binascii.unhexlify(hexstr))

您可以将 复制并粘贴Icon.Data到纯文本中,然后使用 python 阅读它:

with open('hexadecimal.txt', 'r') as f:
    content = f.read()

然后使用上面的示例将内容以二进制格式写入文件。

有了Resource Hacker你,然后可以删除,添加,编辑和编译资源二进制文件。