【软件名称】:***手册电子版
【注册方式】:InstallShield安装时注册
【破文作者】:firefly
【破解工具】:InstallShield Decompiler
【破解说明】:初学cracking,想找点软柿子捏!在看雪看到InstallShield Decompiler,
刚好手头上有个***手册电子版用的InstallShield脚本判断的注册码!
就拿来试试.失敬之处请各位大虾见谅!
【破解过程】:
运行安装程序,随便输入注册码,安装程序提示" 序列号不正确,请确认!"
用isd反编译setup.inx,在反编译生成的文件中查找" 序列号不正确,请确认!"
在以下函数中出现,由于反编译生成的文件比较烦琐,只列出注册码比较函数
================================================================
function NUMBER function_3() //注册码比较函数!
STRING s0;
STRING s1;
STRING s2;
STRING s3;
STRING s7;
STRING s8;
STRING s9;
STRING s10;
STRING s12;
STRING s16;
NUMBER n0;
NUMBER n3;
NUMBER n4;
NUMBER n5;
NUMBER n6;
NUMBER n7;
NUMBER n8;
NUMBER n11;
NUMBER n12;
NUMBER n13;
NUMBER n14;
NUMBER n15;
NUMBER n16;
NUMBER n17;
NUMBER n18;
NUMBER n19;
NUMBER n20;
NUMBER n21;
begin
/* 00005F4B: 0022 */ // -- Start Function Code -- //
/* 00005F54: 0006 */ s16 = g_str17; //注册码(以g开头的为全局变量)
/* 00005F5E: 0021 */ function_304(0); //生成列表(调用ListCreate)
/* 00005F69: 0006 */ n11 = LAST_RESULT;
/* 00005F73: 0021 */ function_418(s16); //获取注册码长度
/* 00005F7C: 0006 */ n20 = LAST_RESULT;
/* 00005F86: 000D */ n20 = n20 == 23; //注册码长度必须为23位
/* 00005F95: 0004 */ if(! n20) goto label_42; // normal if
/* 00005FA1: 0021 */ function_417(n11, s16, "-"); //将注册码以"-"分割放到n11中??
/* 00005FB1: 0006 */ n3 = LAST_RESULT; //生成的列表的数目?
/* 00005FBB: 000D */ n20 = n3 == 0;
/* 00005FCA: 0004 */ if(! n20) goto label_28; // normal if
/* 00005FD6: 0021 */ function_313(n11, s0); //注册码第一部分赋值给s0
/* 00005FE2: 0006 */ n4 = LAST_RESULT;
/* 00005FEC: 0021 */ function_315(n11, s1); //注册码第一部分赋值给s1
/* 00005FF8: 0006 */ n4 = LAST_RESULT;
/* 00006002: 0021 */ function_315(n11, s2); //注册码第一部分赋值给s2
/* 0000600E: 0006 */ n4 = LAST_RESULT;
/* 00006018: 0021 */ function_315(n11, s3); //注册码第一部分赋值给s3
/* 00006024: 0006 */ n4 = LAST_RESULT;
// : Jump Referenced(1):
// : 00005FCA,
label_28:
/* 00006030: 0006 */ n0 = 0;
// : Jump Referenced(1):
// : 000060F0,
label_29: //计算第一部分注册码
/* 0000603E: 000B */ n20 = n0 <= 4;
/* 0000604D: 0004 */ if(! n20) goto label_31;
/* 00006059: 001E */ n20 = s0[n0];
/* 00006066: 000A */ n20 = n20 > 48; //此处判断s0[n0]是不是数字
/* 00006075: 001E */ n21 = s0[n0];
/* 00006082: 000B */ n21 = n21 <= 57;
/* 00006091: 0019 */ n20 = n20 && n21;
/* 0000609E: 0004 */ if(! n20) goto label_30;
/* 000060AA: 001E */ n5 = s0[n0];
/* 000060B7: 0021 */ function_425(s7, "%c", n5);
/* 000060C8: 002C */ StrToNum(n12, s7); //将字符形式的数字转化成数字
/* 000060D2: 0007 */ n16 = n16 + n12; //注册码中的数字累加
// : Jump Referenced(1):
// : 0000609E,
label_30:
/* 000060E1: 0007 */ n0 = n0 + 1;
/* 000060F0: 0005 */ goto label_29;
// : Jump Referenced(1):
// : 0000604D,
label_31:
/* 000060FB: 002C */ StrToNum(n12, s12);
/* 00006105: 0006 */ n0 = 0;
// : Jump Referenced(1):
// : 000061C5,
label_32: //过程同label_29,比较第二部分的注册码
/* 00006113: 000B */ n20 = n0 <= 4;
/* 00006122: 0004 */ if(! n20) goto label_34;
/* 0000612E: 001E */ n20 = s1[n0];
/* 0000613B: 000A */ n20 = n20 > 48;
/* 0000614A: 001E */ n21 = s1[n0];
/* 00006157: 000B */ n21 = n21 <= 57;
/* 00006166: 0019 */ n20 = n20 && n21;
/* 00006173: 0004 */ if(! n20) goto label_33;
/* 0000617F: 001E */ n6 = s1[n0];
/* 0000618C: 0021 */ function_425(s8, "%c", n6);
/* 0000619D: 002C */ StrToNum(n13, s8);
/* 000061A7: 0007 */ n17 = n17 + n13;
// : Jump Referenced(1):
// : 00006173,
label_33:
/* 000061B6: 0007 */ n0 = n0 + 1;
/* 000061C5: 0005 */ goto label_32;
// : Jump Referenced(1):
// : 00006122,
label_34:
/* 000061D0: 0006 */ n0 = 0;
// : Jump Referenced(1):
// : 00006290,
label_35: //过程同label_29,比较第三部分的注册码
/* 000061DE: 000B */ n20 = n0 <= 4;
/* 000061ED: 0004 */ if(! n20) goto label_37;
/* 000061F9: 001E */ n20 = s2[n0];
/* 00006206: 000A */ n20 = n20 > 48;
/* 00006215: 001E */ n21 = s2[n0];
/* 00006222: 000B */ n21 = n21 <= 57;
/* 00006231: 0019 */ n20 = n20 && n21;
/* 0000623E: 0004 */ if(! n20) goto label_36;
/* 0000624A: 001E */ n7 = s2[n0];
/* 00006257: 0021 */ function_425(s9, "%c", n7);
/* 00006268: 002C */ StrToNum(n14, s9);
/* 00006272: 0007 */ n18 = n18 + n14;
// : Jump Referenced(1):
// : 0000623E,
label_36:
/* 00006281: 0007 */ n0 = n0 + 1;
/* 00006290: 0005 */ goto label_35;
// : Jump Referenced(1):
// : 000061ED,
label_37:
/* 0000629B: 0006 */ n0 = 0;
// : Jump Referenced(1):
// : 0000635B,
label_38: //过程同label_29,比较第四部分的注册码
/* 000062A9: 000B */ n20 = n0 <= 4;
/* 000062B8: 0004 */ if(! n20) goto label_40;
/* 000062C4: 001E */ n20 = s3[n0];
/* 000062D1: 000A */ n20 = n20 > 48;
/* 000062E0: 001E */ n21 = s3[n0];
/* 000062ED: 000B */ n21 = n21 <= 57;
/* 000062FC: 0019 */ n20 = n20 && n21;
/* 00006309: 0004 */ if(! n20) goto label_39;
/* 00006315: 001E */ n8 = s3[n0];
/* 00006322: 0021 */ function_425(s10, "%c", n8);
/* 00006333: 002C */ StrToNum(n15, s10);
/* 0000633D: 0007 */ n19 = n19 + n15;
// : Jump Referenced(1):
// : 00006309,
label_39:
/* 0000634C: 0007 */ n0 = n0 + 1;
/* 0000635B: 0005 */ goto label_38;
// : Jump Referenced(1):
// : 000062B8,
label_40:
/* 00006366: 0011 */ n20 = n16 / 10;
/* 00006375: 0010 */ n20 = n20 * 10;
/* 00006384: 000F */ n20 = n16 - n20; //获得第一部分注册码中数字之和的个位数
/* 00006391: 000E */ n20 = n20 != 1; //将其与1比较
/* 000063A0: 0011 */ n21 = n17 / 10;
/* 000063AF: 0010 */ n21 = n21 * 10;
/* 000063BE: 000F */ n21 = n17 - n21; //获得第二部分注册码中数字之和的个位数
/* 000063CB: 000E */ n21 = n21 != 9; //将其与9比较
/* 000063DA: 0018 */ n20 = n20 || n21;
/* 000063E7: 0011 */ n21 = n18 / 10;
/* 000063F6: 0010 */ n21 = n21 * 10;
/* 00006405: 000F */ n21 = n18 - n21; //获得第三部分注册码中数字之和的个位数
/* 00006412: 000E */ n21 = n21 != 3; //将其与3比较
/* 00006421: 0018 */ n20 = n20 || n21;
/* 0000642E: 0011 */ n21 = n19 / 10;
/* 0000643D: 0010 */ n21 = n21 * 10;
/* 0000644C: 000F */ n21 = n19 - n21; //获得第四部分注册码中数字之和的个位数
/* 00006459: 000E */ n21 = n21 != 2; //将其与2比较
/* 00006468: 0018 */ n20 = n20 || n21;
/* 00006475: 0004 */ if(! n20) goto label_41;
/* 00006481: 0006 */ g_number22 = 0;
// : Jump Referenced(1):
// : 00006475,
label_41:
/* 0000648F: 0005 */ goto label_43;
// : Jump Referenced(1):
// : 00005F95,
label_42:
/* 0000649A: 0021 */ function_268("序列号不正确,请确认!", -65535);
/* 000064BE: 0006 */ g_number22 = 0;
// : Jump Referenced(1):
// : 0000648F,
label_43:
/* 000064CC: 0024 */ return;
/* 000064D0: 0026 */ // -- Create Local Variables -- //
end;
===========================================
分析function NUMBER function_3()可知:
注册码长度必须是23位,其中含有3个"-"将注册码分成四部分,形式如下:
38SDE-982DE-3DSDD-TSDF2
其中,
第一部分中的数字之和的个位数应该是1
第二部分中的数字之和的个位数应该是9
第三部分中的数字之和的个位数应该是3
第四部分中的数字之和的个位数应该是2
这样的注册算法应该不需要写注册机 :P
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课