风吹屁屁凉 发表于 2010-7-1 15:49

【参赛】Themida/Winlicense不用修复VM_OEP脱壳教程

大家好,我是吾爱破解论坛的风吹屁屁凉同学,相信一些老朋友还记得我,去年吾爱视频大赛上我也有参加比赛,而且还得了个奖章

吾爱破解论坛———第二届动画教程大赛 (参赛时间:2010年6月1日-2010年7月15日)
http://www.52pojie.cn/thread-47949-1-1.html
奖品丰厚啊,经不住诱惑,我又来参加了,今天要做的这个教程是一个关于TMD/WL脱壳的.

本板块CM等附件,下载不扣CB,不要钱就可以下载,大家可以来这里下演示程序,我已经发布了
Themida / Winlicense v1.8x - v2.x UnPackMe
http://www.52pojie.cn/thread-50439-1-1.html

此教程演示说明:
Delphi写的程序,加壳只有使用了一个加密选项,就是VM了入口代码,常规的方法是脱壳修复OEP代码才可以运行,特别是Delphi的程序,入口十几行代码,补代码会补死人的,做这个的目的是为了演示另一种未公开的不用修复OEP就可以直接脱壳的方法,做下这个脱壳教程参加动画大赛,听说有奖品拿,哈哈!

很多大牛都跟帖了,有我偶像Hmily还有小生我怕怕同学还有猥琐的ximo妞,强大的当红小生版主已经脱壳了,他使用的方法就是修复OEP原始代码,我记得好像有十来行,太有毅力了,我这个教程的重点就是,不用修复OEP的代码,直接dump修复iat就可以运行,和脱常规压缩壳差不多,不用考虑OEP代码被偷,好了,废话结束,开始正式进入教程

首先,要想调试TMD的程序,你就要能过它的反调试.吾爱上有很多大牛已经给出现成的东西,比如:

如果你的OD被Anti了 By Nooby
http://www.52pojie.cn/thread-31095-1-1.html

吾爱破解专用版ollydbg by 小生我怕怕
http://www.52pojie.cn/thread-14986-1-1.html

StrongOD.v0.3.4.By.海风月影
http://www.52pojie.cn/thread-37759-1-1.html

这些是调试的前提,这么多大牛给出的好东西,目前可以调试所有的加密壳,包括VMP啊TMD啊ZP啊这些,肯定是没有问题的,先载入OD吧

可以看到,我是加的WL2.1.0.1的最新版,老版本的区段是这样的:
            //1
.rsrc       //2         
.idata      //3      
.Themida    //4
新版是OD里面那种了,其实,他只是在入口前面加了点垃圾而已,这里
005B5000就是.Themida    //4
我们可以单步走一下就知道了,这个教程我会做的很慢很详细,很多大牛会觉得太简单可以拉着看,我尽量不用快捷键,使用鼠标点击给大家看.
005B5000    B8 00000000          mov eax,0                        ; 这里明显可以看出来是TMD的入口了吧,代码都还原了,前面写错了,没什么太大关系,继续走.
由于我演示的是另外的一种脱壳方法,所以你看教程之前应该有补OEP的脱壳经验才好.


TMD/WL入口点查找方法:
1. .text段下内存写入断点,shift+F9,取消内存断点.
2. bp GetProcessHeap+C,F9,取消断点.
3. .text段下F2断点,F9到oep或者oep的第一个call里面的位置.
这里补充下,去OEP的思路,壳先填充数据,然后填充IAT,然后开始模拟OEP代码,这样下去的.

