如何调试/分析受 Themida 保护的二进制文件

逆向工程 艾达 调试 开箱 反调试 反倾销
2021-07-09 18:42:33

背景:我有一个应用程序在 Windows 10 版本 1511 之前一直运行良好,但从版本 1607 开始就崩溃了。它会产生访问冲突:

STACK_TEXT:  
03799f54 00f91cfa     24d1ae78 0000000f 0000001f GDI32!ext-ms-win-gdi-internal-desktop-l1-1-0_NULL_THUNK_DATA_DLB+0xc22b
WARNING: Stack unwind information not available. Following frames may be wrong.
0379a01c 01570000     00000000 00000000 00000023 THEEXE+0xb91cfa
0379a038 77015125     00000000 00000000 01ba0254 THEEXE+0x1170000
0379a088 00cd691c     0379afa8 016a5276 00000000 ntdll!RtlpAllocateHeapInternal+0x155
00000000 00000000     00000000 00000000 00000000 THEEXE+0x8d691c

Win10 1607 及更高版本的 GDI dll 有变化,之前只有gdi32.dllGdiPlus.dll但截至 1607gdi32.dll基本上是新 dll 的存根,gdi32full.dll

我想了解应用程序崩溃的原因并找到解决方法。exe 被打包的事实使得用 WinDbg、Ida Pro 等分析它变得非常困难。PE ID 工具建议 exe 包含 Themida(Themida v2.0.1.0 - v2.1.8.0(或更新版本)+ Hide PE Scanner Option)。

我试图遵循一个涉及 OllyDBG 的教程和一个名为的脚本Themida - Winlicense Ultra Unpacker 1.4.txt,虽然这似乎有很长的路要走,但它并没有产生正确的解压二进制文件。问题可能是某些代码在 PE 部分中定义的地址空间之外执行,因为我收到了几个这样的错误:

Memory breakpoint range reduced: OllyDbg is unable to activate memory breakpoint on the whole specified address range (EA:   ). Breakpoint is reduced to range 00401000..0086CFFF.

还尝试了 unthemida 2.0 和 unthemida 3.0,但它们在创建进程后挂起(似乎已终止)。我正在寻找有关如何解压缩 exe 的帮助或指示,以便我可以分析崩溃。

可以在此处找到具有相同问题的软件的免费版本(安装程序)。exe可以在这里找到:removed

可以通过启动应用程序并在提供的示例项目 (EAExample.eap) 上单击打开来重现崩溃。

2个回答

我找到了崩溃的原因是...... Themida 🤦‍♂️

发生的情况是,从 build 1607 及更高版本开始,一些导出使用 api 集进行了双重重定向。该应用程序导入了几个函数,Usp10.dll其中有一个 apiset 重定向到Gdi32.dll和内部Gdi32.dll有一个 apiset 重定向到Gdi32full.dll.

Themida“理解”或遵循第一个 api 集重定向并使用 asmJMP指令跳转到Gdi32.dll. 然后将 ApiSet 名称作为代码执行,导致奇怪的操作码(但它当然是 ascii 中的 api 集名称),因此故障转储没有意义。

我已经通过使用附加调试器JMP在各种 API 中将指令写入Gdi32.dll实际实现中Gdi32full.dll解决它

您可以从静态分析开始。在运行时转储文件,看看可以从转储的文件中收集到什么。您可以使用像Scylla这样的工具重建导入表一般来说,上述重建的文件已经很适合分析了。由于您提到了与 gdi32.dll 相关的文件,因此重建导入表会对您有所帮助。

如果这还不够,您将需要使用带有反反调试插件的 OllyDbg。尝试诸如 Phant0m(具有内核驱动程序)、ScyllaHide等工具。我不记得确切的配置 - 只需在 Google 上查找即可。绕过它们的反调试功能后,您应该有更好的时间分析代码或尝试解包脚本。

解压 Themida 最难的部分是它们的代码虚拟化功能。如果启用并使用它,那么您可能需要依赖解包器脚本,或者找一个知识渊博的人来反转它。那时会很艰难。