dbgcode 发表于 2021-10-12 15:34

InstallShield安装包的序列号逆向

本帖最后由 dbgcode 于 2021-10-13 11:17 编辑

操作系统:                   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),把安装包文件拖到此窗口上即可。


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


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


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


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


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


执行菜单栏file-patch changes,保存修改内容,完成脚本重新生成。然后打开安装包文件夹内的setup.exe,测试安装包,如果安装包还要求输入序列号,请继续通过脚本文件分析代码完成修改。
五、算法分析,在我们结果判断的上方不远就是算法的比对过程。

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位字符给n3
/* 0000569B: 001E */    n4 = s0;                //序列号数组的前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;                //序列号后6位的n0+6字符给n3
/* 000056DD: 001E */    n4 = s2;                //定义字符数组的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),根据汇编指令更改了。





为了方便大家就提供下附件,资源来源于网络,一切所有权归原作者和后续的修改者,与本人无关,如要侵权论坛可自行删除。
本实例有sid一个软件就够,其他都是自己的习惯性操作,大家可以自选。
sxy installshield 6/7 script decompiler

isd命令工具,用于查看反编译脚本

dbgcode 发表于 2021-10-31 20:37

ULis 发表于 2021-10-31 17:59
学习了,还想请教下楼主如果对于那种单exe且不能解压的该怎么办呀,这个exe自行解压出来的临时文件夹名字是 ...

关于解压
帖子最后给出了不能解压的解决办法,实在解压不了,那我也帮不了你,你只能自己研究了。
一个思路,供你参考。
在软件打开中,把临时文件拷贝出来,一般可以使用,感觉帖子好就加个热心值。

dbgcode 发表于 2021-10-13 11:26

skip2 发表于 2021-10-13 10:01
教程中所用到的isd、sid等程序,最好能附上链接或者上传上来
楼主建议的很好,是我考虑不全,工具网上找确实麻烦,isd和sid反编译脚本工具已经上传。

Hmily 发表于 2021-10-12 15:53

你的申请帖还没有报道。

dbgcode 发表于 2021-10-12 16:02

Hmily 发表于 2021-10-12 15:53
你的申请帖还没有报道。

登录帐号我昨天已经回复了,提示要审核。要如何回复?退出登录后回复,回复时不能点回复直接评论?

老万 发表于 2021-10-12 16:48

谢谢楼主分享,学习了

freezer 发表于 2021-10-12 17:45

感谢分享。学习

lovehfs 发表于 2021-10-12 17:54

学习一下压缩包的内部机理

yyjpcx 发表于 2021-10-12 18:36

没有发成品是否可以发下程序名呢?

pizazzboy 发表于 2021-10-12 18:53

很精彩的帖子,谢谢分享。

lyliucn 发表于 2021-10-12 20:29

学习了。

chishingchan 发表于 2021-10-12 23:11

软件名称被马赛克!想找个软件试练也难啊!
页: [1] 2 3
查看完整版本: InstallShield安装包的序列号逆向