PowerDirector 1.00.06.9 破解
『GUEOR(S.M)破解』
欢迎访问我的网页:sm.longcity.net
qq:5537188
看了高人Passion的一些文章后,才对破解Install sheild 产生了兴趣.谢谢Passion的破文,愿Passion能多写好的破文.
用isd将setup.inx反编译.如下:
拖动滚动条时发现"INVALIDCDKEY"字样,看来这就是弹出错误的对话的函数了.根据破解的一般手法,判断前的函数应是比较注册码了.运气好!
/* 00006383: 0021 */ function_4(g_str28);
/* 0000638C: 0006 */ g_number44 = LAST_RESULT;
/* 00006396: 000D */ g_number56 = g_number44 == 0;
/* 000063A5: 0004 */ if(! g_number56) goto label_16;->不等于0跳
/* 000063B1: 0021 */ function_343("INVALIDCDKEY");
return的值不能为0,进入function_4.可喜的是比较在脚本中进行,减小了难度,也不用跟踪了.^_^
function NUMBER function_4(s0)
STRING s1;
STRING s2;
STRING s3;
STRING s4;
STRING s5;
STRING s7;
STRING s8;
NUMBER n1;
NUMBER n2;
NUMBER n6;
begin
/* 0000ABC5: 0022 */ // -- Start Function Code -- //
/* 0000ABCE: 0021 */ function_537(s0); ->求注册码长度
/* 0000ABD7: 0006 */ n6 = LAST_RESULT;
/* 0000ABE1: 000E */ n6 = n6 != 16;
->n6=16(要16位)
/* 0000ABF0: 0004 */ if(! n6) goto label_146; ->相等就跳
/* 0000ABFC: 0027 */ // -- Start Return Code -- //
/* 0000AC00: 0023 */ return 0;
label_146:
/* 0000AC0B: 0029 */ StrSub(s1, s0, 0, 2); ->s1为注册码前2位.
/* 0000AC1F: 0014 */ s8 = g_str25 ^ "CUSTOM.INI";
/* 0000AC36: 0021 */ function_384(s8, "PowerDirector", "KEY", g_str28);
/* 0000AC58: 0006 */ n6 = LAST_RESULT;
/* 0000AC62: 000D */ n6 = n6 == 0;
/* 0000AC71: 0004 */ if(! n6) goto label_147;
/* 0000AC7D: 0006 */ s5 = g_str28;
/* 0000AC87: 002B */ StrCompare(s1, s5);
/* 0000AC91: 0006 */ n6 = LAST_RESULT;
/* 0000AC9B: 000E */ n6 = n6 != 0;
/* 0000ACAA: 0004 */ if(! n6) goto label_147;
/* 0000ACB6: 0027 */ // -- Start Return Code -- //
/* 0000ACBA: 0023 */ return 0;
label_147:
/* 0000ACC5: 002B */ StrCompare(s1, "PR");
->s1="PR",即注册码前2位为 PR
/* 0000ACD1: 0006 */ n6 = LAST_RESULT;
/* 0000ACDB: 000E */ n6 = n6 != 0;
/* 0000ACEA: 0004 */ if(! n6) goto label_148; ->相等就跳
/* 0000ACF6: 0027 */ // -- Start Return Code -- //
/* 0000ACFA: 0023 */ return 0;
label_148:
/* 0000AD05: 0029 */ StrSub(s3, s0, 2, 1);
->s3为注册码第3位
/* 0000AD19: 0029 */ StrSub(s4, s0, 13, 3);
->s4为注册码第14,15,16位
/* 0000AD2D: 0007 */ s7 = s3 + s4;
->s7为"(3+14+15+16)"
/* 0000AD3A: 002C */ StrToNum(n1, s7);
->字符串转换成数字n1
/* 0000AD44: 0006 */ n6 = LAST_RESULT;
/* 0000AD4E: 0009 */ n6 = n6 < 0;
/* 0000AD5D: 0004 */ if(! n6) goto label_149;
/* 0000AD69: 0027 */ // -- Start Return Code -- //
/* 0000AD6D: 0023 */ return 0;
label_149:
/* 0000AD78: 0029 */ StrSub(s2, s0, 3, 10);
-> s2为注册码第4位~第13位(10个)
/* 0000AD8C: 002B */ StrCompare(s1, "PR");
/* 0000AD98: 0006 */ n6 = LAST_RESULT;
/* 0000ADA2: 000D */ n6 = n6 == 0;
/* 0000ADB1: 0004 */ if(! n6) goto label_150;
/* 0000ADBD: 0021 */ function_5(s2, 32);
/* 0000ADCB: 0006 */ n2 = LAST_RESULT;
label_150:
/* 0000ADD7: 000E */ n6 = n2 != n1;
->n1即(3+14+15+16)
/* 0000ADE4: 0004 */ if(! n6) goto label_151;
/* 0000ADF0: 0027 */ // -- Start Return Code -- //
/* 0000ADF4: 0023 */ return 0;
进入function_5:
〖function NUMBER function_5(s0, n0)
--形参 s0=s2 n0=32
STRING s1;
STRING s2;
STRING s3;
NUMBER n1;
NUMBER n2;
NUMBER n3;
NUMBER n4;
NUMBER n5;
NUMBER n6;
NUMBER n7;
begin
/* 0000AE1A: 0022 */ // -- Start Function Code -- //
/* 0000AE23: 0006 */ n5 = 1;
/* 0000AE2F: 0021 */ function_6(s0, s1); =>进入function_6(
)
/* 0000AE3B: 0006 */ n6 = LAST_RESULT; -->return n6=1
s1="00000000000"
/* 0000AE45: 000D */ n7 = n6 == 0;
/* 0000AE54: 0004 */ if(! n7) goto label_153; jump
/* 0000AE60: 0027 */ // -- Start Return Code -- //
/* 0000AE64: 0023 */ return n5;
( n5=1) 错!
进入function_6( ):
【function NUMBER function_6(s0, s1) ->s0=s2
NUMBER n0;
NUMBER n1;
NUMBER n2;
NUMBER n3;
NUMBER n4;
begin
/* 0000B003: 0022 */ // -- Start Function Code -- //
/* 0000B00C: 0021 */ function_537(s0);
-->求s0的长度
/* 0000B015: 0006 */ n1 = LAST_RESULT;
-->n1=10
/* 0000B01F: 0009 */ n2 = n1 < 0;
/* 0000B02E: 0004 */ if(! n2) goto label_160;
/* 0000B03A: 0027 */ // -- Start Return Code -- //
/* 0000B03E: 0023 */ return 0;
label_160:
/* 0000B049: 0006 */ n0 = 0;
/* 0000B055: 000F */ n2 = n1 - 1;
-->n2=9
label_161:
/* 0000B066: 000B */ n3 = n0 <= n2;
-->循环10次
/* 0000B073: 0004 */ if(! n3) goto label_164;
/* 0000B07F: 001E */ n3 = s0[n0]; \
/* 0000B08C: 0009 */ n3 = n3 < 48; |
/* 0000B09B: 001E */ n4 = s0[n0]; |
->判断10个字符在0~9之间
/* 0000B0A8: 000A */ n4 = n4 > 57; /
/* 0000B0B7: 0018 */ n3 = n3 || n4;
/* 0000B0C4: 0004 */ if(! n3) goto label_162; ->成立其一就不跳,不跳回比较简单.
s1会为"00000000000",后面转化为数字
成为0.那么填字母即可.
/* 0000B0D0: 001D */ s1[n0] = 48; s1=0
->s1="00000000000"
/* 0000B0DF: 0005 */ goto label_163;
label_162:
/* 0000B0EA: 001E */ n3 = s0[n0];
->填数字的运算.
/* 0000B0F7: 001D */ s1[n0] = n3;
label_163:
/* 0000B106: 0007 */ n0 = n0 + 1; ->n0++
/* 0000B115: 0005 */ goto label_161;
label_164:
/* 0000B120: 0027 */ // -- Start Return Code -- //
/* 0000B124: 0023 */ return 1;
/* 0000B12D: 0026 */ // -- Create Local Variables -- //
end; 】
return 全局变量s1="00000000000".
label_153:
/* 0000AE6D: 0006 */ n1 = 1;
label_154:
/* 0000AE7B: 000B */ n7 = n1 <= 2;
/* 0000AE8A: 0004 */ if(! n7) goto label_156;
/* 0000AE96: 0021 */ function_7(s1, s2, s3);
=>进入function_7( )
/* 0000AEA5: 0006 */ n6 = LAST_RESULT; =>return s2="000000"
s3="000000"
/* 0000AEAF: 000D */ n7 = n6 == 0;
/* 0000AEBE: 0004 */ if(! n7) goto label_155;
/* 0000AECA: 0027 */ // -- Start Return Code -- //
/* 0000AECE: 0023 */ return 0;
=>进入function_7( )
【function NUMBER function_7(s0, s1, s2) --形参 s0="000000000"
NUMBER n0;
NUMBER n1;
NUMBER n2;
NUMBER n3;
NUMBER n4;
begin
/* 0000B13B: 0022 */ // -- Start Function Code -- //
/* 0000B144: 0021 */ function_537(s0);
->求s0的长度
/* 0000B14D: 0006 */ n2 = LAST_RESULT;
--n2=10
/* 0000B157: 0009 */ n3 = n2 < 0;
/* 0000B166: 0004 */ if(! n3) goto label_166;
/* 0000B172: 0027 */ // -- Start Return Code -- //
/* 0000B176: 0023 */ return 0;
label_166:
/* 0000B181: 0006 */ n1 = 0;
/* 0000B18D: 0006 */ n0 = 0;
/* 0000B199: 0011 */ n3 = n2 / 2;
/* 0000B1A8: 000F */ n3 = n3 - 1;
->n3=4
label_167:
/* 0000B1B9: 000B */ n4 = n0 <= n3; -> 循环5次
/* 0000B1C6: 0004 */ if(! n4) goto label_168;
/* 0000B1D2: 001E */ n4 = s0[n1];
\
/* 0000B1DF: 001D */ s1[n0] = n4;
|s1="00000"
/* 0000B1EC: 0007 */ n1 = n1 + 1;
| ->s1,s2分别赋值
/* 0000B1FB: 001E */ n4 = s0[n1];
|
/* 0000B208: 001D */ s2[n0] = n4; /
s2="00000"
/* 0000B215: 0007 */ n1 = n1 + 1;
/* 0000B224: 0007 */ n0 = n0 + 1;
/* 0000B233: 0005 */ goto label_167;
label_168:
/* 0000B23E: 0027 */ // -- Start Return Code -- //
/* 0000B242: 0023 */ return 1;
/* 0000B24B: 0026 */ // -- Create Local Variables -- //
end;】
return s2="000000" s3="000000"
label_155:
/* 0000AED9: 0007 */ s1 = s2 + s3;
-> s1="000000000000"
/* 0000AEE6: 0007 */ n1 = n1 + 1;
-> n1=2
/* 0000AEF5: 0005 */ goto label_154;
label_156:
/* 0000AF00: 002C */ StrToNum(n2, s2);
->n2=0
/* 0000AF0A: 0006 */ n7 = LAST_RESULT;
/* 0000AF14: 0009 */ n7 = n7 < 0;
/* 0000AF23: 0004 */ if(! n7) goto label_157;
/* 0000AF2F: 0027 */ // -- Start Return Code -- //
/* 0000AF33: 0023 */ return n5; n5=1
label_157:
/* 0000AF3C: 002C */ StrToNum(n3, s3); -> n3=0
/* 0000AF46: 0006 */ n7 = LAST_RESULT;
/* 0000AF50: 0009 */ n7 = n7 < 0;
/* 0000AF5F: 0004 */ if(! n7) goto label_158;
/* 0000AF6B: 0027 */ // -- Start Return Code -- //
/* 0000AF6F: 0023 */ return n5; n5=1
label_158:
/* 0000AF78: 0008 */ n2 = n2 % 1000; ->n2=0
|
/* 0000AF87: 0008 */ n3 = n3 % 10000; ->n3=0
|简单吧!
/* 0000AF96: 0007 */ n4 = n0 + 924;
->n4=956
/* 0000AFA5: 0007 */ n2 = n2 + n4;
->n2=956
/* 0000AFB2: 0007 */ n3 = n3 + n4;
->n3=956
/* 0000AFBF: 0010 */ n5 = n2 * n3;
->n5=913936
/* 0000AFCC: 0008 */ n5 = n5 % 9999; ->n5=4027
/* 0000AFDB: 0007 */ n5 = n5 + 1;
->n5=4028
/* 0000AFEA: 0027 */ // -- Start Return Code -- //
/* 0000AFEE: 0023 */ return n5;
/* 0000AFF5: 0026 */ // -- Create Local Variables -- //
end;〗
label_151:
/* 0000ADFF: 0027 */ // -- Start Return Code -- //
/* 0000AE03: 0023 */ return 1;
/* 0000AE0C: 0026 */ // -- Create Local Variables -- //
end;
根据0000B066: 000B的循环,注册码第4位~第13位可填除数字外的任意字符.
即serial number:PR4XXXXXXXXXX028
不过只能运行在1024 * 768下,靠.只有卸了.
有空别忘了访问我的网页.呵呵呵呵呵呵呵呵....
- 标 题:PowerDirector 1.00.06.9 破解. 恭喜小球! (9千字)
- 作 者:S.M
- 时 间:2002-2-3 22:34:26
- 链 接:http://bbs.pediy.com