这是我自己总结的经验,我们先到OEP去看看,这里大家熟悉吧,Delphi 第一个call里面的内容,我不说这么来的了,这个以前很多教程说过,可以搜索下,吾爱有很多.我们看下IAT的情况,IAT被变形了,为了节省时间可以直接用UIF修复IAT。我们现在先修复下IAT,然后Dump一份修复IAT保存下来,IAT修复好了,我们来Dump,入口点我们先修复成这个第一个call的地方.好,dump修复完了,下面就开始关键了,我们继续F8走005A097E    68 0B4A5D0A          push 0A5D4A0B                  ; 2.key
005A0983^ E9 AD3EF7FF          jmp Themida_.00514835            ; jmp Vm_Start
005A0988    68 694A5D0A          push 0A5D4A69                  ; 3.key
005A098D^ E9 A33EF7FF          jmp Themida_.00514835            ; jmp Vm_Start
005A0992    68 084B5D0A          push 0A5D4B08                  ; 4.key
005A0997^ E9 993EF7FF          jmp Themida_.00514835            ; jmp Vm_Start
005A099C    68 664B5D0A          push 0A5D4B66                  ; 5.key
005A09A1^ E9 8F3EF7FF          jmp Themida_.00514835            ; jmp Vm_Start
005A09A6    68 A84B5D0A          push 0A5D4BA8                  ; 6.key
005A09AB^ E9 853EF7FF          jmp Themida_.00514835            ; jmp Vm_Start不知道你们有这样注意过,TMD/WL/CV的VM入口就是上面这个样子的,Vm_Start和Vm_Retn包括Vm_Oep都在.idata下面这个区段里。push key
Jmp Vm_Start   进入虚拟机00514835    9C               pushfd                        ; Vm_Start虚拟机入口00519518    311C24             xor dword ptr ss:,ebx
0051951B    331C24             xor ebx,dword ptr ss:
0051951E    8B2424             mov esp,dword ptr ss:
00519521    61               popad
00519522    9D               popfd
00519523    C3               retn                            ;Vm_Retn    虚拟机出口我们继续走,看会怎么样,这个过程类似找丢失的OEP值,其实不用找,我这只是演示为什么,方便大家理解,由于IAT修复后会导致出错,直接重来下,前面的我直接过了,硬件断点过来
0044DA04    53                   push ebx                         ; 第二个call里面的值
刚有没有注意到,常规的方法是在.text段上下F2断点找代码入口,其实虚拟机的出口就是跳向原始的call里面的值了,也就是从虚拟机出来就进入原始没有加密的代码里.我们只要在出口下好断点就能看到返回地址了,我们看看原始的入口点代码.代码我贴出来:1.004D7210 > $55               push ebp
004D7211   .8BEC             mov ebp,esp
004D7213   .83C4 F0          add esp,-10
004D7216   .B8 886F4D00      mov eax,UnPackMe.004D6F88
004D721B   .E8 18F1F2FF      call UnPackMe.00406338
2.004D7220   .A1 B09F4D00      mov eax,dword ptr ds:
004D7225   .8B00             mov eax,dword ptr ds:
004D7227   .E8 D867F7FF      call UnPackMe.0044DA04
3.004D722C   .8B0D A0A04D00    mov ecx,dword ptr ds:   
004D7232   .A1 B09F4D00      mov eax,dword ptr ds:
004D7237   .8B00             mov eax,dword ptr ds:
004D7239   .8B15 B06C4D00    mov edx,dword ptr ds:   
004D723F   .E8 D867F7FF      call UnPackMe.0044DA1C
4.004D7244   .A1 B09F4D00      mov eax,dword ptr ds:
004D7249   .8B00             mov eax,dword ptr ds:
004D724B   .E8 4C68F7FF      call UnPackMe.0044DA9C
5.004D7250   .E8 27CFF2FF      call UnPackMe.0040417C          //这里是Delphi的ExitProcess
6.004D7255   .8D40 00          lea eax,dword ptr ds:2.005A097E    68 0B4A5D0A      push 0A5D4A0B                   ; 2.key
005A0983^ E9 AD3EF7FF      jmp Themida_.00514835         ; jmp Vm_Start
3.005A0988    68 694A5D0A      push 0A5D4A69                   ; 3.key
005A098D^ E9 A33EF7FF      jmp Themida_.00514835         ; jmp Vm_Start
4.005A0992    68 084B5D0A      push 0A5D4B08                   ; 4.key
005A0997^ E9 993EF7FF      jmp Themida_.00514835         ; jmp Vm_Start
5.005A099C    68 664B5D0A      push 0A5D4B66                   ; 5.key
005A09A1^ E9 8F3EF7FF      jmp Themida_.00514835         ; jmp Vm_Start
6.005A09A6    68 A84B5D0A      push 0A5D4BA8                   ; 6.key
005A09AB^ E9 853EF7FF      jmp Themida_.00514835         ; jmp Vm_Start这是加壳后VM入口的地方,你发现上面规律没?他VM就是模拟了上面对应的部分,我再贴出来对应的是上面:1.004D7210 > $55               push ebp
004D7211   .8BEC             mov ebp,esp
004D7213   .83C4 F0          add esp,-10
004D7216   .B8 886F4D00      mov eax,UnPackMe.004D6F88
004D721B   .E8 18F1F2FF      call UnPackMe.00406338=1.push xxxxxxxx          //这里就是我们所要找的1.key值,这里就是Vm_Oep
jmp Vm_start2.004D7220   .A1 B09F4D00      mov eax,dword ptr ds:
004D7225   .8B00             mov eax,dword ptr ds:
004D7227   .E8 D867F7FF      call UnPackMe.0044DA04=2.005A097E    68 0B4A5D0A      push 0A5D4A0B                   ; 2.key
005A0983^ E9 AD3EF7FF      jmp Themida_.00514835         ; jmp Vm_Start3.004D722C   .8B0D A0A04D00    mov ecx,dword ptr ds:   
004D7232   .A1 B09F4D00      mov eax,dword ptr ds:
004D7237   .8B00             mov eax,dword ptr ds:
004D7239   .8B15 B06C4D00    mov edx,dword ptr ds:   
004D723F   .E8 D867F7FF      call UnPackMe.0044DA1C=3.005A0988    68 694A5D0A      push 0A5D4A69                   ; 3.key
005A098D^ E9 A33EF7FF      jmp Themida_.00514835         ; jmp Vm_Start4.004D7244   .A1 B09F4D00      mov eax,dword ptr ds:
004D7249   .8B00             mov eax,dword ptr ds:
004D724B   .E8 4C68F7FF      call UnPackMe.0044DA9C=4.005A0992    68 084B5D0A      push 0A5D4B08                   ; 4.key
005A0997^ E9 993EF7FF      jmp Themida_.00514835         ; jmp Vm_Start5.004D7250   .E8 27CFF2FF      call UnPackMe.0040417C          //这里是Delphi的ExitProcess=5.005A099C    68 664B5D0A      push 0A5D4B66                   ; 5.key
005A09A1^ E9 8F3EF7FF      jmp Themida_.00514835         ; jmp Vm_Start可能我这写的这么多,你应该能看懂,平时大家修复OEP就是修复这些VM模拟的代码,我的做教程的思路是不修复OEP代码,直接修复OEP在VM里面,这样让VM还是模拟代码跑,类似以前脱壳的以壳解壳,这里是用VM去跑OEP,但是TMD做了个处理,他把第一个VM模拟的key单独挪走了,后面的他会放一起,我们的思路找到第一处的key在哪.我们重新载入,下面看这么找第一处执行的VM地址,也就是Vm_Oep,先解码壳,和到OEP差不多,我们要做的是解码完了,还没执行OEP的地方

