首页
社区
课程
招聘
[原创]脱CCG的hoto前辈写的CrackMe的壳[FSG1.33-dulek/xt]
发表于: 2006-6-5 23:34 5461

[原创]脱CCG的hoto前辈写的CrackMe的壳[FSG1.33-dulek/xt]

2006-6-5 23:34
5461
【脱文标题】:脱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期)

收藏
免费 0
支持
分享
最新回复 (10)
雪    币: 817
活跃值: (1927)
能力值: ( LV12,RANK:2670 )
在线值:
发帖
回帖
粉丝
2
2006-6-5 23:53
0
雪    币: 206
活跃值: (32)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
附件?
2006-6-6 09:02
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
我没有权限上传附件啊!
2006-6-6 12:26
0
雪    币: 253
活跃值: (25)
能力值: ( LV9,RANK:290 )
在线值:
发帖
回帖
粉丝
5
学习
2006-6-6 16:31
0
雪    币: 1355
活跃值: (339)
能力值: ( LV13,RANK:920 )
在线值:
发帖
回帖
粉丝
6
厉害!我前几天刚好给它脱了壳,修复了输入表.(的确有最后的那个指针修复不了)
却发现无法运行,跟踪到了一个INT3中断,出错.那时也已经看到了上头的那个跳转.不过我经验不够,没想到这样改一下都可以正常运行了
呵呵,高!
2006-9-7 17:26
0
雪    币: 230
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
看着头晕
2006-9-8 02:33
0
雪    币: 323
活跃值: (589)
能力值: ( LV12,RANK:450 )
在线值:
发帖
回帖
粉丝
8
上传一个附件
上传的附件:
2006-9-10 22:27
0
雪    币: 2943
活跃值: (1788)
能力值: ( LV9,RANK:850 )
在线值:
发帖
回帖
粉丝
9
最初由 爱琴海 发布
厉害!我前几天刚好给它脱了壳,修复了输入表.(的确有最后的那个指针修复不了)
却发现无法运行,跟踪到了一个INT3中断,出错.那时也已经看到了上头的那个跳转.不过我经验不够,没想到这样改一下都可以正常运行了
呵呵,高!

修复不了的指会Cut就行,Int3中断,Nop掉就OK
2006-9-12 13:22
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
将0040127C处的7E02修改为BE02
这句不对吧应该修改成EB02才对吧!
2006-9-12 22:46
0
雪    币: 0
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
0401272   |.  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]

此处应该是在判断文件的大小,如果文件大小变大就会执行 int 13,所以跳过这处就可以了!
2006-9-13 10:31
0
游客
登录 | 注册 方可回帖
返回
//