首页
社区
课程
招聘
[原创]绕Themida保护,追踪真实OEP!
发表于: 2012-11-9 02:34 18551

[原创]绕Themida保护,追踪真实OEP!

2012-11-9 02:34
18551
【文章标题】: 绕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期)

上传的附件:
收藏
免费 0
支持
分享
最新回复 (24)
雪    币: 3277
活跃值: (1992)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
看了一时半也没看懂,恐怕只有大牛你自己懂吧?

话说,你这是什么版本的, 2.0 以前的版本和 2.18 以后的版本的入口完全不一样。

所以不是方法通样的,要是没 VM OEP 的看了教程人人会脱,但是VM 了 OEP,恐怕只有大牛们才懂的脱。
2012-11-9 02:49
0
雪    币: 278
活跃值: (709)
能力值: ( LV15,RANK:520 )
在线值:
发帖
回帖
粉丝
3
不好意思,实在不知道怎么表达,这个版本没查出来。
2012-11-9 02:51
0
雪    币: 38
活跃值: (205)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
mark…………
2012-11-9 02:54
0
雪    币: 278
活跃值: (709)
能力值: ( LV15,RANK:520 )
在线值:
发帖
回帖
粉丝
5
上面的教程就是通过在调试器中正常运行程序,然后通过查看堆栈地址来寻找OEP和VirtualAlloc的分界线。然后来定位OEP,当然OEP要保持原样才能识别。Themida这类一般VirtualAlloc动态代码运行,就利用这点。
2012-11-9 02:56
0
雪    币: 55
活跃值: (519)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
6
没看懂。呵呵。
程序运行起来后,堆栈的内容已经在实时变化了,如何看?
2012-11-9 04:06
0
雪    币: 1844
活跃值: (35)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
7
你不懂不要乱说, VM oep  一丁点用处都没有。。。。。。 ( SDK 保护一堆用户定义的函数才要命)
2012-11-9 04:21
0
雪    币: 3277
活跃值: (1992)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
这是 PEiD 的最新特征库,添加到 userdb.txt 的最后,然后再查一下是什么版本。


[Themida 2.1.x.x -->Oreans Technologies * Sign.By.cxj98]
signature = 83 EC ?? 50 53 E8 ?? ?? ?? ?? CC
ep_only = True

[Themida 2.0.x.x - 2.1.x.x -->Oreans Technologies (Hide From PE Scanners)]
signature = 89 1C 24 E8 01 00 00 00 CC
ep_only = False

[Themida 2.0.x.x -->Oreans Technologies]
signature = B8 00 00 00 00 60 0B C0 74 ??
ep_only = 1

2012-11-9 04:22
0
雪    币: 3277
活跃值: (1992)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
这个不懂,见过 VM OEP 达到 15 级的,手工修补了十几行代码。抽取了 3 个 call。
2012-11-9 04:54
0
雪    币: 55
活跃值: (519)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
10
楼主的文章你看懂了么,为啥子我没明白什么意思。
云里雾里的。
2012-11-9 04:56
0
雪    币: 3277
活跃值: (1992)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
就是看不懂,所以才说了文章除了楼主本人看的懂以外,再也没有第二个人看的懂了。
2012-11-9 05:25
0
雪    币: 278
活跃值: (709)
能力值: ( LV15,RANK:520 )
在线值:
发帖
回帖
粉丝
12
这个示例是个窗口程序,基于消息基制占用的堆栈大小。堆栈是不会变化太大的,我是通过拉OllyICE的列表框找的。找的好辛苦,一个傻办法。
2012-11-9 07:08
0
雪    币: 278
活跃值: (709)
能力值: ( LV15,RANK:520 )
在线值:
发帖
回帖
粉丝
13
让各位见笑了,本来打算给大家录象的,又觉得不方便,没想到弄巧成茁。
2012-11-9 07:08
0
雪    币: 375
活跃值: (12)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
14
没v的找入口内存断点一般都可以吧。

另外,从代码上来看,LZ标记的“Themida SDK Protect”,是抽掉的IAT。
2012-11-9 09:38
0
雪    币: 297
活跃值: (120)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
15
赶紧占位啊
2012-11-9 10:20
0
雪    币: 3279
活跃值: (3331)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
16
到达OEP 后 配合 Oreans UnVirtualizer 可修复部分虚拟代码
2012-11-9 11:14
0
雪    币: 2411
活跃值: (1412)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
17
邓韬要表达的意思,是不是这样?

1. F9 运行起来以后,从堆栈找线索 (分界线)。
2. 找到分界线以后往上拉,凭经验找熟悉代码可以定位到 OEP。

纯粹只是定位 OEP 的一种方法,不是完整脱壳,不涉及修复,不要想太多。。。
2012-11-9 11:34
0
雪    币: 147
活跃值: (40)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
18
很巧啊。 这个软件 我也有分析。。
当时 使用 脚本跑到 oep ,iat修复,, 但是 后续 还是有些sdk的东东。 脱下来的没啥用。
动态 调试 使用 插件 还原 部分 关键代码 也 没跟出个啥结果。。。
无奈没时间 放弃了。
2012-11-9 12:04
0
雪    币: 278
活跃值: (709)
能力值: ( LV15,RANK:520 )
在线值:
发帖
回帖
粉丝
19
tmd的很多代码不是使用VirtualAlloc分配然后动态写入并执行代码,如果程序基址是00400000,那么随便断一个地点或者某个Api函数,然后看堆栈哪部分开始大量出现的004xxxxx.我就这样判断的。不会修复
2012-11-9 15:33
0
雪    币: 211
活跃值: (21)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
纯粹万能找OEP方法。
用在一些没有VM。还可用。
不代表修复。修复而且无法运行。
TMD到的OEP也是虚拟的。并非真OEP
2012-11-11 19:49
0
雪    币: 33
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
俺是新手。咋看的云里雾里的
2012-11-12 21:12
0
雪    币: 211
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
纯粹是思路探讨 不能修复等于无用
2012-11-17 00:03
0
雪    币: 123
活跃值: (50)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
赶紧占位啊 。
2012-11-20 09:10
0
雪    币: 51
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
等导入表处理完成。壳会进入一个Cisc模式的虚拟机,在虚拟机的出口Handle下段点。直接到OEP。
2012-11-27 11:51
0
雪    币: 4738
活跃值: (4286)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
显示如下一段字符串:“An internal exception occured (Address: 0xbaced5)Please, contact support@oreans.com. Thank you!”;现在开启StrongOD保护调试器,在调试器中运行程序

这里所说的开启保护能截个图吗??怎么开启,你所指的是配置ollydbg.ini来隐藏OD窗口,改变驱动名称之类的吗??
2018-11-9 17:55
0
游客
登录 | 注册 方可回帖
返回
//