我已经从事黑客和改装软件工作多年了,并且学到了很多东西,但是仍然有些事情困扰着我,这种情况就是一种。我注意到某些PE包含一个RCData部分,该部分可以容纳各种不同类型的数据和信息。以我的经验,数据通常是二进制文件或对话框类。在这种情况下,我试图弄清楚如何以只能描述为对话框的二进制原始格式的方式存储图像(感谢@Megabeets刷新内存)。在我缺乏经验的日子里,我认为这些文件中的图像数据直接存储为纯文本或十六进制值。当我将资源数据中的数据与有问题的图像(以不同格式存储在不同树中)进行比较时,它们不匹配。在某些情况下,这些数据是其自身的图像,没有可比的替代方案。以下是有问题的数据的屏幕截图:

我知道此数据用于图标,因为删除它也会删除应用程序中的图像。对于某些程序,此数据可以是对话框GUI资产或位图。如何将这些数据“转换”为图像,反之亦然,以进行修改或替换?
作为一种潜在的替代解决方案,我可以修改脚本以直接引用主应用程序图标吗?
注意:图像是一个包含四个图标的图标组,并用作标题栏图标。

#1 楼

首先,我们需要了解什么是RCDATA资源。这就是MSDN中的描述方式:RCDATA定义了应用程序的原始数据资源。原始数据资源
允许直接在可执行文件中包含二进制数据。

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

原始数据
由一个或多个整数或字符串组成的原始数据。整数可以十进制,八进制或
十六进制格式指定。为了与16位Windows兼容,
将整数存储为WORD值。您可以通过
后缀“ L”限定整数来将其存储为DWORD值。在您的示例中,我们看到TfrmMain的配置是主要形式从TForm派生的,用作程序的用户界面。

考虑到这一点,我们可以了解到Icon.Data以看起来像它的十六进制表示形式存储了该应用程序的图标。
实际上,如果我们看一下ICO,在IANA上的注册信息中,我们可以看到ICO文件的Magic Number(文件中的前四个八位字节,以十六进制表示)与您的示例相同:


其他信息:
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可以删除,添加,编辑和编译二进制文件中的资源。

评论


我必须说,您的回答确实很棒而且做得很好。不幸的是,我不知道如何编程或使用Python之类的语言来执行任务。尽管如此,我对软件的工作原理有广泛的了解似乎有些奇怪(或具有讽刺意味)。即便如此,我仍然渴望对此进行研究,一旦我可以利用您的回答,我就会接受并支持。感谢您的答复。

–门德利先生
17年8月21日在8:25



别客气!这是一个非常简单的脚本,您可以轻松地使其适应您所知道的大多数高级语言。如果您愿意,我们可以帮忙:)

–巨型甜菜
17年8月21日在12:01

那就好了,但是我的编程技能只限于基本的批处理脚本...

–门德利先生
17年8月21日在17:32

使用Batch很难做到这一点。 Powershell,Bash和外部程序如何?您甚至可以在线进行操作:hexed.it

–巨型甜菜
17年8月21日在18:47

我会给PowerShell一个机会。不要误会我的意思,我相信您的Python方法会起作用,我只需要首先学习如何使用它即可。因此,我应该如何使用PowerShell处理此问题?

–门德利先生
17年8月21日在20:13