-
-
[原创]Vcrkme01的算法分析和注册机
-
发表于: 2010-7-19 09:11 4458
-
【文章标题】: 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;
}
【文章作者】: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期)
赞赏
他的文章
- [原创]deurus's keygenMe#02算法分析及注册机 5727
- [原创]Vcrkme01的算法分析和注册机 4459
- [讨论]谈一下我的感受。 1382
- [求助]为什么我浏览一些贴子不能显示图片?? 3086
看原图
赞赏
雪币:
留言: