Crack
先随便输入点什么试试
搜索字符串找到注册成功的位置
向上找到比较函数,跟随比较函数的2个地址
可以发现一个是输入的注册码,一个是算好的正确注册码
输入测试通过
算法分析
下面再来看看这个注册码是怎么算出来的
直接用 VB 反编译器基本上代码都出来了,也就没啥难度了
这个东西好像不支持加注释,那我就把代码粘出来吧。
Private Sub Command1_Click() '401FF0
loc_00402092: var_58 = Text2.Text
loc_004020CA: var_44 = var_58
loc_00402126: For var_24 = 1 To Len(var_44) Step 1 //循环累加ASCII码
loc_00402132:
loc_00402134: If var_108 = 0 Then GoTo loc_004021D6
loc_00402169: var_58 = CStr(Mid(var_44, CLng(var_24), 1)) //取一个字符
loc_00402176: var_B4 = Asc(var_58)
loc_004021A0: var_34 = var_34 + Asc(var_58) //加上它的ASCII码
loc_004021CB: Next var_24
loc_004021D1: GoTo loc_00402132
loc_004021D6: 'Referenced from: 00402134
loc_00402204: var_34 = var_34 * 1234567890 //整体乘上1234567890
loc_00402276: var_58 = Text1.Text
loc_00402298: var_64 = var_58
loc_004022CB: If (var_58 = var_34) = 0 Then GoTo loc_00402391
loc_004022D1: Beep
loc_00402308: var_B4 = "RiCHTiG !"
loc_00402327: var_A4 = " RiCHTiG !!!! .... weiter mit dem Nächsten !!!"
loc_00402374: var_54 = MsgBox(" RiCHTiG !!!! .... weiter mit dem Nächsten !!!", 48, "RiCHTiG !", 10, 10)
loc_0040238C: GoTo loc_00402446
loc_00402391: 'Referenced from: 004022CB
loc_004023C2: var_B4 = "LEiDER Falsch ! "
loc_004023E1: var_A4 = "Leider Falsch! Nochmal veruschen ! Wenn Du es nicht schaffen solltest, schreib mir ! [email protected]"
loc_0040242E: var_54 = MsgBox("Leider Falsch! Nochmal veruschen ! Wenn Du es nicht schaffen solltest, schreib mir ! [email protected]", 16, "LEiDER Falsch ! ", 10, 10)
loc_00402446: 'Referenced from: 0040238C
loc_00402459: GoTo loc_0040248F
loc_0040248E: Exit Sub
loc_0040248F: 'Referenced from: 00402459
loc_004024C0: GoTo loc_00esi
End Sub
最后比较正确的注册码发现还需要把字符串中的第4、9位替换成 “-”
C语言注册机:
#include <stdio.h>
#include <string.h>
int main()
{
unsigned char username[100];
long long id=0;
char ids[500];
gets(username); //使用gets用户名中可以包含空格
//scanf("%s",username);
for(int i=0;i<strlen(username);i++)
{
id+=username[i];
}
id*=1234567890;
sprintf(ids,"%lld",id);
ids[3]=ids[8]='-';
printf("%s",ids);
return 0;
}
注册效果:
C语言中文注册机:
中文仍然是GBK编码,解决方案与之前相同。
序列号竟然是负的!
#include <stdio.h>
#include <string.h>
int main()
{
unsigned char username[100];
long long id=0;
char ids[500];
gets(username);
//scanf("%s",username);
for(int i=0;i<strlen(username);i+=2)
{
id+=(0xFFFF<<16)+(username[i]<<8)+username[i+1];
}
id*=1234567890;
sprintf(ids,"%lld",id);
ids[3]=ids[8]='-';
printf("%s",ids);
return 0;
}
注册效果: