【软件名称】:***手册电子版 
【注册方式】: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