【软件名称】Vbox 4.2实例 Insta3De(《加密与解密》书13.2.2 )
【应用平台】Win2000 SP4
【作者邮箱】chubing6143@sina.com
【使用工具】OllyDbg1.10
【软件限制】VBOX4.20
【破解工具】OllyDbg v1.10
【破解过程】
写在前面的话:
《加密与解密》一书中讲解的时利用TRW2000如何去除该例子的保护,然而我用OD脱壳时,遇到了不少困难(先说明,我是在Win2K平台下脱壳的,我没有试其他系统),因此将过程写出来,希望对我等菜鸟有一定的帮助.
按照书上讲解,我首先利用OD加载程序,然后,F9运行,然后弹出VBOX保护界面,在OD中下断BP GetProcAddress,此时想去点击"Try"按钮,但是不能够了,因为总是被OD拦截下来了.
0012DCFC 3B055C79 /CALL 到 GetProcAddress 来自 IMSC40A.3B055C73
0012DD00 796D0000 |hModule = 796D0000 (ADVAPI32)
0012DD04 3B034248 \ProcNameOrOrdinal = "CheckTokenMembership"
作为菜鸟这下可完蛋了.我想到一个办法,不是不能点击"Try"按钮吗?我先对"Try"按钮下WM_LBUTTONUP消息断点,然后被中断之后再下断BP GetProcAddress不就行了嘛!菜鸟也能变通了吧!
F9运行,然后弹出VBOX保护界面,对"Try"按钮下WM_LBUTTONUP消息断点,点击Try按钮,
程序被中断下来了:
77E062C3 [> 55 push ebp
77E062C4 8BEC mov ebp,esp
77E062C6 8B4D 08 mov ecx,dword ptr ss:[ebp+8]
77E062C9 56 push esi
77E062CA 57 push edi
77E062CB E8 00CDFEFF call USER32.77DF2FD0
堆栈显示:
0012E32C 77DF2CA8 /CALL 到 Assumed WinProc 来自 USER32.77DF2CA5
0012E330 003801EA |hWnd = 003801EA ('&Try',class='Button',parent=00BB01CE)
0012E334 00000202 |Message = WM_LBUTTONUP
0012E338 00000000 |Keys = 0
0012E33C 000B0036 \X = 54. Y = 11.
此时,再在OD中下断BP GetProcAddress,F9运行一下:
程序被中断下来,
77E6E6A9 K> 55 push ebp ; 中断在此处
77E6E6AA 8BEC mov ebp,esp
77E6E6AC 51 push ecx
77E6E6AD 51 push ecx
77E6E6AE 53 push ebx
77E6E6AF 57 push edi
77E6E6B0 8B7D 0C mov edi,dword ptr ss:[ebp+C]
77E6E6B3 BB FFFF0000 mov ebx,0FFFF
77E6E6B8 3BFB cmp edi,ebx
77E6E6BA 0F86 D3EB0000 jbe KERNEL32.77E7D293
77E6E6C0 8D45 F8 lea eax,dword ptr ss:[ebp-8]
77E6E6C3 57 push edi
77E6E6C4 50 push eax
77E6E6C5 FF15 2413E677 call dword ptr ds:[<&NTDLL.Rt>; ntdll.RtlInitString
F2取消断点,Ctrl+F9
程序运行到下面代码处:
77E6E706 C2 0800 retn 8
77E6E709 - FF25 2013E677 jmp dword ptr ds:[<&NTDLL.Ldr>; ntdll.LdrGetProcedureAddress
F8运行,程序运行到下面代码:
08F74EB1 FF15 5458FE08 call dword ptr ds:[8FE5854] ; KERNEL32.GetProcAddress
08F74EB7 3BC3 cmp eax,ebx ; 中断在这儿
运行到08F74EB7处后Ctrl+F9运行,等待时间稍长,运行到下面代码处:
08F7502B C3 retn ; 中断在这儿
08F7502C 55 push ebp
08F7502D 8BEC mov ebp,esp
F8 运行,程序来到下面的位置:
08F71C95 E8 772F0000 call vboxt420.08F74C11
08F71C9A 8B75 08 mov esi,dword ptr ss:[ebp+8]
08F71C9D 83C4 20 add esp,20
08F71CA0 837E 10 00 cmp dword ptr ds:[esi+10],0
08F71CA4 74 5F je short vboxt420.08F71D05
08F71CA6 8D8D 38FFFFFF lea ecx,dword ptr ss:[ebp-C8]
08F71CAC E8 1FB70100 call vboxt420.08F8D3D0
Ctrl+F9运行,运行到下面代码处:
08F73920 C2 1000 retn 10 ; 中断在这儿
08F73923 8B0D 58F8FD08 mov ecx,dword ptr ds:[8FDF858>
08F73929 85C9 test ecx,ecx
08F7392B 74 05 je short vboxt420.08F73932
F8 运行,程序来到下面的位置:
08F5049A FFD0 call eax
08F5049C B8 01000000 mov eax,1
08F504A1 5F pop edi
Ctrl+F9运行,运行到下面代码处:
08F504AB C3 retn ; 中断在这儿
F8 运行,程序来到下面的位置:
08F50248 E8 9A000000 call 08F502E7
08F5024D 83C4 04 add esp,4
08F50250 85C0 test eax,eax
08F50252 75 0A jnz short 08F5025E
Ctrl+F9运行,运行到下面代码处:
08F502C8 C2 0C00 retn 0C ; 中断在这儿
F8 运行,程序来到下面的位置:
08F5011C E8 06000000 call 08F50127
08F50121 5F pop edi ; 08DF00C8
Ctrl+F9运行,运行到下面代码处:
08F50124 C2 0400 retn 4 ; 中断在这儿,我个人总结VBOX保护中碰到retn 4的时候
; 其实就要返回关键地方了,而且破解VBOX4.3与4.2保护时经过的RET次数都一样
F8 运行,程序来到下面的位置:
08F20454 FFD6 call esi ; 这就使书上讲的关键的CALL ESI了,设断点
08F20456 5B pop ebx ; Insta3De.00692048
08F20457 85C0 test eax,eax
08F20459 74 2E je short 08F20489
08F2045B 68 00800000 push 8000
08F20460 6A 00 push 0
08F20462 56 push esi
08F20463 8B75 08 mov esi,dword ptr ss:[ebp+8]
08F20466 FF56 78 call dword ptr ds:[esi+78]
08F20469 8B45 0C mov eax,dword ptr ss:[ebp+C]
08F2046C 68 00800000 push 8000
08F20471 6A 00 push 0
08F20473 50 push eax
在08F20454处F2,然后F9运行,程序再次中断在此处,然后F2取消断点,此时F7进入该CALL,然后一路F8
0FC60000 0BC0 or eax,eax
0FC60002 74 00 je short 0FC60004
0FC60004 33C4 xor eax,esp
0FC60006 8CE0 mov ax,fs
0FC60008 2BC4 sub eax,esp
0FC6000A 2BC5 sub eax,ebp
0FC6000C 33C5 xor eax,ebp
0FC6000E 90 nop
0FC6000F 0BC5 or eax,ebp
0FC60011 8CE0 mov ax,fs
0FC60013 F7D0 not eax
0FC60015 86E0 xchg al,ah
0FC60017 32E0 xor ah,al
0FC60019 0BC5 or eax,ebp
0FC6001B EB 62 jmp short 0FC6007F
......
0FC6007F 55 push ebp
0FC60080 8BEC mov ebp,esp
0FC60082 83C4 F8 add esp,-8
0FC60085 56 push esi
0FC60086 57 push edi
0FC60087 EB 08 jmp short 0FC60091
0FC60089 0000 add byte ptr ds:[eax],al
0FC6008B 0000 add byte ptr ds:[eax],al
0FC6008D 0000 add byte ptr ds:[eax],al
0FC6008F 0000 add byte ptr ds:[eax],al
0FC60091 EB 2F jmp short 0FC600C2
......
0FC600C2 /EB 24 jmp short 0FC600E8
......
0FC600E8 8B75 08 mov esi,dword ptr ss:[ebp+8] ; Insta3De.00692048
0FC600EB 8B86 00010000 mov eax,dword ptr ds:[esi+100>
0FC600F1 8BD8 mov ebx,eax
0FC600F3 53 push ebx
0FC600F4 81C3 45000000 add ebx,45
0FC600FA 895D FC mov dword ptr ss:[ebp-4],ebx
0FC600FD 5B pop ebx
0FC600FE 8BFB mov edi,ebx
0FC60100 81C7 28000000 add edi,28
0FC60106 897D F8 mov dword ptr ss:[ebp-8],edi
0FC60109 FF75 F8 push dword ptr ss:[ebp-8]
0FC6010C FF75 FC push dword ptr ss:[ebp-4]
0FC6010F FF75 08 push dword ptr ss:[ebp+8]
0FC60112 E8 08000000 call 0FC6011F ; 短距离CALL,实际上就是跳转了,F7跟进去,如果F8的话就会运行
......
0FC8011F 8B4C24 0C mov ecx,dword ptr ss:[esp+C]
0FC80123 83EC 10 sub esp,10
0FC80126 8A01 mov al,byte ptr ds:[ecx]
0FC80128 53 push ebx
0FC80129 55 push ebp
0FC8012A 56 push esi
0FC8012B 84C0 test al,al
0FC8012D 57 push edi
0FC8012E 74 0C je short 0FC8013C
0FC80130 F6D0 not al
0FC80132 8801 mov byte ptr ds:[ecx],al
0FC80134 8A41 01 mov al,byte ptr ds:[ecx+1]
0FC80137 41 inc ecx
0FC80138 84C0 test al,al
0FC8013A ^ 75 F4 jnz short 0FC80130
0FC8013C 8B6C24 24 mov ebp,dword ptr ss:[esp+24]
0FC80140 8BBD D4000000 mov edi,dword ptr ss:[ebp+D4]
0FC80146 8BB5 DC000000 mov esi,dword ptr ss:[ebp+DC]
0FC8014C 897424 10 mov dword ptr ss:[esp+10],esi
0FC80150 66:8B07 mov ax,word ptr ds:[edi]
0FC80153 66:35 F80A xor ax,0AF8
0FC80157 66:3D B550 cmp ax,50B5
0FC8015B 74 04 je short 0FC80161
0FC8015D 33C0 xor eax,eax
0FC8015F EB 23 jmp short 0FC80184
0FC80161 8B47 3C mov eax,dword ptr ds:[edi+3C]
0FC80164 33C9 xor ecx,ecx
0FC80166 03C7 add eax,edi
0FC80168 66:8B08 mov cx,word ptr ds:[eax]
0FC8016B F7D1 not ecx
0FC8016D 81F1 E44B0000 xor ecx,4BE4
0FC80173 81F9 4BF1FFFF cmp ecx,-0EB5
0FC80179 74 04 je short 0FC8017F
0FC8017B 33C0 xor eax,eax
0FC8017D EB 05 jmp short 0FC80184
0FC8017F 8B40 78 mov eax,dword ptr ds:[eax+78]
0FC80182 03C7 add eax,edi
0FC80184 85C0 test eax,eax
0FC80186 0F84 93000000 je 0FC8021F
0FC8018C 8B50 1C mov edx,dword ptr ds:[eax+1C]
0FC8018F 8B48 20 mov ecx,dword ptr ds:[eax+20]
0FC80192 8B58 24 mov ebx,dword ptr ds:[eax+24]
0FC80195 03D7 add edx,edi
0FC80197 03CF add ecx,edi
0FC80199 03DF add ebx,edi
0FC8019B F7C6 00000080 test esi,80000000
0FC801A1 895424 1C mov dword ptr ss:[esp+1C],edx
0FC801A5 895C24 18 mov dword ptr ss:[esp+18],ebx
0FC801A9 74 17 je short 0FC801C2
0FC801AB 81E6 FFFFFF7F and esi,7FFFFFFF
0FC801B1 4E dec esi
0FC801B2 8BCE mov ecx,esi
0FC801B4 8B70 14 mov esi,dword ptr ds:[eax+14]
0FC801B7 3BCE cmp ecx,esi
0FC801B9 73 64 jnb short 0FC8021F
0FC801BB 8B048A mov eax,dword ptr ds:[edx+ecx>
0FC801BE 03C7 add eax,edi
0FC801C0 EB 5F jmp short 0FC80221
0FC801C2 8B40 18 mov eax,dword ptr ds:[eax+18]
0FC801C5 33D2 xor edx,edx
0FC801C7 85C0 test eax,eax
0FC801C9 894424 14 mov dword ptr ss:[esp+14],eax
0FC801CD 76 50 jbe short 0FC8021F
0FC801CF 8BE9 mov ebp,ecx
0FC801D1 EB 04 jmp short 0FC801D7
0FC801D3 8B7424 10 mov esi,dword ptr ss:[esp+10]
0FC801D7 8B4D 00 mov ecx,dword ptr ss:[ebp]
0FC801DA 8BC7 mov eax,edi
0FC801DC 03C1 add eax,ecx
0FC801DE 8A18 mov bl,byte ptr ds:[eax]
0FC801E0 8ACB mov cl,bl
0FC801E2 3A1E cmp bl,byte ptr ds:[esi]
0FC801E4 75 1C jnz short 0FC80202
0FC801E6 84C9 test cl,cl
0FC801E8 74 14 je short 0FC801FE
0FC801EA 8A58 01 mov bl,byte ptr ds:[eax+1]
0FC801ED 8ACB mov cl,bl
0FC801EF 3A5E 01 cmp bl,byte ptr ds:[esi+1]
0FC801F2 75 0E jnz short 0FC80202
0FC801F4 83C0 02 add eax,2
0FC801F7 83C6 02 add esi,2
0FC801FA 84C9 test cl,cl
0FC801FC ^ 75 E0 jnz short 0FC801DE
0FC801FE 33C0 xor eax,eax
0FC80200 EB 05 jmp short 0FC80207
0FC80202 1BC0 sbb eax,eax
0FC80204 83D8 FF sbb eax,-1
0FC80207 85C0 test eax,eax
0FC80209 0F84 C1000000 je 0FC802D0
0FC8020F 8B4424 14 mov eax,dword ptr ss:[esp+14]
0FC80213 42 inc edx
0FC80214 83C5 04 add ebp,4
0FC80217 3BD0 cmp edx,eax
0FC80219 ^ 72 B8 jb short 0FC801D3 ; 在这里循环,向上搜索大跳转,发现0FC801C0 /EB 5F jmp short 0FC80221
0FC8021B 8B6C24 24 mov ebp,dword ptr ss:[esp+24]
0FC8021F 33C0 xor eax,eax
0FC80221 8B4C24 2C mov ecx,dword ptr ss:[esp+2C] ; 此处F4
0FC80225 51 push ecx
0FC80226 57 push edi
0FC80227 FFD0 call eax ; EAX对应KERNEL32.GetProcAddress
0FC80229 85C0 test eax,eax
0FC8022B 8985 9C000000 mov dword ptr ss:[ebp+9C],eax
0FC80231 75 0A jnz short 0FC8023D
0FC80233 5F pop edi
0FC80234 5E pop esi
0FC80235 5D pop ebp
0FC80236 5B pop ebx
0FC80237 83C4 10 add esp,10
0FC8023A C2 0C00 retn 0C
0FC8023D 8D5424 24 lea edx,dword ptr ss:[esp+24]
0FC80241 52 push edx
0FC80242 55 push ebp
0FC80243 E8 A7000000 call 0FC802EF ; 此处F7进去
......
0FC802EF 55 push ebp ; Insta3De.00692048
0FC802F0 8BEC mov ebp,esp
0FC802F2 83EC 14 sub esp,14
0FC802F5 53 push ebx
0FC802F6 56 push esi
0FC802F7 57 push edi
0FC802F8 8B45 08 mov eax,dword ptr ss:[ebp+8]
0FC802FB 8B88 20010000 mov ecx,dword ptr ds:[eax+120>
0FC80301 894D F8 mov dword ptr ss:[ebp-8],ecx
0FC80304 8B55 08 mov edx,dword ptr ss:[ebp+8]
0FC80307 8B82 24010000 mov eax,dword ptr ds:[edx+124>
0FC8030D 8945 FC mov dword ptr ss:[ebp-4],eax
0FC80310 8B4D FC mov ecx,dword ptr ss:[ebp-4]
0FC80313 8B11 mov edx,dword ptr ds:[ecx]
0FC80315 83E2 01 and edx,1
0FC80318 85D2 test edx,edx
0FC8031A 74 18 je short 0FC80334
0FC8031C 8B45 FC mov eax,dword ptr ss:[ebp-4]
0FC8031F 8B08 mov ecx,dword ptr ds:[eax]
0FC80321 83E1 02 and ecx,2
0FC80324 85C9 test ecx,ecx
0FC80326 74 0C je short 0FC80334
0FC80328 8B55 FC mov edx,dword ptr ss:[ebp-4]
0FC8032B 8B02 mov eax,dword ptr ds:[edx]
0FC8032D 83E0 04 and eax,4
0FC80330 85C0 test eax,eax
0FC80332 75 04 jnz short 0FC80338
0FC80334 33C0 xor eax,eax
0FC80336 EB 6E jmp short 0FC803A6
0FC80338 8B4D F8 mov ecx,dword ptr ss:[ebp-8]
0FC8033B 8179 0C C70000>cmp dword ptr ds:[ecx+C],0C7
0FC80342 75 41 jnz short 0FC80385
0FC80344 8B55 F8 mov edx,dword ptr ss:[ebp-8]
0FC80347 8B45 08 mov eax,dword ptr ss:[ebp+8]
0FC8034A 8B4A 14 mov ecx,dword ptr ds:[edx+14]
0FC8034D 3B48 70 cmp ecx,dword ptr ds:[eax+70]
0FC80350 75 0B jnz short 0FC8035D
0FC80352 8B55 0C mov edx,dword ptr ss:[ebp+C]
0FC80355 C702 00000000 mov dword ptr ds:[edx],0
0FC8035B EB 26 jmp short 0FC80383
0FC8035D 8B45 F8 mov eax,dword ptr ss:[ebp-8]
0FC80360 8B48 14 mov ecx,dword ptr ds:[eax+14]
0FC80363 894D F4 mov dword ptr ss:[ebp-C],ecx
0FC80366 8B55 08 mov edx,dword ptr ss:[ebp+8]
0FC80369 8B42 5C mov eax,dword ptr ds:[edx+5C]
0FC8036C 50 push eax
0FC8036D 8B4D 08 mov ecx,dword ptr ss:[ebp+8]
0FC80370 8B51 58 mov edx,dword ptr ds:[ecx+58]
0FC80373 52 push edx
0FC80374 8B45 F8 mov eax,dword ptr ss:[ebp-8]
0FC80377 8B48 04 mov ecx,dword ptr ds:[eax+4]
0FC8037A 51 push ecx
0FC8037B FF55 F4 call dword ptr ss:[ebp-C]
0FC8037E 8B55 0C mov edx,dword ptr ss:[ebp+C]
0FC80381 8902 mov dword ptr ds:[edx],eax
0FC80383 EB 1C jmp short 0FC803A1
0FC80385 8B45 F8 mov eax,dword ptr ss:[ebp-8]
0FC80388 8B48 14 mov ecx,dword ptr ds:[eax+14]
0FC8038B 894D EC mov dword ptr ss:[ebp-14],ecx
0FC8038E 8B5D EC mov ebx,dword ptr ss:[ebp-14]
0FC80391 FFE3 jmp ebx ; 这里会跳到完全解压的主程序,就是OEP了。
F8一下,光明世界就在你的面前:
004E8E90 /. 55 push ebp
004E8E91 |. 8BEC mov ebp,esp
004E8E93 |. 6A FF push -1
004E8E95 |. 68 D8285B00 push Insta3De.005B28D8
004E8E9A |. 68 50E14E00 push Insta3De.004EE150 ; SE handler installation
004E8E9F |. 64:A1 000000>mov eax,dword ptr fs:[0]
004E8EA5 |. 50 push eax
004E8EA6 |. 64:8925 0000>mov dword ptr fs:[0],esp
004E8EAD |. 83C4 A4 add esp,-5C
004E8EB0 |. 53 push ebx
004E8EB1 |. 56 push esi
004E8EB2 |. 57 push edi
004E8EB3 |. 8965 E8 mov dword ptr ss:[ebp-18],esp
004E8EB6 |. FF15 68F6590>call dword ptr ds:[59F668] ; KERNEL32.GetVersion
004E8EBC |. A3 E0875F00 mov dword ptr ds:[5F87E0],eax
004E8EC1 |. A1 E0875F00 mov eax,dword ptr ds:[5F87E0]
004E8EC6 |. C1E8 08 shr eax,8
004E8EC9 |. 25 FF000000 and eax,0FF
004E8ECE |. A3 EC875F00 mov dword ptr ds:[5F87EC],eax
004E8ED3 |. 8B0D E0875F0>mov ecx,dword ptr ds:[5F87E0]
004E8ED9 |. 81E1 FF00000>and ecx,0FF
脱壳完成了.然后用ImprtRec修复一下即大功告成.菜鸟累了,该喝一杯去了!!!
【总结】我按照书上讲解将VBOX几个例子在OD下都脱壳了一遍,觉得有很多共同点:
1 寻找VBOX关键的CALL ESI或CALL EAX等时一般前面都是RETN 4了.
2 破解VBOX4.3与4.2保护时经过的RET次数都一样
3 对于VBOX4.3如果利用OD直接脱壳,重建输入表有两种方式:
利用方式1脱壳得到的文件可以直接运行,但是点击运行时时可能会出现内存不可以访问的错误。
利用方式2脱壳得到的文件不能运行,但是利用ImportRec进行修复之后程序能够完全正常运行。
4 短距离CALL一定要F7跟进去了.
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课