push xxxxxxxx          //这里就是我们所要找的1.key值
jmp Vm_start
Vm_start               //当代码执行到这里的时候,看堆栈窗口的压栈值就是上面的key了,所以我们在Vm_start的地方下好断点.
直接F9,然后F7步出,我们这么判断哪个是第一个模拟的地方,直接在
00406338    53                   push ebx                         ; Delphi 第一个call里面的内容
下好断点,然后F9去记录KEY吧,执行到上面代码的地方,前面一个肯定就是key了,刚按多了,不管他,那前面都是无用的.
0012FF78   0A5D97D3
0012FF78   0A5D99E1
0012FF78   0A5D9A89
0012FF78   0A5DA2D4
0012FF78   0A5DB6D8
0012FF78   0A5DBD39
0012FF98   0A5D499C   这个就是我们要找的key了


我前面说过,Vm_Oep就是这样的代码了
push 0A5D499C
jmp00514835
对吧,我们搜索下005A0C56    68 9C495D0A          push 0A5D499C                  ; Vm_Oep
005A0C5B^ E9 D53BF7FF          jmp Themida_.00514835            ; jmp Vm_start你会只能搜到这一个,现在要做上面?改OEP啊

Vm_Oep RVA=005A0C56-400000=001A0C56

修复之前脱好壳的程序OEP,保存就可以运行吧,说的应该还算详细,如果你熟练的话,有很多种方法找,也可以不找代码,直接写前面几行,后面还可以用VM去跑,你直接修复1.004D7210 > $55               push ebp
004D7211   .8BEC             mov ebp,esp
004D7213   .83C4 F0          add esp,-10
004D7216   .B8 886F4D00      mov eax,UnPackMe.004D6F88
004D721B   .E8 18F1F2FF      call UnPackMe.00406338然后跳到2.005A097E    68 0B4A5D0A      push 0A5D4A0B                   ; 2.key
005A0983^ E9 AD3EF7FF      jmp Themida_.00514835         ; jmp Vm_Start一样可以运行,你可以试试,VM模拟的代码都是对应的,这种脱壳思路就是用VM自己去跑代码,差不多了,估计有一个小时了吧,明天还要上班,今天差不多就到这里了,本来有冲动想做语音教程,最后因为没有麦所以做不成,马上就世界杯开始了,巴西哦,可以看了上半场再去睡觉,最后欢迎大家来吾爱破解进行交流学习,这里有很多资料还有牛人,可以学到很多东西


