首页
社区
课程
招聘
[原创][简单]一个win32控制台的crackme的分析
发表于: 2009-5-9 12:39 7365

[原创][简单]一个win32控制台的crackme的分析

2009-5-9 12:39
7365

【文章标题】: 一个win32控制台的crackme的分析
【文章作者】: LILI
【作者邮箱】: [email]2130292@163.COM[/email]
【作者主页】: http://2130292.blog.163.com/
【作者QQ号】: 55713720
【软件名称】: jz_crackme1
【软件大小】: 84.0 KB (86,016 字节)
【下载地址】: http://crackmes.de/users/jz/jz_crackme1/download
【加壳方式】: 无
【保护方式】: 注册码
【编写语言】: VC++6.0
【使用工具】: OD
【操作平台】: XP SP3
【软件介绍】: 一个比较简单的crackme
【作者声明】: "好记性不如烂笔头",且为学习记录
--------------------------------------------------------------------------------
【详细过程】
  无聊的时候从http://crackmes.de上下它。下来打开一看是DOS界面,以为OD打不开,试试后发现OD也可以打开这个DOS的
  程序(其实它是VC++6.0写的win32控制台,标准PE文件)。
  
  程序只要求输入注册码,错就显示wrong!,对了就显示you got it!,所以用字符串参考可以很快找到关键码。如下:
  

  004013FC   > \8B0D D4414100 mov     ecx, dword ptr [4141D4]
  00401402   .  890D D8414100 mov     dword ptr [4141D8], ecx
  00401408   .  8B95 9CFAFFFF mov     edx, dword ptr [ebp-564]         ;  注册码长度
  0040140E   .  52            push    edx
  0040140F   .  8D85 E0FAFFFF lea     eax, dword ptr [ebp-520]         ;  注册码
  00401415   .  50            push    eax
  00401416   .  E8 A5000000   call    004014C0                         ;  算法
  0040141B   .  83C4 08       add     esp, 8
  0040141E   .  8985 A8FAFFFF mov     dword ptr [ebp-558], eax
  00401424   .  8B0D D8414100 mov     ecx, dword ptr [4141D8]
  0040142A   .  890D DC414100 mov     dword ptr [4141DC], ecx
  00401430   .  8B95 A8FAFFFF mov     edx, dword ptr [ebp-558]
  00401436   .  3315 D0414100 xor     edx, dword ptr [4141D0]
  0040143C   .  8995 A8FAFFFF mov     dword ptr [ebp-558], edx
  00401442   .  A1 DC414100   mov     eax, dword ptr [4141DC]
  00401447   .  A3 E0414100   mov     dword ptr [4141E0], eax
  0040144C   .  8B8D A8FAFFFF mov     ecx, dword ptr [ebp-558]
  00401452   .  330D E0414100 xor     ecx, dword ptr [4141E0]
  00401458   .  898D A8FAFFFF mov     dword ptr [ebp-558], ecx
  0040145E   .  81BD A8FAFFFF>cmp     dword ptr [ebp-558], AF006DC3    ;注册码计算后要等于AF006DC3
  00401468   .  74 0F         je      short 00401479
  0040146A   .  68 58104100   push    00411058                         ;  wrong!\n
  0040146F   .  E8 7F0B0000   call    00401FF3
  

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 7
支持
分享
最新回复 (12)
雪    币: 485
活跃值: (12)
能力值: ( LV9,RANK:490 )
在线值:
发帖
回帖
粉丝
2
支持并学习一下!
有时间也来写一个玩玩!
2009-5-9 14:54
0
雪    币: 2067
活跃值: (82)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
3
LS的东西都太难了
不玩了.
2009-5-9 15:13
0
雪    币: 205
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
我调试了一下午都没弄明白,现在有点晕,,貌似连输入lz的密码也不行,明天再试一试
还是不行,sigh
请教下,不知道是不是我的分析有误

