【文章标题】: 绕Themida保护,追踪真实OEP!
【文章作者】: 邓韬
【软件名称】: AutoEngine7
【软件大小】: 4,386,347 字节
【下载地址】: 自己搜索下载
【加壳方式】: Themida 2.1.x.x -->Oreans Technologies
【保护方式】: 反调试 + VM + SDK
【编写语言】: MSVC++6.0
【使用工具】: OllyICE + StrongOD.0.48 + Peid0.95
【操作平台】: XP3
【软件介绍】: 某游戏的一款工作室挂,来叫小弟研究研究,嘿嘿。
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
1.原理解析
Themida的入口点寻找过程是在堆栈中寻找Themida使用VirtualAlloc分配内存运行动态代码(如:00F50000)、正常代码基址(如:401000)的分界线。一旦该分界线被找到,如果入口点没有被VM或者变形掉;那么很容易识别入口点的代码,当然这需要对编译器入口点熟悉,不
多说了,看教程。
2.理论过程
使用Peid0.95对AutoEngine7进行查壳,显示什么都没有;关闭StrongOD保护,直接运行于调试器,显示如下一段字符串:“An internal exception occured (Address: 0xbaced5)Please, contact support@oreans.com. Thank you!”;现在开启StrongOD保护调试器,在调试器中运行程序;当程序运行起来之后查看堆栈,因为Themida有很多代码都是使用VirtualAlloc分配内存运行动态代码(如:00F50000);当前堆栈一定是加壳前的VA,但是堆栈中肯定存在有Themida外壳的动态代码地址(如:00F50000);就寻找这个分界线来饶过Themida保护顺利dump。当然前提是OEP没有被VM或者代码变形之类的保护,并且如果想运行程序,
那么Call API被保护地方需要自己修复。
3.实际过程
首先来装载程序F9运行之后,我们看下堆栈信息,堆栈信息如下,我区分一下:
0012FDAC |0012FE58 指向下一个 SEH 记录的指针
0012FDB0 |0045DD5C SE处理程序
0012FDB4 |00000000
0012FDB8 \0012FE68
0012FDBC 00457D1E 返回到 AutoEngi.00457D1E
0012FDC0 032D003E
0012FDC4 00000000
0012FDC8 00C53337 AutoEngi.00C53337
0012FDCC 0044F82B 返回到 AutoEngi.0044F82B 来自 AutoEngi.00457CD7>Memory Virtual Address
0012FDD0 00400000 AutoEngi.00400000
0012FDD4 00000000
0012FDD8 000206C6
0012FDDC 0000000A
0012FDE0 00427123 返回到 AutoEngi.00427123 来自 AutoEngi.0044F816>Memory Virtual Address
0012FDE4 00400000 AutoEngi.00400000---------------->Memory Image Base
0012FDE8 00000000
0012FDEC 000206C6
0012FDF0 0000000A 》》》》》》》》分界线、分界线、分界线、分界线、分界线、
0012FDF4 032D003E
0012FDF8 00C5536C AutoEngi.00C5536C---------------->Themida VirtualAlloc
0012FDFC 00C53337 AutoEngi.00C53337---------------->Themida VirtualAlloc
...................
0012FE48 00C5536C AutoEngi.00C5536C---------------->Themida VirtualAlloc
0012FE4C 00000000
0012FE50 0012FDF4
0012FE54 00C53337 AutoEngi.00C53337---------------->Themida VirtualAlloc
0012FE58 0012FFE0 指向下一个 SEH 记录的指针
0012FE5C 0042C028 SE处理程序
0012FE60 0046C940 AutoEngi.0046C940
0012FE64 00000000
0012FE68 00000000
0012FE6C 77DE187C advapi32.77DE187C
0012FE70 00C53337 AutoEngi.00C53337---------------->Themida VirtualAlloc
0012FE74 032D0035
0012FE78 00C5536C AutoEngi.00C5536C---------------->Themida VirtualAlloc
0012FE7C 00000000
0012FE80 77DE1B54 advapi32.77DE1B54
0012FE84 00C53337 AutoEngi.00C53337---------------->Themida VirtualAlloc
0012FE88 032D001B
0012FE8C 00C5536C AutoEngi.00C5536C---------------->Themida VirtualAlloc
0012FE90 00000000
0012FE94 77E074CE advapi32.77E074CE
0012FE98 00C53337 AutoEngi.00C53337---------------->Themida VirtualAlloc
0012FE9C 032D0006
0012FEA0 00C5536C AutoEngi.00C5536C---------------->Themida VirtualAlloc
0012FEA4 00000000
0012FEA8 77D277C0 user32.77D277C0
0012FEAC 00C53337 AutoEngi.00C53337---------------->Themida VirtualAlloc
0012FEB0 032D0016
0012FEB4 00C5536C AutoEngi.00C5536C---------------->Themida VirtualAlloc
0012FEB8 00000000
0012FEBC 77D2E805 user32.77D2E805
当找到这个分界线以后,查看内存地址,目测OEP地址在哪,当然你也可以使用脚本。我们从分界线上一个地址开始查找,
来看下00427123这里的汇编代码是什么,我们可以看到00427123是挨着Call ExitProcess的:
00427044 55 push ebp ; MSVC++6.0 OEP入口点
00427045 8BEC mov ebp, esp
00427047 6A FF push -0x1
00427049 68 40C94600 push 0046C940
0042704E 68 28C04200 push 0042C028
00427053 64:A1 00000000 mov eax, dword ptr fs:[0]
00427059 50 push eax
0042705A 64:8925 0000000>mov dword ptr fs:[0], esp
00427061 83EC 58 sub esp, 0x58
00427064 53 push ebx
00427065 56 push esi
00427066 57 push edi
00427067 8965 E8 mov dword ptr [ebp-0x18], esp
0042706A E8 918F1103 call 03540000 ; Themida SDK Protect
0042706F 90 nop
...............................................................
004270C2 8975 FC mov dword ptr [ebp-0x4], esi
004270C5 E8 584A0000 call 0042BB22
004270CA E8 B2490000 call 0042BA81
004270CF A3 3CE18E00 mov dword ptr [0x8EE13C], eax
004270D4 E8 3B480000 call 0042B914
004270D9 A3 A0888800 mov dword ptr [0x8888A0], eax
004270DE E8 08460000 call 0042B6EB
004270E3 E8 4B450000 call 0042B633
004270E8 E8 B4260000 call 004297A1
004270ED 8975 D0 mov dword ptr [ebp-0x30], esi
004270F0 8D45 A4 lea eax, dword ptr [ebp-0x5C]
004270F3 50 push eax
004270F4 E8 4C8FED02 call 03300045 ; Themida SDK Protect
004270F9 90 nop
004270FA E8 EF440000 call 0042B5EE
004270FF 8945 9C mov dword ptr [ebp-0x64], eax
00427102 F645 D0 01 test byte ptr [ebp-0x30], 0x1
00427106 74 06 je short 0042710E
00427108 0FB745 D4 movzx eax, word ptr [ebp-0x2C]
0042710C EB 03 jmp short 00427111
0042710E 6A 0A push 0xA
00427110 58 pop eax
00427111 50 push eax
00427112 FF75 9C push dword ptr [ebp-0x64]
00427115 56 push esi
00427116 56 push esi
00427117 E8 EA9C1003 call 03530E06 ; Themida SDK Protect
0042711C 90 nop
0042711D 50 push eax
0042711E E8 F3860200 call 0044F816 ; WinMain
00427123 8945 A0 mov dword ptr [ebp-0x60], eax
00427126 50 push eax
00427127 E8 A2260000 call 004297CE ; ExitProcess
现在在OEP处下一个硬件断点,以便dump,查壳验证是否为VC++6.0。结果:Microsoft Visual C++ 6.0,当然想运行起来就需要自己修复SDK保护。图片
thx:
海风大哥提供的StrongOD.0.48
kanxue大哥提供的OllyICE.1.10
因为有了你们的工具才有这篇文章的诞生。
--------------------------------------------------------------------------------
【经验总结】
努力学习,天天向上,写文章好累,钱不是那么好赚,代码基本上都给VM了,不会破。
--------------------------------------------------------------------------------
【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!
2012年11月09日 2:27:36
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)