论坛风格切换切换到宽版
  • 27281阅读
  • 65回复

用 Inno 制作需要输入注册码(与机器码相关)的安装 [复制链接]

上一主题 下一主题
离线gnatix

发帖
7696
金钱
-8279
威望
-828
只看该作者 40 发表于: 2010-12-04
机器码是 V94-A-2-0Z9-74Q-615-A11
那么注册码应该是 X5B-F20-6E1-72O-553-A8

有了算注册码的代码,难度你还手算吗?那些插入的字母当然也是根据数字的大小而定的,Chr(65+StrToInt(tmp2)*26/999)。
离线libaiping

发帖
169
金钱
810
威望
81
只看该作者 41 发表于: 2010-12-04
我是按照你说的一步一步推算的,哈,确实是手算的,虎兄厉害,这都能让你看出来!

我也是在怀疑这段代码Chr(65+StrToInt(tmp2)*26/999),呵

咦,我推断的数字怎么跟虎兄推断出的不一样呢?
[ 此帖被libaiping在2010-12-04 23:07重新编辑 ]
离线gnatix

发帖
7696
金钱
-8279
威望
-828
只看该作者 42 发表于: 2010-12-05
为什么要手算呢。你把你推算出来的硬盘序号直接放到代码里面,让程序计算出来就可以了嘛。也就是说,在上面的代码主增加两行就够了。

SerialNum := -1629615662;   // 直接把硬盘序号  
if SerialNum > 432109876 then
    SN:= SerialNum-432109876
  else
    SN:= 432109876-SerialNum;
  MID:='';
  tmp1:= IntToStr(SN);
  while length(tmp1)>3 do
    begin
    tmp2:= copy(tmp1,1,3);
    delete(tmp1,1,3);
    MID:= MID+Chr(65+StrToInt(tmp2)*26/999)+tmp2;
    end;
  MID:= MID+Chr(65+StrToInt(tmp1)*26/999)+tmp1;
  tmp1:= MID;
  MID:= '';
  while length(tmp1)>3 do
    begin
    tmp2:= copy(tmp1,1,3);
    delete(tmp1,1,3);
    MID:= MID+tmp2+'-';
    end;
  MID:= MID+tmp1;
  If SerialNum > 432109876 then
    MID:='3P6-'+MID
  else
    MID:='X5B-'+MID;
result:= MID;
MsgBox('注册码是: ' + MID, mbInformation, MB_OK);   // 显示注册码
end;
离线libaiping

发帖
169
金钱
810
威望
81
只看该作者 43 发表于: 2010-12-05
SerialNum := -1629615662; // 直接把硬盘序号
你这个数字怎么推算出来的?

if SerialNum > 567890123 then
SN:= SerialNum-567890123
else
SN:= 567890123-SerialNum;

这句的意思不是说当序列号大于567890123时序列号减567890123,否则就是567890123-序列号吗?
我的机器码是V94-A-2-0Z9-74Q-615-A11
提取出的数字是2097461511,小于567890123,应该是567890123-2097461511=-1529571388


离线gnatix

发帖
7696
金钱
-8279
威望
-828
只看该作者 44 发表于: 2010-12-05
从 V94-A-2-0Z9-74Q-615-A11 提取出来的数字应该是 -2097461511

手算过程是对的,但是你要考虑,代码中用的变量类型是 Long Integer,它所能表达的数字范围只能是 -2147483648 至 2147483647。




离线libaiping

发帖
169
金钱
810
威望
81
只看该作者 45 发表于: 2010-12-05
SerialNum := -1629615662; // 直接把硬盘序号
那你这个数字怎么推算出来的呢?
这里我还是没搞清楚


离线gnatix

发帖
7696
金钱
-8279
威望
-828
只看该作者 46 发表于: 2010-12-06
前面我说了,由于整数变量范围的原因,转换后的结果和你手算是不一样的,因为手算结果会超出变量的范围。
不过因为注册码是代码计算的,所以转换你也可以用同一代码来进行。你把代码做下面的调整就可以得到你所要的结果了。
// 生成注册码
SerialNum := -2097461511;   // 你提取出来的数字
MsgBox('你提取的数字: ' + IntToStr(SerialNum), mbInformation, MB_OK);   // 显示你给的数字
SerialNum := 567890123 - SerialNum;  // 转换为实际的序号
MsgBox('转换后的实际序号: ' + IntToStr(SerialNum), mbInformation, MB_OK);   // 显示实际序号
  
if SerialNum > 432109876 then
    SN:= SerialNum-432109876
  else
    SN:= 432109876-SerialNum;
  MID:='';
  tmp1:= IntToStr(SN);
  while length(tmp1)>3 do
    begin
    tmp2:= copy(tmp1,1,3);
    delete(tmp1,1,3);
    MID:= MID+Chr(65+StrToInt(tmp2)*26/999)+tmp2;
    end;
  MID:= MID+Chr(65+StrToInt(tmp1)*26/999)+tmp1;
  tmp1:= MID;
  MID:= '';
  while length(tmp1)>3 do
    begin
    tmp2:= copy(tmp1,1,3);
    delete(tmp1,1,3);
    MID:= MID+tmp2+'-';
    end;
  MID:= MID+tmp1;
  If SerialNum > 432109876 then
    MID:='3P6-'+MID
  else
    MID:='X5B-'+MID;
MsgBox('注册码是: ' + MID, mbInformation, MB_OK);   // 显示注册码
result:= MID;
end;

离线libaiping

发帖
169
金钱
810
威望
81
只看该作者 47 发表于: 2010-12-06
引用第46楼gnatix于2010-12-06 03:12发表的 : 前面我说了,由于整数变量范围的原因,转换后的结果和你手算是不一样的,因为手算结果会超出变量的范围。 不过因为注册码是代码计算的,所以转换你也可以用同一代码来进行。你把代码做下面的调整就可以得到你所要的结果了。 // 生成注册码 SerialNum := -2097461511;   // 你提取出来的数字 MsgBox('你提取的数字: ' + IntToStr(SerialNum), mbInformation, MB_OK);   // 显示你给的数字 .......

经过几番测试,已经成功用上虎兄的注册方法,感激之情难以言表!

现在还有一个问题:推断出的数字何时为正数,何时为负数还不知道,目前只能进行蒙,呵,正数不行就负数,总有一个是对的……

是不是只要数字前面有“-”就是负数,没有的就是正数?
离线gnatix

发帖
7696
金钱
-8279
威望
-828
只看该作者 48 发表于: 2010-12-06
去掉每隔三个字符出现的减号,再去掉每隔三个字符出现的字母,剩下的就是数字,这个数字有可能是负数。比如:
V94-A-2-0Z9-74Q-615-A11
-A-2-0Z9-74Q-615-A11
A-20Z974Q615A11
-2097461511
离线libaiping

发帖
169
金钱
810
威望
81
只看该作者 49 发表于: 2010-12-06
这个问题终于可以画上一个句号了,严重感谢虎兄,太佩服你的技术了!