函数 004014C0:
//char str[]代表注册码

                      FEBAF001→[ebp-4]
                             ↓
                ———————————————
               ↓                            ↓
         if(str[0]=='t')                          else
            ↓                               ↓
            ↓                       str[2]^FEBAF001→[ebp-4]
            ↓                               ↓ rol 4
            —————————————————
                             ↓  rol 8
                        strlen(str)==7
                             ↓
          ————————————————————
         ↓                                      ↓
         Yes                                     no
         ↓                                      ↓
         ↓                               str[5]^[ebp-4]→[ebp-4]
         ↓                                      ↓
          ————————————————————
                             ↓ rol 4
                        str[0]-str[4]==2
                             ↓
              —————————————————
             ↓                                ↓
             Yes                               no
             ↓                                ↓
       str[4]^[ebp-4]→[ebp-4]             str[6]^[ebp-4]→[ebp-4]
             ↓                                ↓
              —————————————————
                              ↓
                      Str[4]-str[1]==0xA
                              ↓
             ————————————————
            ↓                              ↓
            Yes                              No
            ↓                              ↓ rol 0x10
        str[2]^[ebp-4]→[ebp-4]                     ↓
            ↓ rol 8                         ↓
             ————————————————
                             ↓
                           str[1]-str[2]==0x35                  
                              ↓
               ————————————————————————
              ↓                                              ↓            
             Yes                                              No
              ↓ rol 0x10                                      ↓
              ↓                                    str[5]^[ebp-4]→[ebp-4]
              ↓                                              ↓
               ————————————————————————
                                       ↓
                                 [ebp-4]^(str[0]-str[3])→[ebp-4]
                                       ↓
                               str[4]^[ebp-4]→[ebp-4]
                                       ↓ rol 8
                                  Str[5]==0x69
                                       ↓
                     ———————————————————
                    ↓                                    ↓
                    Yes                                   no
                    ↓                                    ↓
                    ↓                             F001F001→[ebp-4]
                    ↓                                    ↓
                     ———————————————————
                                       ↓                  
                              Str[5]^[ebp-4]→[ebp-4] (AF0E7CEF)
                                       ↓
                                  Str[6]==0x6E
                                       ↓
                    ——————————————————           
                   ↓                                   ↓
                  Yes                                   no
                   ↓                                   ↓
                   ↓                            BADDF00D→[ebp-4]
                   ↓                                   ↓
                    ———————————————————
                                        ↓
                              返回 [ebp-4](须等于AF0E7C86)
2009-5-9 20:32
0
雪    币: 86
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
支持一下,

慢慢看
2009-5-10 08:02
0
雪    币: 1596
活跃值: (30)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
6
回复fonilye: "返回 [ebp-4](须等于AF0E7C86)"为什么是AF0E7C86???,我觉得cmp     dword ptr [ebp-558], AF006DC3里的AF006DC3应该是常量,不会因为换了机器就改变呀???
0040141E   .  8985 A8FAFFFF mov     dword ptr [ebp-558], eax
00401424   .  8B0D D8414100 mov     ecx, dword ptr [4141D8]
0040142A   .  890D DC414100 mov     dword ptr [4141DC], ecx
00401430   .  8B95 A8FAFFFF mov     edx, dword ptr [ebp-558]
00401436   .  3315 D0414100 xor     edx, dword ptr [4141D0]
0040143C   .  8995 A8FAFFFF mov     dword ptr [ebp-558], edx
00401442   .  A1 DC414100   mov     eax, dword ptr [4141DC]
00401447   .  A3 E0414100   mov     dword ptr [4141E0], eax
0040144C   .  8B8D A8FAFFFF mov     ecx, dword ptr [ebp-558]
00401452   .  330D E0414100 xor     ecx, dword ptr [4141E0]
00401458   .  898D A8FAFFFF mov     dword ptr [ebp-558], ecx
0040145E   .  81BD A8FAFFFF>cmp     dword ptr [ebp-558], AF006DC3
00401468   .  74 0F         je      short 00401479
0040146A   .  68 58104100   push    00411058                         ;  wrong!\n
0040146F   .  E8 7F0B0000   call    00401FF3

请看看dword ptr [4141D8],dword ptr [4141D0],dword ptr [4141DC],dword ptr [4141E0]这几个地方的数据,我的机子上全是0所以可以用AF006DC3直接逆出注册码第4位,如果以上几个地方的数据不为0,我猜应该是一些机器特征。详细还等你的分析。
2009-5-10 08:18
0
雪    币: 1596
活跃值: (30)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
7
是大侠你不想吧!
2009-5-10 08:53
0
雪    币: 205
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
那个值是逆推得出来的,不知道会不会用到机器特征码,可以试一下,在
00401416   .  E8 A5000000   call    004014C0
返回处将eax改成AF0E7C86试试能不能跳到“you got it”。在我的机器上能

程序开始时(即eip=0040251E时)
都是零
调试到eip=0040144C时
[4141D0]是0,[4141D4]、[4141D8]、[4141DC]、[4141E0]是相同的,都是0E1145

更难过的是直接爆破[00401468]时
00401468     /75 0F         jnz     short 00401479
程序报错
2009-5-10 11:05
0
雪    币: 452
活跃值: (10)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
9
流程图都画出来了。。。
2009-5-10 14:20
0
雪    币: 1596
活跃值: (30)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
10
00401235   .  83C4 04       add     esp, 4
00401238   .  FF05 D0414100 inc     dword ptr [4141D0]
0040123E   .  0F31          rdtsc                           <----------anti-debug
00401240   .  0105 D4414100 add     dword ptr [4141D4], eax

这里有anti-debug,如果anti-debug后[4141D4]就不为0(每一次数值都不同),结果就不对了,隐藏OD试试!!
2009-5-10 19:10
0
雪    币: 205
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
lz正解,茅塞顿开,多谢
2009-5-10 21:25
0
雪    币: 216
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
其实我一直想问个问题,他们标的什么注册码长度啊,计算的CALL了是如何知道的呢?
2009-6-7 19:51
0
雪    币: 58
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
顶下 慢慢看``
2009-6-13 16:45
0
游客
登录 | 注册 方可回帖
返回
//