蓝天资源网
当前位置:蓝天资源网 / 汇编逆向 / 正文

InstallShield安装包的序列号逆向

作者:忆笙发布时间:2021-10-13 01:09浏览数量:449次评论数量:1次

操作系统: Windows7

InstallShield版本: 6.X

工具: sid,isd,7zip,exeinfo

InstallShield安装包的序列号逆向

InstallShield安装包制作工具一直是各大公司的首选,当然现在也有很多公司使用Inno setup和NSIS,但IS在安装包制作领域的地位我就不说了,一直和微软合作。VS指定制作工具(IS官方提供InstallShield Limited Edition for Visual Studio免费版),网上IS安装包的破解资料比较零散,让很多新手看完后有点不知所云,这其中也包括我。最近研究了下,顺便总结后发出来和大家共同交流,大神就忽视吧,这个教程只是入门级,不足之处敬请指正。

此文通过反编译IS脚本(inx文件),跳过安装过程中要输入的序列号的选项

1、确定安装包为IS制作。

2、找到安装包脚本。

3、反编译脚本,找到关键代码。

4、修改代码并测试。

5、算法分析。

一、查看安装包是什么工具制作,早期的IS安装包都是一个个Disk文件夹。

现在大多是单个文件(*.exe),可以通过右键属性-详细信息查找蛛丝马迹,但个别软件修改比较彻底,看不到安装包信息,就只能用exeinfo工具了(也可用PEID或者DIE),把安装包文件拖到此窗口上即可。

InstallShield安装包的序列号逆向  第1张

二、确定了安装包是IS制作,但整合的单个文件没法反编译,只能拆包了,让单个exe文件变为Disk文件夹的早期状态,IS6.x或者7.x制作的安装包可以直接用压缩软件解压,此处用7zip右键解包成一个文件夹,解压后可以看到文件夹里有个setup.inx的文件(如果看不到inx文件,可能是高版本安装包,换用ISX命令后工具解压)。

InstallShield安装包的序列号逆向  第2张

三、反编译脚本,ISD和SID都可以反编译inx脚本,sid可以反编译也支持修改后重新生成脚本;ISD反编译的脚本注释信息比较全面,生成文本文件更容易查找查看,但不能重新生成脚本。这里用isd,win+r打开运行对话框,在编辑框内输入cmd,回车打开命令行,命令行窗口输入cd C:\isd(切换到isd目录(这里是C:\isd)),再输入isd.exe setup.inx(注意把setup.inx拷贝到isd所在目录),编译后会生成一个setup.txt文档;命令行输入注意:输入最好在英文输入状态,命令和参数间要有一个空格,最好带上文件扩展名。

InstallShield安装包的序列号逆向  第3张

IS生成的安装包,一般是欢迎窗口,协议窗口,用户信息窗口(注册码窗口),我们需要定位到用户信息这里。运行安装包随便输入个序列号,找到关键信息(此处是序列号serial)。一般会有提示信息,如果没有,可以通过先定位协议窗口(一般要加载licence.txt),或者通过查看公司名产品名,比较函数等信息辅助查找关键信息。

InstallShield安装包的序列号逆向  第4张

打开isd反编译脚本生成setup.txt,然后编辑-查找输入serial,我们查到有个函数调用提示序列号错误(ERROR_SERIAL),记录此处地址00005742,打开sid修改此地址的if条件为不等于。

InstallShield安装包的序列号逆向  第5张

四、打开sid,然后菜单栏file-open打开安装包文件夹内的脚本文件(setup.inx),脚本反编译需要时间,等待进度完成后,通过菜单栏goto-code start快速定位到代码段。找到地址00005742对应的代码,把if条件的等于改成不等于。

InstallShield安装包的序列号逆向  第6张

执行菜单栏file-patch changes,保存修改内容,完成脚本重新生成。然后打开安装包文件夹内的setup.exe,测试安装包,如果安装包还要求输入序列号,请继续通过脚本文件分析代码完成修改。

五、算法分析,在我们结果判断的上方不远就是算法的比对过程。

InstallShield安装包的序列号逆向  第7张

