拆箱时搬迁问题

逆向工程 开箱 包装工 地址 进口改造
2021-06-29 11:05:51

我正在尝试学习如何进行基本的 EXE 解包。我已经阅读了 PE 标头的工作原理、部分、IAT,并且我已经对汇编有了一些了解。

我开始使用 UPX 压缩我的简单 x64.exe 并尝试手动解压缩它。

我逐步完成了存根代码,确定了提取的原始代码所在的位置(.UPX0 部分),找到了 OEP 和 IAT。有了这个,我就能够使用 Scylla 转储进程并正确重建 IAT。

但是,当我运行解压缩的 exe 时,它​​失败了。我决定调试解压后的 exe 并意识到代码试图寻址一个静态变量,该变量最初存储在 .data 部分但现在无效并生成内存冲突异常(程序崩溃)。

无论如何,让我感到沮丧的是,我意识到我需要修复重定位,因为原来的 .reloc 部分已经丢失。我煞费苦心地遍历UPX代码并确定需要重新定位的地址在哪里。我使用 PE 资源管理器手动重建 .reloc 部分。然而,当我意识到总共有100个要通过时,我在6个地址后放弃了!

我的问题是,是否有一种工具可以自动修复重定位(很像 Scylla 对 IAT 所做的),还是我一直在手动进行?

非常感谢Z

3个回答

我找到了一个解包 UPX x64.exe 的工具,它对我有用。它被称为 XVolkolak v0.22 我在这里找到它:http ://ntinfo.biz/index.html 它是 一个通用工具,因此它可以解压缩其他包装器。祝你好运。祝你今天过得愉快。

AFAIK 没有现有的工具,但您应该能够使用 DOS 解包器使用的方法创建一个:

  1. 运行一次二进制文件,将其转储到入口点
  2. 第二次运行它,强制负载基础不同(例如,在首选负载基础上映射一些内存,或重新启动以重新初始化 ASLR)。捕获第二个转储。
  3. 比较两个转储。有差异的位置应该是搬迁。为他们创建一个重定位表。

特别是对于 UPX,有一种更简单的方法:重定位表以预定义的格式存储,因此您只需要查找和解析它。有关更多信息,请参阅 UPX 源代码。

请注意,如果您只是对映像库进行硬编码并删除该.reloc部分,则不必考虑重定位

通常,EXE 文件根本不用于可重定位,因为它们不需要,因为它们有自己的地址空间。随着 ASLR 的引入,EXE 文件获得了一个.reloc安全表,但如果没有表,它们仍然可以正常工作。

因此,如果您有一个已重新定位的文件的转储,只需在 PE 标头中“修复”该映像库并删除该.reloc部分,您的二进制文件就可以工作了。