能力值:
( LV2,RANK:10 )
10 楼
key有何用?不影响结果,难道key意味着完美破解?
费解,费解
这是用户名得到的92D864BD,其他都不贴了,变化不大
能力值:
( LV8,RANK:130 )
11 楼
分析了一个晚上,还是没结果,很是郁闷,
谁告诉我最终结果哦
raojianbo 推出:aCaFeeL:|12345678|Jnlgj_vm|55CF3845| 为啥是错的呢,
能力值:
( LV4,RANK:50 )
12 楼
和我之前一样,其实还有一个地方校验的!
004BB4FC E8 D75AF7FF CALL BC2B8_.00430FD8 F7进去
00431005 |. /74 10 JE SHORT BC2B8_.00431017 把这个地方修改成JMP就可以了。
能力值:
( LV4,RANK:50 )
15 楼
#include<stdio.h>
#include<string.h>
int int2char(int num){
if(num<0xa)
num+=0x30;
else
num+=0x37;
return num;
}
int char2int(int num){
if(num<'A')
num-=0x30;
else
num-=0x37;
return num;
}
/*字符串变形*/
char * str2str(char * str, int keyFlg){
char *str1="IlikeYou";
char *str2="12315160";
char *str3="WoAiZhangLiangYing!";
char *str4="6143614665654c21";
char str5[20];
char buffer[30];
char buffer1[20];
char result[20];
int i, len, esi, flg;
//反序
len=strlen(str);
for(i=0; i<len; i++)
str5[i]=str[len-1-i];
str5[len]='\0';
memset(buffer, 0x00, sizeof(buffer));
memset(buffer1, 0x00, sizeof(buffer1));
memset(result, 0x00, sizeof(result));
//计算1
flg=len%2;
for(i=0, esi=0x80; i<len; i++){
esi=((str5[i]+esi)%0xff)^str3[i];
if(i%2==flg)
sprintf(buffer,"%s%X%X", buffer,int2char((esi&0xf0)/0x10), int2char(esi&0xf));
else
sprintf(buffer,"%s%X", buffer, esi);
}
strcat(buffer, str4);
//计算KEY 用于还原截取前的字符串
if(keyFlg==2)
return buffer;
//截取
buffer[16]='\0';
//反序
for(i=0; i<8; i++)
sprintf(buffer1,"%s%c%c", buffer1, buffer[14-i*2], buffer[15-i*2]);
//取得计算2以前的字符串 用于计算KEY
if(keyFlg==1)
return buffer1;
//计算注册码(计算2)
for(i=0; i<8; i++){
esi=((char2int(buffer1[i*2])*0x10+char2int(buffer1[i*2+1])+esi)%0xff)^0x2B;
if(esi<0x10&&keyFlg==0)
sprintf(result,"%s0%X", result, esi);
else
sprintf(result,"%s%X", result, esi);
}
//当用于计算用户名时
if(keyFlg==3)
result[8]='\0';
return result;
} /*
KEY的推导过程
1 2 3 4 5 6 7 输入key
7 6 5 4 3 2 1 反序
E0 37 38 EC 34 38 21 33 42 0D 计算1后的结果
E0 37 38 EC 34 38 21 33 截取
33 21 38 34 EC 38 37 E0 反序
6B A7 F4 2 C5 D6 25 2D 计算2后的结果
C5 D6 25 2D 最后结果
33 4D AA BA 需要的结果
逆计算2
18 66 81 91 穷举法
02 33 4D AA
16 33 34 E6 根据算法2可以得
33 21 38 34 16 33 34 E6 加上原来前面一截
E6 34 33 16 34 38 21 33 42 反序
逆计算1
E6 43 16 48 21 3B 根据计算1可得
B1 2C 57 21 7B 53 穷举法
31 45 14 B 33 32 根据计算1可得
31 45 14 B 33 32 ?? 由于最后一位截取了所以随便写
?? 32 33 B 14 45 31 反序
*/
//生成KEY
int doKey(char * key){
int num1[7]={0x33, 0x4D, 0xAA, 0xBA};
int num2[6];
int num3[6];
char key1[20];
char key2[20];
char keyTmp[10];
char *str1="WoAiZhangLiangYing!";
int n, i, esi, tmp;
memset(key2, 0x00, sizeof(key2));
//判断输入KEY是否可逆
strcpy(key1, str2str(key, 0));
for(n=0; n<4; n++)
if(key1[n*2]=='0')
break;
if(n==4)
return -1;
//得出XOR结果数 0x18 0x66 0x81 0x91
for(n=0; n<4; n++)
for(i=0; i<255; i++)
if((i^0x2b)==num1[n]){
num2[n]=i;
break;
}
//计算2逆向
//算出要减去的数
for(n=0; n<3; n++)
num1[3-n]=num1[2-n];
num1[0]=char2int(key1[6])*0x10+char2int(key1[7]);
//计算结果存为字符串
for(n=0; n<4; n++){
tmp=(num2[n]+0xff-num1[n])%0xff;
keyTmp[n*2]=int2char(tmp/0x10);
keyTmp[n*2+1]=int2char(tmp&0xf);
}
//取得计算2以前的字符串
strcpy(key1, str2str(key, 1));
//组合成新的字符串
for(n=0; n<4; n++){
key1[8+n*2]=keyTmp[n*2];
key1[9+n*2]=keyTmp[n*2+1];
}
//反序
for(i=0; i<8; i++)
sprintf(key2,"%s%c%c", key2, key1[14-i*2], key1[15-i*2]);
//取得计算1后的字符串
strcpy(key1, str2str(key, 2));
//还原截取前 得到新字符串
key2[16]=key1[16];
key2[17]=key1[17];
key2[18]='\0';
//计算1逆向
for(n=0, i=0; n<6; n++)
if(n%2==0){
key1[n*2]=key2[i];
key1[n*2+1]=key2[i+1];
i+=2;
}else{
key1[n*2]=char2int(key2[i])*0x10+char2int(key2[i+1]);
key1[n*2+1]=char2int(key2[i+2])*0x10+char2int(key2[i+3]);
i+=4;
}
key1[n*2]='\0';
//把字符串转换为数字
for(n=0; n<6; n++)
num1[n]=char2int(key1[n*2])*0x10+char2int(key1[n*2+1]);
//得出XOR结果数
for(n=0; n<6; n++)
for(i=0; i<255; i++)
if((i^str1[n])==num1[n]){
num2[n]=i;
break;
}
//相减 得到新的数
for(n=0, esi=0x80; n<6; n++){
num3[n]=(num2[n]+0xff-esi)%0xff;
esi=num1[n];
}
//反序
for(n=1; n<=6; n++)
num1[n]=num3[6-n];
num1[0]=key[0];
//生成KEY返回
memset(key, 0x00, sizeof(key));
for(n=0; n<7; n++)
sprintf(key, "%s%c", key, num1[n]);
return 0;
}
int main(){
char *str1="IlikeYou";
char *str2="12315160";
char *str3="WoAiZhangLiangYing!";
char *str4="6143614665654c21";
char *str5="334DAABA";
char str6[10];
char key[20];
char name[20];
char result[10];
int ebx;
/*根据注册码第2部分计算出第3部分注册码*/
for(ebx=0; ebx<8; ebx++){
if(ebx!=3&&ebx!=7)
result[ebx]=str1[ebx]+str2[ebx]-0x30;
else
result[ebx]=str1[ebx]+0x30-str2[ebx];
}
result[ebx]='\0';
//计算注册码第5部分后半段
for(ebx=0; ebx<8; ebx++)
str6[ebx]=str5[ebx]+7;
str6[ebx]='\0';
printf("请输入用户名:");
scanf("%s", name);
printf("请输入7位初始化KEY(可以输入woshini):");
scanf("%s", key);
//计算KEY
while(doKey(key)==-1){
printf("输入的初始化KEY不可逆!\n\n请输入7位初始化KEY(可输入woshini):");
scanf("%s", key);
}
//注册码第1部分为aCaFeeL:
//注册码第4部分为用户名变形得出
//注册码第5部分为前半段334DAABA
//注册码第5部分前半段 和 后半段之间的一个字符可以随便填没做验证 这里填的&
printf("注册码:aCaFeeL:|%s|%s|%s|%s&%s\nKEY:%s\n", str2, result, str2str(name, 3), str5, str6, key);
getch();
return 0;
}