我在研究脱壳时发现一种壳是Visual Protect版本好像是2.25
搜索论坛fly大侠有一篇dll的脱壳
还搜到一篇fly的Visual Protect V3.54 脱壳 ―― VisualProtect.exe 主程序
还有一篇“小球”的文章
小球的文章太过笼统无法参照
根据fly大侠的文章在下面
006BCF90 55 push ebp
====>进入OD后断在这!
006BCF91 8BEC mov ebp,esp
006BCF93 51 push ecx
006BCF94 53 push ebx
006BCF95 56 push esi
006BCF96 57 push edi
006BCF97 C705 B03E6C00 000000>mov dword ptr ds:[6C3EB0],0
006BCFA1 68 48206C00 push VisualPr.006C2048 ;ASCII "kernel32.dll"
006BCFA6 FF15 00006C00 call dword ptr ds:[<&KERNEL32.LoadLibraryA>];kernel32.LoadLibraryA
006BCFAC A3 0C3F6C00 mov dword ptr ds:[6C3F0C],eax
006BCFB1 68 58206C00 push VisualPr.006C2058 ;ASCII "GetModuleHandleA"
006BCFB6 A1 0C3F6C00 mov eax,dword ptr ds:[6C3F0C]
006BCFBB 50 push eax
006BCFBC FF15 04006C00 call dword ptr ds:[<&KERNEL32.GetProcAddress>];kernel32.GetProcAddress
上面这段代码对于用Visual Protect V3.54加壳的程序来说几乎是固定的。
OK,不管那么多,F9 和 SHIFT+F9运行!直至出现“This application was protected using Visual Protect”的经典Visual Protect保护画面时停下,当然要点“Try”啦,否则程序退出还怎么玩?
///在我这里不通,F9异常后点击试用没有异常程序直接进入试用状态
下面是fly原文:
//
0079478F 3A0A cmp cl,byte ptr ds:[edx]
====>这里异常!当第2次异常时看看堆栈:
0012F39C 007FBEF5 返回到 VP.007FBEF5 来自 VP.00794788
0012F3A0 0012F3C8 指针到下一个 SEH 记录
0012F3A4 007FBEFF SE 句柄 //此处下断!
007FBEFF E9 DC7CF9FF jmp VP.00793BE0
====>堆栈区的第二条地址 设断 F9断在此处
00793BE0 8B4424 04 mov eax,dword ptr ss:[esp+4]
00793BE4 F740 04 06000000 test dword ptr ds:[eax+4],6
00793BEB 0F85 13010000 jnz VP.00793D04
…… …… 省 略 …… …… 直接CTRL+F9执行到返回
007FBF04 8B45 FC mov eax,dword ptr ss:[ebp-4]
007FBF07 E8 8C86F9FF call VP.00794598
007FBF0C E8 3780F9FF call VP.00793F48
007FBF11 5F pop edi
007FBF12 5E pop esi
007FBF13 5B pop ebx
007FBF14 59 pop ecx
007FBF15 5D pop ebp
007FBF16 C3 retn
====>返回到 0080802A
//
我没有找到相似代码段
我进入VP.dll的空间到和fly的差不多
发现在VP.dll里面全是注册效验代码
直到下面
//
fly原文
00835D75 B8 8C6A8300 mov eax,VP.00836A8C ; ASCII "SetEnvironment"
00835D7A E8 B9BEFFFF call VP.00831C38
00835D7F A1 70BE8300 mov eax,dword ptr ds:[83BE70]
00835D84 8B40 41 mov eax,dword ptr ds:[eax+41]
====>EAX=0026B508 这是OEP的偏移值
00835D87 0345 10 add eax,dword ptr ss:[ebp+10]
====>EAX=0026B508 + 00400000=0066B508 这就是OEP值
00835D8A 8945 FC mov dword ptr ss:[ebp-4],eax
====>[ebp-4]=EAX=0066B508 呵呵,记住这个[ebp-4]
00835D8D B8 144C8300 mov eax,VP.[NONAME]
00835D92 E8 A9100000 call VP.00836E40
00835D97 3B05 74018400 cmp eax,dword ptr ds:[840174]
00835D9D A1 48BB8300 mov eax,dword ptr ds:[83BB48]
和我跟踪的差不多
下面是我跟踪的具体方法请大侠指点
od载入hou
004E9F90 w> 55 push ebp //od载入hou停在这里
004E9F91 8BEC mov ebp,esp
004E9F93 51 push ecx
004E9F94 53 push ebx
004E9F95 56 push esi
004E9F96 57 push edi
004E9F97 C705 B00E4F00>mov dword ptr ds:[4F0EB0],0
004E9FA1 68 48F04E00 push wscut.004EF048 ; ASCII "kernel32.dll"
004E9FA6 FF15 00D04E00 call dword ptr ds:[<&KERNEL32.Load>; KERNEL32.LoadLibraryA
004E9FAC A3 0C0F4F00 mov dword ptr ds:[4F0F0C],eax
004E9FB1 68 58F04E00 push wscut.004EF058 ; ASCII "GetModuleHandleA"
004E9FB6 A1 0C0F4F00 mov eax,dword ptr ds:[4F0F0C]
004E9FBB 50 push eax
004E9FBC FF15 04D04E00 call dword ptr ds:[<&KERNEL32.GetP>; KERNEL32.GetProcAddress
004E9FC2 A3 900E4F00 mov dword ptr ds:[4F0E90],eax
004E9FC7 6A 00 push 0
004E9FC9 FF15 900E4F00 call dword ptr ds:[4F0E90]
004E9FCF A3 EC0E4F00 mov dword ptr ds:[4F0EEC],eax
004E9FD4 8B0D EC0E4F00 mov ecx,dword ptr ds:[4F0EEC]
004E9FDA 51 push ecx
004E9FDB E8 C0050000 call wscut.004EA5A0 //F8进到下面
004E9FE0 83C4 04 add esp,4
004E9FE3 8945 FC mov dword ptr ss:[ebp-4],eax
///////////////////////////////////////////////////////
部分代码省略,遇到向上的跳转一律F4向下走来到下面
004EAE49 51 push ecx
004EAE4A 68 400D4F00 push wscut.004F0D40
004EAE4F 68 780D4F00 push wscut.004F0D78
004EAE54 68 B8084F00 push wscut.004F08B8
004EAE59 8B15 EC0E4F00 mov edx,dword ptr ds:[4F0EEC] ; wscut.00400000
004EAE5F 52 push edx
004EAE60 8D85 F8FEFFFF lea eax,dword ptr ss:[ebp-108]
004EAE66 50 push eax
004EAE67 8D8D E8FEFFFF lea ecx,dword ptr ss:[ebp-118]
004EAE6D 51 push ecx
004EAE6E FF15 880E4F00 call dword ptr ds:[4F0E88] //F8进入VP.dll空间,发现全是注册验证,继续GO
004EAE74 83BD F8FEFFFF>cmp dword ptr ss:[ebp-108],0
004EAE7B 74 0D je short wscut.004EAE8A
004EAE7D A1 EC0E4F00 mov eax,dword ptr ds:[4F0EEC]
004EAE82 0385 F8FEFFFF add eax,dword ptr ss:[ebp-108]
004EAE88 EB 02 jmp short wscut.004EAE8C
经过几次异常(不知道异常时应该怎么处理,我这里全部ALT+F9返回,不知对否?)来到下面
/////////////////////////////////////////////////////////////////
002D5D75 B8 8C6A2D00 mov eax,VP.002D6A8C ; ASCII "SetEnvironment"
002D5D7A E8 B9BEFFFF call VP.002D1C38
002D5D7F A1 70BE2D00 mov eax,dword ptr ds:[2DBE70]
002D5D84 8B40 41 mov eax,dword ptr ds:[eax+41] //传说中的OEP的值出现了eax=000D0060
002D5D87 0345 10 add eax,dword ptr ss:[ebp+10] ; wscut.00400000
002D5D8A 8945 FC mov dword ptr ss:[ebp-4],eax
002D5D8D B8 144C2D00 mov eax,VP.[NONAME]
002D5D92 E8 A9100000 call VP.002D6E40
002D5D97 3B05 74012E00 cmp eax,dword ptr ds:[2E0174]
002D5D9D A1 48BB2D00 mov eax,dword ptr ds:[2DBB48]
002D5DA2 0F9400 sete byte ptr ds:[eax]
002D5DA5 A1 70BE2D00 mov eax,dword ptr ds:[2DBE70]
002D5D7A E8 B9BEFFFF call VP.002D1C38
002D5D7F A1 70BE2D00 mov eax,dword ptr ds:[2DBE70]
002D5D84 8B40 41 mov eax,dword ptr ds:[eax+41]
002D5D87 0345 10 add eax,dword ptr ss:[ebp+10]
002D5D8A 8945 FC mov dword ptr ss:[ebp-4],eax
002D5D8D B8 144C2D00 mov eax,VP.[NONAME] ; 记住这里的值,参照fly的教程,就是这里eax=000D0060
002D5D92 E8 A9100000 call VP.002D6E40
002D5D97 3B05 74012E00 cmp eax,dword ptr ds:[2E0174]
002D5D9D A1 48BB2D00 mov eax,dword ptr ds:[2DBB48]
002D5EB0 8B45 08 mov eax,dword ptr ss:[ebp+8] //看到这里,断定是Delphi程序
002D5EB3 FF50 08 call dword ptr ds:[eax+8]
002D5EB6 EB 16 jmp short VP.002D5ECE
002D5EB8 B8 406B2D00 mov eax,VP.002D6B40 ; ASCII "Delphi ImportTable"
002D5EBD E8 76BDFFFF call VP.002D1C38
002D5EC2 A1 84BB2D00 mov eax,dword ptr ds:[2DBB84]
002D5EC7 8B00 mov eax,dword ptr ds:[eax]
002D5EC9 E8 7AA6FEFF call VP.[NONAME]
002D5ECE A1 48BB2D00 mov eax,dword ptr ds:[2DBB48]
////////////////////////////////////////////////
上面看到希望了OEP就是eax=000D0060
好,继续走
下面:
////////////////////
002D5FBF 52 push edx
002D5FC0 50 push eax
002D5FC1 8D95 58FAFFFF lea edx,dword ptr ss:[ebp-5A8]
002D5FC7 B8 08000000 mov eax,8
002D5FCC E8 AF2FF6FF call VP.00238F80
002D5FD1 8B8D 58FAFFFF mov ecx,dword ptr ss:[ebp-5A8]
002D5FD7 8D85 5CFAFFFF lea eax,dword ptr ss:[ebp-5A4]
002D5FDD BA 946B2D00 mov edx,VP.002D6B94 ; ASCII "Finalizing 0x"
002D5FE2 E8 B5E8F5FF call VP.0023489C
002D5FE7 8B85 5CFAFFFF mov eax,dword ptr ss:[ebp-5A4]
002D5FED E8 46BCFFFF call VP.002D1C38
002D5FF2 - FF65 FC jmp dword ptr ss:[ebp-4] ; wscut.004D0060 飞向光明之巅(有抄袭FLY之嫌啊!!^_^)OEP:D0060
002D5FF5 6A 00 push 0
002D5FF7 E8 C00CF6FF call VP.00236CBC
002D5FFC E9 C6040000 jmp VP.002D64C7
002D6001 A1 70BE2D00 mov eax,dword ptr ds:[2DBE70]
002D6006 8B40 41 mov eax,dword ptr ds:[eax+41]
002D6009 8B55 0C mov edx,dword ptr ss:[ebp+C]
002D600C 8902 mov dword ptr ds:[edx],eax
002D600E 8B45 0C mov eax,dword ptr ss:[ebp+C]
002D6011 8B00 mov eax,dword ptr ds:[eax]
002D5FF2处跳转后来到这里
不是吧?写这篇文章的时候已经不能试用了
上面上能试用的时候复制的代码!!
总之和fly的差不多,下面是fly的
0066B508 55 push ebp
====>在这儿用LordPE完全DUMP这个进程
0066B509 8BEC mov ebp,esp
0066B50B 83C4 F0 add esp,-10
0066B50E B8 D0AC6600 mov eax,VisualPr.0066ACD0
0066B513 E8 E8BCD9FF call VisualPr.00407200
0066B518 A1 34D86700 mov eax,dword ptr ds:[67D834]
0066B51D 8B00 mov eax,dword ptr ds:[eax]
0066B51F E8 301EE2FF call VisualPr.0048D354
0066B524 A1 34D86700 mov eax,dword ptr ds:[67D834]
0066B529 8B00 mov eax,dword ptr ds:[eax]
0066B52B BA B0B56600 mov edx,VisualPr.0066B5B0 ; ASCII "Visual Protect"
0066B530 E8 D318E2FF call VisualPr.0048CE08
然后用ImportREC选择这个进程填入oep=D0060,然后IT AutoSearch,然后Get Import”,有许多函数无效,用“追踪层次3”修复无效。FixDump,不能正常运行!
请大侠指点啊
程序地址:
http://ssbbs.hn8868.com/soft/22.exe
[课程]Linux pwn 探索篇!