解压 Themida 打包的 x64 可执行文件?

逆向工程 开箱
2021-06-20 09:28:08

在我们继续之前,我希望您记住,我对解压可执行文件比较陌生。所以我有几个

最近我一直在尝试解压一个可执行文件(x64 架构),也就是找到 OEP 并恢复 IAT,它与 Themida x64 打包在一起:

我试过在 LoadLibraryA 上断点。我读过那是解决它的好方法。

但是,我不知道接下来要做什么。它把我带到这个页面:

00007FFE291AA240 | 48 89 5C 24 08           | mov qword ptr ss:[rsp+8],rbx           |
00007FFE291AA245 | 48 89 74 24 10           | mov qword ptr ss:[rsp+10],rsi          | [rsp+10]:LoadLibraryA
00007FFE291AA24A | 57                       | push rdi                               |
00007FFE291AA24B | 48 83 EC 20              | sub rsp,20                             |
00007FFE291AA24F | 48 8B F9                 | mov rdi,rcx                            | rcx:"USER32.dll"
00007FFE291AA252 | 48 85 C9                 | test rcx,rcx                           | rcx:"USER32.dll"
00007FFE291AA255 | 74 15                    | je kernelbase.7FFE291AA26C             |
00007FFE291AA257 | 48 8D 15 FA 2F 10 00     | lea rdx,qword ptr ds:[7FFE292AD258]    | 7FFE292AD258:"twain_32.dll"
00007FFE291AA25E | FF 15 B4 C9 0F 00        | call qword ptr ds:[<&_stricmp>]        |
00007FFE291AA264 | 85 C0                    | test eax,eax                           |
00007FFE291AA266 | 0F 84 72 A8 03 00        | je kernelbase.7FFE291E4ADE             |
00007FFE291AA26C | 45 33 C0                 | xor r8d,r8d                            |
00007FFE291AA26F | 33 D2                    | xor edx,edx                            |
00007FFE291AA271 | 48 8B CF                 | mov rcx,rdi                            | rcx:"USER32.dll"
00007FFE291AA274 | E8 17 00 00 00           | call <kernelbase.LoadLibraryExA>       |
00007FFE291AA279 | 48 8B 5C 24 30           | mov rbx,qword ptr ss:[rsp+30]          | [rsp+30]:LoadLibraryA
00007FFE291AA27E | 48 8B 74 24 38           | mov rsi,qword ptr ss:[rsp+38]          |
00007FFE291AA283 | 48 83 C4 20              | add rsp,20                             |
00007FFE291AA287 | 5F                       | pop rdi                                |
00007FFE291AA288 | C3                       | ret                                    |

我已经获得了一些可以找到 API 的地址,但它并没有加载所有这些地址!(据我所见)

例如,这个地址我只加载了 Windows 库(kernel32.dll,KernelBase.dll,...),但由于它缺少大量的库(DirectX,OpenGL,...),我把它扔掉了不是 OEP。

我已经解压了用 UPX 打包的文件,Themida 难倒我了。

感谢所有帮助!谢谢 :)

1个回答

拆开 Themida 的包装,尤其是较新的版本,无论如何都不是一件小事。从字面上看,这与拆包 UPX 完全不同,如果您不熟悉拆包,则绝对没有必要尝试拆开 Themida。原因如下:

Themida使用极其复杂的虚拟机环境,结合书中的每一个反调试和反分析技巧,结合许多不同的混淆方法。例如,在 UPX 打包的二进制文件中,您只需要在最终重建 IAT 之前找到 OEP 并将其转储即可。在 Themida 二进制文件中,代码的不同部分在虚拟机中运行,它掩盖了目标程序的行为。解压像 Themida 这样受 VM 保护的打包程序的最佳方法是去虚拟化它涉及找出加壳程序使用的整个指令集并编写脚本来解释该语言。所有这一切都只是一步。Themida 还严重阻碍了导入地址表,拆分了整个程序并且一次只加载了一部分(这可以防止您像使用 UPX 那样“转储”整个程序),然后在每个例程的基础上卸载它,并实施了一堆反分析技巧,其中许多都列在他们的网站上。

此外,您需要知道您正在处理的 Themida 的确切版本。Themida 的解包非常复杂,以至于大多数人都编写脚本,因此您可以搜索要解包的给定版本的脚本并尝试使用它。如果版本是新的并且没有脚本,考虑到你现在的专业水平,这将是一个非常非常漫长而艰巨的任务。

进一步阅读:

可执行代码自动反混淆的通用方法

Peter Ferrie 的反拆包技巧

Themida/WinLicense 手册解包教程