label_22:
/* 0000563E: 000B */    n3 = n0 <= 5;                          
/* 0000564D: 0004 */    if(! n3) goto label_28;                          // normal if
/* 00005659: 0006 */    n2 = 0;
/* 00005665: 0006 */    n1 = 0;                                  //内部数组下标n1。
// : Jump Referenced(1):
// :  00005737, 
label_23:
/* 00005673: 000B */    n3 = n1 <= 36;
/* 00005682: 0004 */    if(! n3) goto label_26;                          // normal if
/* 0000568E: 001E */    n3 = s1[n1];                //内部数组的n1位字符给n3
/* 0000569B: 001E */    n4 = s0[n0];                //序列号数组的前6位第n0位字符给n4
/* 000056A8: 000D */    n3 = n3 == n4;                //比较内部字符和序列号字符
/* 000056B5: 0004 */    if(! n3) goto label_25;                          // normal if
/* 000056C1: 0007 */    n3 = n0 + 6;                
/* 000056D0: 001E */    n3 = s0[n3];                //序列号后6位的n0+6字符给n3
/* 000056DD: 001E */    n4 = s2[n1];                //定义字符数组的n1位给n4
/* 000056EA: 000E */    n3 = n3 != n4;                //如果序列号正确,跳转到label_24,给n2赋值1。
/* 000056F7: 0004 */    if(! n3) goto label_24;                          // normal if
/* 00005703: 0006 */    n2 = 0;                        //序列号输入错误会赋值n2为0.
/* 0000570F: 0005 */    goto label_25;
 
// : Jump Referenced(1):
// :  000056F7, 
label_24:
/* 0000571A: 0006 */    n2 = 1;                //如果n2为0则直接弹出序列号错误。
 
// : Jump Referenced(2):
// :  000056B5, 0000570F, 
label_25:
/* 00005728: 0007 */    n1 = n1 + 1;
/* 00005737: 0005 */    goto label_23;
 
// : Jump Referenced(1):
// :  00005682, 
label_26:
/* 00005742: 000D */    n3 = n2 == 0;                //判断序列号内部循环的标志位,为0则弹窗序列号错误
/* 00005751: 0004 */    if(! n3) goto label_27;                          // normal if
/* 0000575D: 0021 */    function_242("ERROR_SERIAL");
/* 00005772: 0006 */    s3 = LAST_RESULT;
/* 0000577C: 0021 */    function_272(s3, -65534);
/* 0000578A: 0027 */    // -- Start Return Code -- //
/* 0000578E: 0023 */    return 0;
 
// : Jump Referenced(1):
// :  00005751, 
label_27:
/* 00005799: 0007 */    n0 = n0 + 1;        //序列号下标外循环一次完成+1.直到比对6此后结束。
/* 000057A8: 0005 */    goto label_22;
 
// : Jump Referenced(1):
// :  0000564D, 
label_28:
/* 000057B3: 0027 */    // -- Start Return Code -- //
/* 000057B7: 0023 */    return 1;
/* 000057C0: 0026 */    // -- Create Local Variables -- //
end;

整个验证过程大致这样,读取序列号前六位和后6位和内部定义两个字符串数组的第一位和比对。

关于IS高版本的大致反编译:

解压失败可以用ISX,有位大神现在还在维护,名字一下子找不到就不写这里了,在github可以下载到最新版。如果还是解压不了,可以在打开安装包时在临时文件夹temp里看看,有惊喜也说不定,哈哈。

反编译脚本失败,IS6.x或IS7.x是不会失败的,失败一定是高于7的版本,例如IS11、IS12或者2010以后的版本等等。可以用isdcc31试下反编译,目前只有这个可以用,其他都失败(包括isd和sid,都是很老的版本,毕竟都是免费提供给大家都,也别太苛求了)。

编译命令供大家参考

isdcc31.exe -u setup.inx ;反编译setup.inx,生成setup.inx.dec

isdcc.exe setup.inx.dec >1.txt ;把dec文件转为1.txt文件。

如何重新生成脚本,因为sid1.0和sid1.2都不支持高版本,只能上16进制编辑器(010或者hex editor),根据汇编指令更改了。

InstallShield安装包的序列号逆向  第8张

忆笙

忆笙 主页 联系他吧

人间山河远阔,只想与你同行。

已有1位网友发表了看法:

  • 访客

    访客  评论于 [2021-10-17 20:15:40]  回复

    转贴请注明出处,这样直接说是原创有点不厚道。。。

欢迎 发表评论: