0040EB72 |? EC IN AL,DX
0040EB73 |. 83C4 F4 ADD ESP,-0C
0040EB76 |. 53 PUSH EBX
0040EB77 |. 56 PUSH ESI
0040EB78 |. 894D F4 MOV DWORD PTR SS:[EBP-C],ECX
0040EB7B |. 8955 F8 MOV DWORD PTR SS:[EBP-8],EDX
0040EB7E |. 8945 FC MOV DWORD PTR SS:[EBP-4],EAX ; EAX=009FED1C, (ASCII "wangwei")
0040EB81 |. 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
0040EB84 |. E8 9746FFFF CALL KeyGenMe.00403220
0040EB89 |. 8B45 F8 MOV EAX,DWORD PTR SS:[EBP-8]
0040EB8C |. E8 8F46FFFF CALL KeyGenMe.00403220
0040EB91 |. 33C0 XOR EAX,EAX
0040EB93 |. 55 PUSH EBP
0040EB94 |. 68 36EC4000 PUSH KeyGenMe.0040EC36
0040EB99 |. 64:FF30 PUSH DWORD PTR FS:[EAX]
0040EB9C |. 64:8920 MOV DWORD PTR FS:[EAX],ESP
0040EB9F |. 33DB XOR EBX,EBX
0040EBA1 |. 33F6 XOR ESI,ESI
0040EBA3 |. 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
0040EBA6 |. E8 C144FFFF CALL KeyGenMe.0040306C ; 相当 strlen()
0040EBAB |. 85C0 TEST EAX,EAX
0040EBAD |. 7E 13 JLE SHORT KeyGenMe.0040EBC2
0040EBAF |. BA 01000000 MOV EDX,1 ; -------------------------------|
0040EBB4 |> 8B4D FC /MOV ECX,DWORD PTR SS:[EBP-4] ; ASCII "wangwei"
0040EBB7 |. 0FB64C11 FF |MOVZX ECX,BYTE PTR DS:[ECX+EDX-1] ; 逐位取用户名的字符
0040EBBC |. 03D9 |ADD EBX,ECX ; 这个作用是把用户名的acsii进行自加
0040EBBE |. 42 |INC EDX
0040EBBF |. 48 |DEC EAX
0040EBC0 |.^ 75 F2 \JNZ SHORT KeyGenMe.0040EBB4 ; --------------------------|
相当这些代码:
int ziadd(*s)
{
int sum=0;
while ( *s !='\0')
{
sum = sum+*s;
}
ret
}
0040EBC2 |> 8B45 F8 MOV EAX,DWORD PTR SS:[EBP-8]
0040EBC5 |. E8 A244FFFF CALL KeyGenMe.0040306C ; 相当 strlen()
0040EBCA |. 85C0 TEST EAX,EAX
0040EBCC |. 7E 13 JLE SHORT KeyGenMe.0040EBE1
0040EBCE |. BA 01000000 MOV EDX,1
0040EBD3 |> 8B4D F8 /MOV ECX,DWORD PTR SS:[EBP-8] ; ------------------------------->
0040EBD6 |. 0FB64C11 FF |MOVZX ECX,BYTE PTR DS:[ECX+EDX-1] ; 把我们输入的假注册码进行自加
0040EBDB |. 03F1 |ADD ESI,ECX
0040EBDD |. 42 |INC EDX
0040EBDE |. 48 |DEC EAX
0040EBDF |.^ 75 F2 \JNZ SHORT KeyGenMe.0040EBD3 ; <---------------------
0040EBE1 |> 81C3 00000920 ADD EBX,20090000 ; 用户名自加的结果加上20090000
0040EBE7 |. B8 01070920 MOV EAX,20090701 ; 20090701
0040EBEC |. 2BC6 SUB EAX,ESI ; 20090701-注册码自加的结果
0040EBEE |. 3BD8 CMP EBX,EAX ; 在比较是否相同;一样就注册成功
0040EBF0 |. 75 1C JNZ SHORT KeyGenMe.0040EC0E
0040EBF2 |. 68 4CEC4000 PUSH KeyGenMe.0040EC4C ; Cool~
0040EBF7 |. FF75 FC PUSH DWORD PTR SS:[EBP-4]
0040EBFA |. 68 5CEC4000 PUSH KeyGenMe.0040EC5C ; Registered!
0040EBFF |. 8B45 F4 MOV EAX,DWORD PTR SS:[EBP-C]
0040EC02 |. BA 03000000 MOV EDX,3
0040EC07 |. E8 2045FFFF CALL KeyGenMe.0040312C
0040EC0C |. EB 0D JMP SHORT KeyGenMe.0040EC1B
0040EC0E |> 8B45 F4 MOV EAX,DWORD PTR SS:[EBP-C]
0040EC11 |. BA 74EC4000 MOV EDX,KeyGenMe.0040EC74 ; No,Unregistered!Try Again!
0040EC16 |. E8 4543FFFF CALL KeyGenMe.00402F60
0040EC1B |> 33C0 XOR EAX,EAX
0040EC1D |. 5A POP EDX
0040EC1E |. 59 POP ECX
0040EC1F |. 59 POP ECX
0040EC20 |. 64:8910 MOV DWORD PTR FS:[EAX],EDX
0040EC23 |. 68 3DEC4000 PUSH KeyGenMe.0040EC3D
0040EC28 |> 8D45 F8 LEA EAX,DWORD PTR SS:[EBP-8]
0040EC2B |. BA 02000000 MOV EDX,2
0040EC30 |. E8 FB42FFFF CALL KeyGenMe.00402F30
0040EC35 \. C3 RETN
0040EC36 .^ E9 A53DFFFF JMP KeyGenMe.004029E0
0040EC3B .^ EB EB JMP SHORT KeyGenMe.0040EC28
0040EC3D . 5E POP ESI
0040EC3E . 5B POP EBX
0040EC3F . 8BE5 MOV ESP,EBP
0040EC41 . 5D POP EBP
0040EC42 . C3 RETN
总结一下吧:
1. 第一是用户名自加后加上0X20090000;
2. 我们输入注册码也进行自加;在用20090701减去自加的结果;
3. 把上两次的结果进行比较,相等就注册成功了.
可以说作者写的这个CH写不乍好。一个用户名可能有N多个注册码。因为只要符合自加结果的字符串都可以成为注册码。
#include <stdio.h>
int ziadd(char *s)
{
int sum=0;
while ( *s != '\0')
{
sum +=*s;
s++;
}
return sum;
}
int main()
{
char name[30];
int key;
int a,b=0X65; b的值大家可以自己给定;设的值不一样得到的注册码好不一样
scanf("%s", &name);
a = ziadd(name);
key = 0X701-a;
printf("%X\n",key);
while ( key >= b)
{
key = key -b;
printf("%c", b);
b++;
}
printf("%c", key);
printf("\n");
}
这个KEY它只是注册码自加的结果;只要字符串自加的结果=key都可以作为注册码用。
如我的用户名为wangwei
计算可以得到KEY = 0X40F;
只要字符串自加=0X40F都可以作为注册码。
我的用户名是:
wangwei
当B的值是0X65时我的注册码为:efghijklm^
当B的值是0X69时我的注册码为:ijklmnopq:
上传的附件: