手脱VMP2.08全保护+跨平台
本帖最后由 cu629944 于 2011-7-5 16:07 编辑【文章标题】: 手脱VMP2.08全保护+跨平台
【文章作者】: Kinney
【软件名称】: Delphi7.0
【下载地址】: 自己搜索下载
【保护方式】: VMP2.08全保护
【软件介绍】: OD
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
PS下:本文章不是利用LCF的脚本直接脱壳~是利用LCF的脚本来处理跨平台问题!如果直接跑脚本的话!我也不用自己到达OEP了吧?是不是!有的时候,LCF的脚本是不能断下来的,还是来手动到达OEP的,鉴于小生说脱壳的精华在修复IAT,我同意,这个文章是利用LCF的来处理IAT的,我在修改脚本!等脚本写好,再写个文章吧!
今天狼大让我弄个原创,不知道写什么好~正好看到手里有一个VMP2.08的(PS:是注册版哦!),那今天就来脱下这个壳吧!我正好手里有一个Dlephi的程序,那我们就来给它加个壳吧!勾上VMP2.08的全选项!
然后点击运行下,没问题,可以运行下,我们OD载入下,查看下它的入口有什么变化没有!
004EDC76 /E9 561E0000 jmp 004EFAD1
004EDC7B |76 65 jbe short 004EDCE2
004EDC7D |72 73 jb short 004EDCF2
004EDC7F |696F 6E 2E646C6>imul ebp, dword ptr , 6C6C642>
004EDC86 |00E8 add al, ch
004EDC88 |2E:A5 movs dword ptr es:, dword ptr cs>
004EDC8A |FD std004EFAD1 68 25BC63A4 push A463BC25 ; //VM开始
004EFAD6 E8 E21CFDFF call 004C17BD
004EFADB ^ E3 E8 jecxz short 004EFAC5
004EFADD A7 cmps dword ptr , dword ptr es:[e>
004EFADE 3E:CE into
004EFAE0 1354BF DA adc edx, dword ptr
004EFAE4 FC cld
004EFAE5 B4 78 mov ah, 78
004EFAE7 37 aaa
004EFAE8 F2: prefix repne:
004EFAE9 9D popfd
004EFAEA 50 push eax
004EFAEB EB 76 jmp short 004EFB63
没什么太大的变化,004EFAD1是VM开始,这里是对应的原程序的入口,一开始VMP会压入一个KEY,这个KEY是用来计算函数VM开始执行的地址。现在开始跑OEP,先等到OEP解码,我们下VirtualProtect断点,注意堆栈部分,当出现两次
NewProtect = PAGE_READONLY,就是我们到CODE下断点的时机了!
此时,我们点“M”按钮,在CODE段下F2访问断点!
F9运行后,停到004F97FA这里!
004F97FA 3202 xor al, byte ptr
004F97FC E8 C7020000 call 004F9AC8
004F9801 0FC8 bswap eax
004F9803 F8 clc
004F9804 C1C8 11 ror eax, 11
004F9807 F9 stc
004F9808 52 push edx
004F9809 886C24 04 mov byte ptr , ch
004F980D 31C3 xor ebx, eax
004F980F F8 clc
004F9810 E8 77F9FFFF call 004F918C
再次点击“M”,来到内存窗口,再次在DATA段下F2断点,我们的任务是来到Delphi程序的第一个call中,这样可以无限接近程序的OEP,然后再到达OEP,可能有的人会说,为什么要到第一个call,不直接到达OEP呢?一会儿你就知道了!
嘿嘿!下好断点后,F9运行,如果对Delphi程序很熟悉的话,就会发现,我们现在正停在Delphi程序的第一个Call中!
00405BC7 90 nop
00405BC8 53 push ebx
00405BC9 8BD8 mov ebx, eax
00405BCB 33C0 xor eax, eax
00405BCD A3 9CD04400 mov dword ptr , eax
00405BD2 6A 00 push 0
00405BD4 E8 2BFFFFFF call 00405B04
00405BD9 A3 64F64400 mov dword ptr , eax
00405BDE A1 64F64400 mov eax, dword ptr
00405BE3 A3 A8D04400 mov dword ptr , eax
00405BE8 33C0 xor eax, eax
00405BEA A3 ACD04400 mov dword ptr , eax
00405BEF 33C0 xor eax, eax
00405BF1 A3 B0D04400 mov dword ptr , eax
00405BF6 E8 C1FFFFFF call 00405BBC
00405BFB BA A4D04400 mov edx, 0044D0A4
00405C00 8BC3 mov eax, ebx
00405C02 E8 51DFFFFF call 00403B58
00405C07 5B pop ebx
00405C08 C3 retn
00405C09 8D40 00 lea eax, dword ptr
00405C0C 55 push ebp
00405C0D 8BEC mov ebp, esp
00405C0F 33C0 xor eax, eax
00405C11 55 push ebp
00405C12 68 315C4000 push 00405C31
00405C17 64:FF30 push dword ptr fs:
00405C1A 64:8920 mov dword ptr fs:, esp
00405C1D FF05 68F64400 inc dword ptr
00405C23 33C0 xor eax, eax
00405C25 5A pop edx
00405C26 59 pop ecx
00405C27 59 pop ecx
00405C28 64:8910 mov dword ptr fs:, edx
00405C2B 68 385C4000 push 00405C38
00405C30 C3 retn
我们马上就要到达OEP了,我们CTRL+F,输入CALL 00405BC8,我们就来到了Call这个地址的CALL那里,向上面翻,仔细观察会发现我们找到了OEP,不过,OEP的头一句被被变形了,我们将多余的Nop掉,会恢复OEP的本来面目!
0044CA93 0090 C8440055 add byte ptr , dl //被变形的OEP
0044CA99 8BEC mov ebp, esp
0044CA9B 83C4 F0 add esp, -10
0044CA9E B8 B8C84400 mov eax, 0044C8B8
0044CAA3 E8 2091FBFF call 00405BC8
0044CAA8 A1 B8DF4400 mov eax, dword ptr
0044CAAD 8B00 mov eax, dword ptr
0044CAAF E8 9CE6FFFF call 0044B150
0044CAB4 8B0D 94E04400 mov ecx, dword ptr ; delphi7?0044FBD0
0044CABA A1 B8DF4400 mov eax, dword ptr
0044CABF 8B00 mov eax, dword ptr
0044CAC1 8B15 F0C64400 mov edx, dword ptr ; delphi7?0044C73C
0044CAC7 E8 9CE6FFFF call 0044B168
0044CACC A1 B8DF4400 mov eax, dword ptr
0044CAD1 8B00 mov eax, dword ptr
0044CAD3 E8 10E7FFFF call 0044B1E8
0044CAD8 E8 4372FBFF call 00403D20
0044CA98 55 push ebp ; //恢复过后的OEP!
0044CA99 8BEC mov ebp, esp
0044CA9B 83C4 F0 add esp, -10
0044CA9E B8 B8C84400 mov eax, 0044C8B8
0044CAA3 E8 2091FBFF call 00405BC8
0044CAA8 A1 B8DF4400 mov eax, dword ptr
0044CAAD 8B00 mov eax, dword ptr
0044CAAF E8 9CE6FFFF call 0044B150
0044CAB4 8B0D 94E04400 mov ecx, dword ptr ; delphi7?0044FBD0
0044CABA A1 B8DF4400 mov eax, dword ptr
0044CABF 8B00 mov eax, dword ptr
0044CAC1 8B15 F0C64400 mov edx, dword ptr ; delphi7?0044C73C
0044CAC7 E8 9CE6FFFF call 0044B168
0044CACC A1 B8DF4400 mov eax, dword ptr
0044CAD1 8B00 mov eax, dword ptr
0044CAD3 E8 10E7FFFF call 0044B1E8
0044CAD8 E8 4372FBFF call 00403D20
我们看到OEP在0044CA98,如果DUMP掉的话,是可以在本机运行的,但是跨平台就不可以了,需要处理下跨平台的问题,呵呵,我在这里用到的是LCF的脚本,其实是可以直接跑脚本的,不过在我的电脑这里,直接跑OEP,会直接运行,无法断下来,所以我就找了下OEP,让脚本可以中断下来!脚本执行的过程需要一段时间,在这里我就不截图了!跑完脚本后,需要载入LoadPe来补下脚本生成的两个.mem文件,补两个区段,是跨平台和antidump的,把区段给改成可写入,在重建下PE,忘了说了,在输入表里,添加一个导入表,添加KERNEL32.DLL里的LoadLibraryA和GetProcAddress,将刚才新导入的函数的ThunkRVA记下,然后保存!
保存好后,重新载入到OD中,在脚本申请的段里,填入这两个函数的地址!
保存下,运行,程序可以运行,此时,跨平台也处理好了!
【经验总结】
终于脱完了,虽然不难,但是狼大不让我用太多的图,害的我还要重新来!
--------------------------------------------------------------------------------
【版权声明】: 本文首发于赏金论坛:Kinney(www.sgoldcn.com)!版权为赏金论坛所有 , 转载请注明作者并保持文章的完整, 谢谢!
狼行绝路 发表于 2011-7-5 14:51 static/image/common/back.gif
回复 小生我怕怕 的帖子
鄙人不才 狼行绝路
第一次见,不要怪我少见多怪
高手就是高手··
小生 我问下 OD的工具无法使用 怎么办?LD PE 打开没反应 .. 是用LCF的脚本跑的 不错,小板凳 学习了,厉害哎 沙发自己的!嘿嘿!不要给我抢!惯例惯例! 我晕!这么会把我的沙发抢了! 讲解很精彩,继续努力 !永远支持你!
cu629944 发表于 2011-7-5 14:07 static/image/common/back.gif
我晕!这么会把我的沙发抢了!
首先不要连楼
在一个,阁下所说的狼大,真不知道
另外脚本脱壳,那是别人的脚本的功劳,实非手脱
如果真对VMP有爱的话,建议多看看ximo的那几篇关于VMP的教程,会大有收获的 回复 小生我怕怕 的帖子
鄙人不才 狼行绝路