【脱文标题】:脱CCG的hoto前辈写的CrackMe的壳[FSG1.33-dulek/xt]
【脱文作者】:Steven
【作者邮箱】:lugb2003@sina.com
【软件名称】:CCG的hoto前辈写的CrackMe
【保护方式】:使用FSG1.33-dulek/xt壳保护
【编译语言】:MS VC++
【调试环境】:WinXP,Ollydbg
【脱壳日期】:2006.06.03
【脱壳目的】:推广使用Ollydbg手动脱壳
【作者声明】:初学Crack,只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
======================================================================
【脱壳过程】:
首先Peid查壳,为FSG 1.33 -> dulek/xt,OD载入运行,无任何异常,判断其为压缩壳。
00430764 1> BE A4014000 mov esi,1551-cra.004001A4 //外壳入口
00430769 AD lods dword ptr ds:[esi]
0043076A 93 xchg eax,ebx
0043076B AD lods dword ptr ds:[esi]
0043076C 97 xchg eax,edi
0043076D AD lods dword ptr ds:[esi]
0043076E 56 push esi
0043076F 96 xchg eax,esi
00430770 B2 80 mov dl,80
00430772 A4 movs byte ptr es:[edi],byte ptr ds:[e>
00430773 B6 80 mov dh,80
00430775 FF13 call dword ptr ds:[ebx]
00430777 ^ 73 F9 jnb short 1551-cra.00430772 //循环
00430779 33C9 xor ecx,ecx //单击鼠标左键选择此行,按F4,跳过循环
0043077B FF13 call dword ptr ds:[ebx]
0043077D 73 16 jnb short 1551-cra.00430795
0043077F 33C0 xor eax,eax
00430781 FF13 call dword ptr ds:[ebx]
00430783 73 1F jnb short 1551-cra.004307A4
00430785 B6 80 mov dh,80
00430787 41 inc ecx
00430788 B0 10 mov al,10
0043078A FF13 call dword ptr ds:[ebx]
0043078C 12C0 adc al,al
0043078E ^ 73 FA jnb short 1551-cra.0043078A //循环
00430790 75 3C jnz short 1551-cra.004307CE //选择此行,按F4,跳过循环
00430792 AA stos byte ptr es:[edi]
00430793 ^ EB E0 jmp short 1551-cra.00430775 //循环
00430795 FF53 08 call dword ptr ds:[ebx+8] //选择此行,按F4,跳过循环
00430798 02F6 add dh,dh
0043079A 83D9 01 sbb ecx,1
0043079D 75 0E jnz short 1551-cra.004307AD
0043079F FF53 04 call dword ptr ds:[ebx+4]
004307A2 EB 26 jmp short 1551-cra.004307CA
004307A4 AC lods byte ptr ds:[esi]
004307A5 D1E8 shr eax,1
004307A7 74 2F je short 1551-cra.004307D8
004307A9 13C9 adc ecx,ecx
004307AB EB 1A jmp short 1551-cra.004307C7
004307AD 91 xchg eax,ecx
004307AE 48 dec eax
004307AF C1E0 08 shl eax,8
004307B2 AC lods byte ptr ds:[esi]
004307B3 FF53 04 call dword ptr ds:[ebx+4]
004307B6 3D 007D0000 cmp eax,7D00
004307BB 73 0A jnb short 1551-cra.004307C7
004307BD 80FC 05 cmp ah,5
004307C0 73 06 jnb short 1551-cra.004307C8
004307C2 83F8 7F cmp eax,7F
004307C5 77 02 ja short 1551-cra.004307C9
004307C7 41 inc ecx
004307C8 41 inc ecx
004307C9 95 xchg eax,ebp
004307CA 8BC5 mov eax,ebp
004307CC B6 00 mov dh,0
004307CE 56 push esi
004307CF 8BF7 mov esi,edi
004307D1 2BF0 sub esi,eax
004307D3 F3:A4 rep movs byte ptr es:[edi],byte ptr d>
004307D5 5E pop esi
004307D6 ^ EB 9D jmp short 1551-cra.00430775 //循环
004307D8 8BD6 mov edx,esi //选择此行,按F4,跳过循环
004307DA 5E pop esi
004307DB AD lods dword ptr ds:[esi]
004307DC 48 dec eax
004307DD 74 0A je short 1551-cra.004307E9
004307DF 79 02 jns short 1551-cra.004307E3
004307E1 AD lods dword ptr ds:[esi]
004307E2 50 push eax
004307E3 56 push esi
004307E4 8BF2 mov esi,edx
004307E6 97 xchg eax,edi
004307E7 ^ EB 87 jmp short 1551-cra.00430770 //循环
004307E9 AD lods dword ptr ds:[esi] //选择此行,按F4,跳过循环
004307EA 93 xchg eax,ebx
004307EB 5E pop esi
004307EC 46 inc esi
004307ED AD lods dword ptr ds:[esi]
004307EE 97 xchg eax,edi
004307EF 56 push esi
004307F0 FF13 call dword ptr ds:[ebx]
004307F2 95 xchg eax,ebp
注意下面这个循环,请留意状态栏,你就会发现这个循环是释放输入表的,等待输入表释放完后就会跳转到程序的入口点了。
///////////////////////////////////////////////////////////////////////////////////////////
004307F3 AC lods byte ptr ds:[esi]
004307F4 84C0 test al,al
004307F6 ^ 75 FB jnz short 1551-cra.004307F3 //循环
004307F8 FE0E dec byte ptr ds:[esi] //选择此行,按F4,跳过循环
004307FA ^ 74 F0 je short 1551-cra.004307EC
004307FC 79 05 jns short 1551-cra.00430803
004307FE 46 inc esi
004307FF AD lods dword ptr ds:[esi]
00430800 50 push eax
00430801 EB 09 jmp short 1551-cra.0043080C
00430803 FE0E dec byte ptr ds:[esi]
00430805 - 0F84 5B1EFDFF je 1551-cra.00402666
注意这个跳转,这里的跨段跳跃,肯定是OEP入口跳转。
而这个壳并不那么简单,当你跟踪到这里时,发现跳转并没有实现,怎样让程序跳到程序入口,就成了问题的关键。
要解决这个问题,对付它最好的方法就是模拟跟踪。我们先打开内存映射(ATL+M),壳的工作区段在422000 resources段里面。
内存映射,项目 15
地址=00422000
大小=0000F000 (61440.)
物主=1551-cra 00400000
区段=
包含=SFX,imports,resources// 当前段是在422000里面。
类型=Imag 01001002
访问=R
初始访问=RWE
内存映射,项目 14
地址=00401000
大小=00021000 (135168.)
物主=1551-cra 00400000
区段=
包含=code //OEP肯定是在Code段里面。不管FSG在SFX,imports,resources区段里面解压。最后肯定要跨段访问401000 Code段。
类型=Imag 01001002
访问=R
初始访问=RWE
于是,命令行下
tc eip<422000 //跟踪指令。
0043080B 56 push esi
0043080C 55 push ebp
0043080D FF53 04 call dword ptr ds:[ebx+4]
00430810 AB stos dword ptr es:[edi]
00430811 ^ EB E0 jmp short 1551-cra.004307F3 //循环
////////////////////////////////////////////////////////////////////////////////////////////
不到一分钟,就会来到程序入口点(OEP)
00402666 55 db 55 ; CHAR 'U' //OEP入口点,现在可以Dump了
00402667 8B db 8B
00402668 EC db EC
00402669 6A db 6A ; CHAR 'j'
0040266A FF db FF
0040266B 68 db 68 ; CHAR 'h'
0040266C 00 db 00
0040266D 67 db 67 ; CHAR 'g'
0040266E 41 db 41 ; CHAR 'A'
0040266F 00 db 00
00402670 68 db 68 ; CHAR 'h'
00402671 FC db FC
00402672 50 db 50 ; CHAR 'P'
00402673 40 db 40 ; CHAR '@'
00402674 00 db 00
00402675 64 db 64 ; CHAR 'd'
----------------------------------------------------------------------------------------------------------
00402666 >/$ 55 push ebp //VC程序入口特征码
00402667 |. 8BEC mov ebp,esp
00402669 |. 6A FF push -1
0040266B |. 68 00674100 push 3_.00416700
00402670 |. 68 FC504000 push 3_.004050FC ; SE 句柄安装
00402675 |. 64:A1 00000000 mov eax,dword ptr fs:[0]
0040267B |. 50 push eax
0040267C |. 64:8925 00000000 mov dword ptr fs:[0],esp
00402683 |. 83EC 58 sub esp,58
00402686 |. 53 push ebx
00402687 |. 56 push esi
00402688 |. 57 push edi
00402689 |. 8965 E8 mov dword ptr ss:[ebp-18],esp
0040268C |. FF15 14524100 call dword ptr ds:[<&kernel32.GetVers>; kernel32.GetVersion
脱壳后需要用Imprec修复引入函数表(Import Table)。
有一个函数修复不了,可将其删掉。
修复完后,发现程序不能运行,于是用OD载入脱完壳的程序,进行调试,按F9运行
00401272 |. 81BD D8FDFFFF 45FB0>cmp dword ptr ss:[ebp-228],0FB45
0040127C |. 7E 02 jle short 1_.00401280
0040127E |. CD 13 int 13 //程序会停在这里,看一下上面的语句是个跳转语句。而这个跳转,刚好绕过这个中断。
00401280 |> 8D4D E4 lea ecx,dword ptr ss:[ebp-1C]
现在回过头来,用OD载入没有脱壳的程序,重复上面的步骤,来到程序的入口点,按Ctrl+G 输入00401272,按F4,程序运行到00401272,
按F8,单步执行,就会发现程序从0040127C跳转到00401280处。
于是,在脱完壳的程序中,将0040127C处的7E02修改为BE02,修改完后保存,运行程序,一切OK!
这里只说明怎样手动脱壳,破解过程不在这里赘述了。
==================================================================
Copyright ?2006.06 Steven
==================================================================
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)