在继续之前,我希望您记住我在解压缩可执行文件方面还比较陌生。所以我有一些

最近我一直在尝试解压缩可执行文件(x64体系结构),也就是找到OEP并还原随Themida x64打包的IAT:

我曾尝试在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来扔掉了。感谢所有帮助!谢谢:)

#1 楼

无论如何,拆开Themida的包装,尤其是较新的版本,绝非易事。从字面上看,它与拆开UPX的世界是完全不同的,如果您不熟悉拆箱,则绝对没有必要拆箱Themida。原因如下:

Themida使用极其复杂的虚拟机环境,结合了书中的每个反调试和反分析技巧,并结合了许多不同的混淆方法。例如,在UPX打包二进制文件中,您只需要找到OEP并将其转储下来,然后最终重建IAT。在Themida二进制文件中,代码的不同部分在虚拟机中运行,并且掩盖了目标程序的行为。像Themida一样,解压缩受VM保护的打包器的最佳方法是对其进行虚拟化处理,这涉及确定打包器使用的整个指令集并编写脚本来解释该语言。所有这些只是一步。 Themida还严重阻塞了导入地址表,拆分了整个程序,并且一次只能加载一部分(这可以防止您像使用UPX一样“转储”整个程序),然后按常规将其卸载,并实施了一系列反分析技巧,其中许多技巧都列在其网站上。 Themida的解压缩非常复杂,以至于大多数人都编写脚本,因此您可以搜索要解压缩并使用该给定版本的脚本。如果版本是新的并且没有脚本,那么就您现在的专业水平而言,这将是一个非常非常漫长而艰巨的任务。

进一步阅读:

可执行代码自动去模糊化的通用方法

Peter Ferrie的反解包技巧

Themida / WinLicense手动解包教程

评论


感谢您澄清这一点。我认为这是一项非常艰巨的任务。我想我会仔细阅读。

– Graham Best
17/12/14在15:05