LCG就是我的梦想,好强大的组织,听说里面有很多内部东西,好奇...哦,对了,差点忘了,大家记得给我投票,我要拿大奖,哈哈!大家晚安,下次再见.拜拜...




    风吹屁屁凉
      LCG
   2010.6.29
   吾爱破解论坛
http://www.52pojie.cn
教程下载地址:

http://down.52pojie.cn/%ce%e1%b0%ae%c6%c6%bd%e2%ca%d3%c6%b5%bd%cc%b3%cc/2010%b6%af%bb%ad%bd%cc%b3%cc%b4%f3%c8%fc%b2%ce%c8%fc%d7%f7%c6%b7/Themida%20Winlicense%b2%bb%d3%c3%d0%de%b8%b4VM_OEP%cd%d1%bf%c7%bd%cc%b3%cc--%b7%e7%b4%b5%c6%a8%c6%a8%c1%b9.rar

风吹屁屁凉 发表于 2010-7-1 15:51

我等 维护世界和平 大牛出手啊,还有xxx,不记得他名字了,去年大显身手,今年比赛还没出现,等待围观...

Hmily 发表于 2010-7-1 15:52

学习,帮你上传我的网盘保存,可以不被删除掉.

niliu 发表于 2010-7-1 16:07

成功抢占了下水道打包出售

wode200910 发表于 2010-7-1 16:18

前排围观。

小生我怕怕 发表于 2010-7-1 16:19

前排占位膜拜啊屁大牛的杰作

nofriend 发表于 2010-7-1 16:25

我也来拜拜神人咯。

xie83544109 发表于 2010-7-1 16:28


这可是精品东东呢,多谢

ZeNiX 发表于 2010-7-1 16:57

LZ 几位大牛都膜拜了,
肯定是精品.

我也排隊學習

lafeng 发表于 2010-7-1 17:13

精品,俺只能围观了
页: [1] 2 3 4
查看完整版本: 【参赛】Themida/Winlicense不用修复VM_OEP脱壳教程