首页
社区
课程
招聘
[原创]Vcrkme01的算法分析和注册机
发表于: 2010-7-19 09:11 4457

[原创]Vcrkme01的算法分析和注册机

2010-7-19 09:11
4457
【文章标题】: Vcrkme01的算法分析和注册机
【文章作者】:pickup
【软件名称】: Vcrkme01.exe
【软件大小】: 32 KB
【下载地址】: 见以下附件
【编写语言】: VC6.0
【使用工具】: PEID,OD
【操作平台】: Windows XP3
【连接地址】: http://bbs.pediy.com/showthread.php?p=837350#post837350
【程序介绍】: 一个简单的cm的分析

贴下逍遥风原帖地址
http://bbs.pediy.com/showthread.php?threadid=29510

最近在练习CrackMe板块的一些cm的分析,看到了逍遥风发表的一个标志位爆破的文章,查看了原链接发现回复很少,里面也没有看到对这个程序的算法分析,只是讲了爆破的方法,可能是几年前的帖子所以不全吧,于是自己跟进去分析了以下,终于明白了。。

00401223   .  68 FF000000   PUSH 0FF                                 ; /Count = FF (255.)
00401228   .  68 30694000   PUSH Vcrkme01.00406930                   ; |pediy
0040122D   .  68 E8030000   PUSH 3E8                                 ; |ControlID = 3E8 (1000.)
00401232   .  50            PUSH EAX                                 ; |hWnd => 00100396 ('[v0!d] Crackme - v0.01',class='#32770')
00401233   .  FFD6          CALL ESI                                 ; \GetDlgItemTextA
00401235   .  8B0D 28694000 MOV ECX,DWORD PTR DS:[406928]            ;  取注册名
0040123B   .  68 FF000000   PUSH 0FF                                 ; /Count = FF (255.)
00401240   .  68 306A4000   PUSH Vcrkme01.00406A30                   ; |p-123
00401245   .  68 EA030000   PUSH 3EA                                 ; |ControlID = 3EA (1002.)
0040124A   .  51            PUSH ECX                                 ; |hWnd => 00100396 ('[v0!d] Crackme - v0.01',class='#32770')
0040124B   .  FFD6          CALL ESI                                 ; \GetDlgItemTextA
0040124D   .  68 306A4000   PUSH Vcrkme01.00406A30                   ;  p-123
00401252   .  68 30694000   PUSH Vcrkme01.00406930                   ;  pediy
00401257   .  E8 A4FDFFFF   CALL Vcrkme01.00401000                   ;  关键函数,要跟进,计算出真正的注册码。
0040125C   .  83C4 08       ADD ESP,8
0040125F   .  83F8 01       CMP EAX,1
00401262   .  A3 646C4000   MOV DWORD PTR DS:[406C64],EAX
00401267   .  75 65         JNZ SHORT Vcrkme01.004012CE
00401269   .  8B15 28694000 MOV EDX,DWORD PTR DS:[406928]
0040126F   .  6A 40         PUSH 40                                  ; /Style = MB_OK|MB_ICONASTERISK|MB_APPLMODAL
00401271   .  68 80604000   PUSH Vcrkme01.00406080                   ; |GOOD JOB! - CRACKED!
00401276   .  68 50604000   PUSH Vcrkme01.00406050                   ; |Send your solution to : v0id2k1@hotmail.com
0040127B   .  52            PUSH EDX                                 ; |hOwner => 00100396 ('[v0!d] Crackme - v0.01',class='#32770')
0040127C   .  FF15 C4504000 CALL DWORD PTR DS:[<&USER32.MessageBoxA>>; \MessageBoxA

跟进call后。。。
00401000  /$  53            PUSH EBX
00401001  |.  8B5C24 0C     MOV EBX,DWORD PTR SS:[ESP+C]
00401005  |.  55            PUSH EBP
00401006  |.  56            PUSH ESI
00401007  |.  8B7424 10     MOV ESI,DWORD PTR SS:[ESP+10]
0040100B  |.  8A0B          MOV CL,BYTE PTR DS:[EBX]                 ;  注册码第一位送CL
0040100D  |.  33ED          XOR EBP,EBP
0040100F  |.  57            PUSH EDI
00401010  |.  8A06          MOV AL,BYTE PTR DS:[ESI]                 ;  注册名第一位送AL
00401012  |.  3AC1          CMP AL,CL                                ;  判断注册名和注册码的第一位是否相同,不同跳走
00401014  |.  0F85 69010000 JNZ Vcrkme01.00401183
0040101A  |.  8BFE          MOV EDI,ESI
0040101C  |.  83C9 FF       OR ECX,FFFFFFFF
0040101F  |.  33C0          XOR EAX,EAX
00401021  |.  F2:AE         REPNE SCAS BYTE PTR ES:[EDI]
00401023  |.  F7D1          NOT ECX
00401025  |.  49            DEC ECX
00401026  |.  83F9 05       CMP ECX,5
00401029  |.  0F82 54010000 JB Vcrkme01.00401183
0040102F  |.  807B 01 2D    CMP BYTE PTR DS:[EBX+1],2D               ;  判断注册码第二位是否是“-”
00401033  |.  0F85 4A010000 JNZ Vcrkme01.00401183
00401039  |.  8BFE          MOV EDI,ESI
0040103B  |.  83C9 FF       OR ECX,FFFFFFFF
0040103E  |.  33C0          XOR EAX,EAX
00401040  |.  33D2          XOR EDX,EDX
00401042  |.  F2:AE         REPNE SCAS BYTE PTR ES:[EDI]
00401044  |.  F7D1          NOT ECX
00401046  |.  49            DEC ECX
00401047  |.  74 17         JE SHORT Vcrkme01.00401060
00401049  |>  0FBE0C32      /MOVSX ECX,BYTE PTR DS:[EDX+ESI]         ;  这个循环用来将注册名每一位累加,值记作:A
0040104D  |.  03E9          |ADD EBP,ECX
0040104F  |.  8BFE          |MOV EDI,ESI
00401051  |.  83C9 FF       |OR ECX,FFFFFFFF
00401054  |.  33C0          |XOR EAX,EAX
00401056  |.  42            |INC EDX
00401057  |.  F2:AE         |REPNE SCAS BYTE PTR ES:[EDI]
00401059  |.  F7D1          |NOT ECX
0040105B  |.  49            |DEC ECX
0040105C  |.  3BD1          |CMP EDX,ECX
0040105E  |.^ 72 E9         \JB SHORT Vcrkme01.00401049
00401060  |>  81C5 64600000 ADD EBP,6064                             ;  累加后的值+0X6064,得到值记作:B
00401066  |.  55            PUSH EBP
00401067  |.  68 34604000   PUSH Vcrkme01.00406034                   ;  %lu
0040106C  |.  68 306B4000   PUSH Vcrkme01.00406B30                   ;  49891
00401071  |.  E8 B6030000   CALL Vcrkme01.0040142C                   ;  这个函数将值B由16进制转换为10进制
00401076  |.  8A16          MOV DL,BYTE PTR DS:[ESI]
00401078  |.  8BFE          MOV EDI,ESI
0040107A  |.  83C9 FF       OR ECX,FFFFFFFF
0040107D  |.  33C0          XOR EAX,EAX
0040107F  |.  8815 446B4000 MOV BYTE PTR DS:[406B44],DL              ;  【406B44】处存放注册码第一位,也就是注册名的第一位
00401085  |.  C605 456B4000>MOV BYTE PTR DS:[406B45],2D              ;  【406B45】存放注册码第二位“-”
0040108C  |.  F2:AE         REPNE SCAS BYTE PTR ES:[EDI]
0040108E  |.  F7D1          NOT ECX
00401090  |.  49            DEC ECX
00401091  |.  0FBE4431 FF   MOVSX EAX,BYTE PTR DS:[ECX+ESI-1]        ;  取得注册名的最后一位
00401096  |.  50            PUSH EAX
00401097  |.  E8 C4020000   CALL Vcrkme01.00401360                   ;  这个函数作用:如果注册名最后一位是小写字母就转换大写,否则不变。
0040109C  |.  A2 466B4000   MOV BYTE PTR DS:[406B46],AL
004010A1  |.  BF 306B4000   MOV EDI,Vcrkme01.00406B30                ;  49891
004010A6  |.  83C9 FF       OR ECX,FFFFFFFF
004010A9  |.  33C0          XOR EAX,EAX
004010AB  |.  F2:AE         REPNE SCAS BYTE PTR ES:[EDI]
004010AD  |.  F7D1          NOT ECX
004010AF  |.  2BF9          SUB EDI,ECX
004010B1  |.  81C5 64600000 ADD EBP,6064                             ;  B值再和0X6064相加,得值:C,用作后面注册码的最后一部分数字
004010B7  |.  8BF7          MOV ESI,EDI
004010B9  |.  8BD1          MOV EDX,ECX
004010BB  |.  BF 446B4000   MOV EDI,Vcrkme01.00406B44
004010C0  |.  83C9 FF       OR ECX,FFFFFFFF
004010C3  |.  F2:AE         REPNE SCAS BYTE PTR ES:[EDI]             ;  将注册名最后一位处理后的存在注册码的第三位
004010C5  |.  8BCA          MOV ECX,EDX
004010C7  |.  4F            DEC EDI
004010C8  |.  C1E9 02       SHR ECX,2
004010CB  |.  F3:A5         REP MOVS DWORD PTR ES:[EDI],DWORD PTR DS>;  将转换为10进制的B值和上面的注册码的前三位合并
004010CD  |.  8BCA          MOV ECX,EDX
004010CF  |.  55            PUSH EBP
004010D0  |.  83E1 03       AND ECX,3
004010D3  |.  68 34604000   PUSH Vcrkme01.00406034                   ;  %lu
004010D8  |.  F3:A4         REP MOVS BYTE PTR ES:[EDI],BYTE PTR DS:[>
004010DA  |.  BF 30604000   MOV EDI,Vcrkme01.00406030                ;  -
004010DF  |.  83C9 FF       OR ECX,FFFFFFFF
004010E2  |.  F2:AE         REPNE SCAS BYTE PTR ES:[EDI]
004010E4  |.  F7D1          NOT ECX
004010E6  |.  2BF9          SUB EDI,ECX
004010E8  |.  68 306B4000   PUSH Vcrkme01.00406B30                   ;  49891
004010ED  |.  8BF7          MOV ESI,EDI
004010EF  |.  8BD1          MOV EDX,ECX
004010F1  |.  BF 446B4000   MOV EDI,Vcrkme01.00406B44
004010F6  |.  83C9 FF       OR ECX,FFFFFFFF
004010F9  |.  F2:AE         REPNE SCAS BYTE PTR ES:[EDI]
004010FB  |.  8BCA          MOV ECX,EDX
004010FD  |.  4F            DEC EDI
004010FE  |.  C1E9 02       SHR ECX,2
00401101  |.  F3:A5         REP MOVS DWORD PTR ES:[EDI],DWORD PTR DS>
00401103  |.  8BCA          MOV ECX,EDX
00401105  |.  83E1 03       AND ECX,3
00401108  |.  F3:A4         REP MOVS BYTE PTR ES:[EDI],BYTE PTR DS:[>;  注册码追加“-”字符
0040110A  |.  E8 1D030000   CALL Vcrkme01.0040142C                   ;  该函数将C值转换为10进制。
0040110F  |.  BF 306B4000   MOV EDI,Vcrkme01.00406B30                ;  49891
00401114  |.  83C9 FF       OR ECX,FFFFFFFF
00401117  |.  33C0          XOR EAX,EAX
00401119  |.  83C4 1C       ADD ESP,1C
0040111C  |.  F2:AE         REPNE SCAS BYTE PTR ES:[EDI]
0040111E  |.  F7D1          NOT ECX
00401120  |.  2BF9          SUB EDI,ECX
00401122  |.  8BF7          MOV ESI,EDI
00401124  |.  8BD1          MOV EDX,ECX
00401126  |.  BF 446B4000   MOV EDI,Vcrkme01.00406B44
0040112B  |.  83C9 FF       OR ECX,FFFFFFFF
0040112E  |.  F2:AE         REPNE SCAS BYTE PTR ES:[EDI]
00401130  |.  8BCA          MOV ECX,EDX
00401132  |.  4F            DEC EDI
00401133  |.  C1E9 02       SHR ECX,2
00401136  |.  F3:A5         REP MOVS DWORD PTR ES:[EDI],DWORD PTR DS>
00401138  |.  8BCA          MOV ECX,EDX
0040113A  |.  8BC3          MOV EAX,EBX
0040113C  |.  83E1 03       AND ECX,3
0040113F  |.  F3:A4         REP MOVS BYTE PTR ES:[EDI],BYTE PTR DS:[>;  C转换10进制的值和之前的注册码合并成最终的结果
00401141  |.  BE 446B4000   MOV ESI,Vcrkme01.00406B44
00401146  |>  8A10          /MOV DL,BYTE PTR DS:[EAX]
00401148  |.  8A1E          |MOV BL,BYTE PTR DS:[ESI]
0040114A  |.  8ACA          |MOV CL,DL
0040114C  |.  3AD3          |CMP DL,BL
0040114E  |.  75 25         |JNZ SHORT Vcrkme01.00401175
00401150  |.  84C9          |TEST CL,CL
00401152  |.  74 16         |JE SHORT Vcrkme01.0040116A
00401154  |.  8A50 01       |MOV DL,BYTE PTR DS:[EAX+1]
00401157  |.  8A5E 01       |MOV BL,BYTE PTR DS:[ESI+1]
0040115A  |.  8ACA          |MOV CL,DL
0040115C  |.  3AD3          |CMP DL,BL
0040115E  |.  75 15         |JNZ SHORT Vcrkme01.00401175
00401160  |.  83C0 02       |ADD EAX,2
00401163  |.  83C6 02       |ADD ESI,2
00401166  |.  84C9          |TEST CL,CL
00401168  |.^ 75 DC         \JNZ SHORT Vcrkme01.00401146             ;  比较真码和假码,不同跳走
0040116A  |>  33C0          XOR EAX,EAX
0040116C  |.  33D2          XOR EDX,EDX
0040116E  |.  85C0          TEST EAX,EAX
00401170  |.  0F94C2        SETE DL
00401173  |.  EB 12         JMP SHORT Vcrkme01.00401187
00401175  |>  1BC0          SBB EAX,EAX
00401177  |.  83D8 FF       SBB EAX,-1
0040117A  |.  33D2          XOR EDX,EDX
0040117C  |.  85C0          TEST EAX,EAX
0040117E  |.  0F94C2        SETE DL
00401181  |.  EB 04         JMP SHORT Vcrkme01.00401187
00401183  |>  8B5424 14     MOV EDX,DWORD PTR SS:[ESP+14]
00401187  |>  B9 40000000   MOV ECX,40
0040118C  |.  33C0          XOR EAX,EAX
0040118E  |.  BF 446B4000   MOV EDI,Vcrkme01.00406B44
00401193  |.  F3:AB         REP STOS DWORD PTR ES:[EDI]
00401195  |.  5F            POP EDI
00401196  |.  5E            POP ESI
00401197  |.  5D            POP EBP
00401198  |.  8BC2          MOV EAX,EDX                              ;  此处给EAX赋值,用作一个标志
0040119A  |.  5B            POP EBX
0040119B  \.  C3            RETN

总结:
1。 用户名不能少于5位
2。注册码第一位必须是用户名第一位,第二位必须是“-”,否则即使跟进关键call也看不到真码,
3。注册名每位累加后河0x6064求和后是第二部分呢的注册码,再次累加0x6064后是第三部分的注册码。
4。注册码的第三个字符必须是注册名的最后一位,若是小写则要转换成大写,否则不变。

注册机代码:
本人水平不行,请将就着看。
VC6.0下编译
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void)
{
        char name[20]={"12345678G"};
        char sn[30]={""};
        char temp[10];
        int i,sum1,sum2;
        sum1=0;       //存放注册码的第二部分
        sum2=0;                //存放注册码的第三部分
        sn[0]=name[0];  //注册码第一位和注册名第一位相同
        sn[1]='-';      //注册码第二位是“-”
        i=0;
        while (name[i]!=0)  //取用户名的长度
        {
                i++;
        }
        if (name[i-1]>=0x61 && name[i-1]<=0x7A)
        {
                sn[2]=name[i-1]-0X20;   //注册码的第三位是用户名的最后一位。如果是小写就转换大写
        }
        else
         sn[2]=name[i-1];     //不是小写就不变。
       
        for (i=0;i<20;i++)
        {
                sum1=sum1+name[i];   //用户名的每位ascii码累加
        }
        //将上面计算的数值转换为字符串,并添加到sn中。
        sum1=sum1+0x6064;     //得出注册码的第二部分
        sum2=sum1+0x6064;     //得出注册码的第三部分
        itoa(sum1,temp,10);   //整形转换为字符。
        strcat(sn,temp);      //添加到注册码中
        i=0;
        while (sn[i]>0x00)
        {
                i++;
        }
        sn[i]='-';       // 注册码的第二部分呢和的三部分间加一个“-”字符
        itoa(sum2,temp,10);  //第三部分转字符串
        strcat(sn,temp);
//输出结果       
    printf("用户名:%s",name);   //输出用户名
        printf("\n");
        printf("注册码:%s\n\n",sn);        //输出注册码

        return 0;
}

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

上传的附件:
收藏
免费 0
支持
分享
最新回复 (1)
雪    币: 1844
活跃值: (35)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
2
我被 V 字吸引进来的,随便顶一下
2010-7-19 18:01
0
游客
登录 | 注册 方可回帖
返回
//