有多种工具可以编辑 Windows 可执行文件的资源。这些工具提供了一个非常简单的界面来更改程序的外观和感觉。无需任何倒车知识即可轻松替换图标、文本、菜单。
我的问题是,我有什么选择可以防止资源被如此轻松地编辑?
有多种工具可以编辑 Windows 可执行文件的资源。这些工具提供了一个非常简单的界面来更改程序的外观和感觉。无需任何倒车知识即可轻松替换图标、文本、菜单。
我的问题是,我有什么选择可以防止资源被如此轻松地编辑?
此外,我们可以利用编辑器本身的错误来防止篡改我们的资源。这里有趣的部分是大多数资源编辑器不知道如何解析非典型(不是非常非典型)的 PE 文件。例如,某些编辑器假定资源部分名称必须始终为.rsrc
. 例子:
插入特殊资源导致Resource Hacker进入无限循环。演示在这里:http : //code.google.com/p/ollytlscatch/downloads/detail?name=antiResHacker.exe
插入特殊RT_STRING
资源导致资源黑客崩溃。
它假设IMAGE_OPTIONAL_HEADER
结构的大小假定为sizeof(IMAGE_OPTIONAL_HEADER)
,当前0xE0
为十六进制,而它甚至可以更大。将大小设置为更大的值会导致 Resource Hacker 丢弃整个 PE 文件。
NumberOfRvaAndSizes
可以轻易伪造的领域0xFFFFFFFF
。这会导致 Restorator 丢弃整个 PE 文件。.rsrc
. 换别的吧。这会导致 Restorator 丢弃整个 PE。Characteristics
字段设置为IMAGE_SCN_CNT_UNINITIALIZED_DATA
其他特性的任何资源部分。演示在这里:http : //pastebin.com/ezsDCaud
资源只是具有定义常量的标准结构,但最终,它只是缓冲区的递归结构,无论它包含什么(这里是标准布局)。
理论上它可以包含任何内容——任何深度、循环、无效类型等……但标准 API 将无法与它们一起使用。
因此,您需要确保,如果您加密或压缩资源,则需要在使用任何这些 API 之前恢复它们(资源目录结构及其内容),这可能并不明显。
特别是,某些资源甚至在文件执行之前就被操作系统使用,例如第一个图标、清单和版本信息 - 因此您可能希望保持这些完整。
防止微不足道的资源编辑的一种简单方法是在选定的资源上运行流密码,在最终的二进制文件上(在链接器将它们放置到位并在 DataDirectory 中生成资源条目之后),并根据需要或在程序初始化。
如果您正在寻找现成的解决方案,许多优秀的打包程序如PECompact 都支持资源压缩,从而防止外部资源编辑。