有各种各样的工具可以编辑Windows可执行文件的资源。
这些工具提供了非常简单的界面来更改程序的外观。
替换图标,文本和菜单可以很容易地完成,而无需任何知识。在反转时。

我的问题是,我必须采取什么选择来防止如此容易地编辑资源?

#1 楼

资源只是具有定义的常量的标准结构,但最后,它只是缓冲区的递归结构,无论其包含什么(这是标准布局)。

理论上它可以包含任何内容-任何深度,循环,无效类型等...但是标准API不能与它们一起使用。

因此,您需要确保在加密或压缩资源时,它们需要在使用这些API中的任何一个之前,可以对其进行恢复(包括资源目录结构及其内容),这可能并不明显。

特别是,某些操作系统甚至在文件被使用之前都会被OS使用。被执行,例如第一个图标,清单和版本信息-因此您可能希望保持它们不变。

防止琐碎资源编辑的一种简单方法是在选定资源上运行流密码,最后的二进制文件(在链接器将它们放置到位并在DataDirectory中生成资源条目之后),并还原这些资源按需或程序初始化。

如果您正在寻找现成的解决方案,那么许多不错的打包器(例如PECompact)都支持资源压缩,从而防止了外部资源编辑。

评论


我不知道,这里是否可以进行某种加载时的拆包/解密工作?资源编辑器大概使用磁盘上的数据,而不是内存中的数据。

–布伦丹·多兰·加维特(Brendan Dolan-Gavitt)
13年3月30日在16:52

您说得对,我编辑了答案。

–天使
13年3月30日在17:48

#2 楼

一个优雅而简单的解决方案是对可执行文件进行签名,并在启动时验证签名(任何更改都会使签名无效)。即使有人修补了您的签名检查,签名仍然无效,这清楚地表明该exe与您提供的exe不同。

我的其他想法是使用exe包装器或使用资源的校验和(两者都已在@angealbertine答案中建议)。

#3 楼

此外,我们可以利用编辑器本身中的错误来防止篡改我们的资源。
有趣的是,大多数资源编辑器都不知道如何解析非典型(不是非常非典型)的PE文件。例如,某些编辑器假定资源部分名称必须始终为.rsrc。示例:



Resource Hacker


插入特殊资源导致Resource Hacker陷入无限循环。此处演示:http://code.google.com/p/ollytlscatch/downloads/detail?name=antiResHacker.exe
插入特殊的RT_STRING资源导致Resource Hacker崩溃。
假定大小IMAGE_OPTIONAL_HEADER结构的q假定为sizeof(IMAGE_OPTIONAL_HEADER),当前为十六进制的0xE0,甚至可以更大。具有更大的值会导致Resource Hacker丢弃整个PE文件。



Restorator



与1c。
使用NumberOfRvaAndSizes字段,可以很容易地伪造为0xFFFFFFFF。这将导致Restorator丢弃整个PE文件。
假定资源段名称必须为.rsrc。更改其他任何内容。这将导致Restorator丢弃整个PE。
任何将Characteristics字段设置为IMAGE_SCN_CNT_UNINITIALIZED_DATA的资源段以及其他特征都将被Restorator丢弃。

此处的演示:http://pastebin.com/ezsDCaud



评论


聪明!但是,问题是:您的一些建议似乎超出了规范的定义。这可能会导致加载程序失败,或者导致当前或将来的Windows版本中的资源功能(例如loadstring)失败?

–雷姆科
13年4月3日在17:08

Microsoft不太可能改变其PE加载和遍历代码的基本行为。我从未见过他们这样做。行为的唯一变化是使用win9x内核时返回的,并且与NT内核不同。微软非常清楚,所有类型的链接器都会对PE文件格式产生不同的解释,我相信他们知道自己不会碰任何东西。实际上,PE文件格式是如此令人惊讶地变化,唯一的常数就是与Window代码的兼容性。当然,在制作这样的mod后要进行良好的测试。

–达斯塔
13年4月4日在21:47



指向antiResHacker.exe的链接已死

– Fred Concklin
2015年2月17日下午13:57