吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 17392|回复: 16
收起左侧

[原创] [分享]一次InstallShield安装包的破解实践

[复制链接]
longmarchw 发表于 2015-8-29 01:08
本帖最后由 longmarchw 于 2015-9-12 09:30 编辑

严格意义上来说,这不是一次真正的安装包破解,但实际完成的结果,却又恰恰达成了安装包破解的目标。作为一名新手,仅以此文,抛砖引玉。

涉及的附件,参见另一贴:
http://www.52pojie.cn/thread-404847-1-1.html
---------------------------------------------------------------------------------------------------------------------------
数日前,一个朋友让我帮忙看一款商用软件。解决安装时注册码的问题。
1>初次碰面
拿到软件安装包后试着在虚拟机里跑了几个画面,关键画面如下:
     
  • 安装包有三种安装模式,朋友要的是第二种:开发模式。
  • 【图1】

    【图1】
  • 【图1】
  • 继续下一步,画面如下图:
  • 【图2】

    【图2】
  • 【图2】
  • 至此基本上可以看出,这是个一机一码的注册。不出意外,注册码就在软件内部,希望还是很大滴!
2>先用SID看一下
安装包程序从未碰过,尤其我这样的新手。只能百度(“installshield 安装包破解”)!相关文章极少,有兴趣可自行查阅。
推荐:http://blog.csdn.net/jiutao_tang/article/details/7491143 。
但了解到基本知识:





  • installshield 安装包脚本用IKernel.exe引擎解析(事后证明升级为IKernel.dll了),安装脚本旧版本是*.ins,新版本是*.inx。
  • *.inx可以用sid工具反编译!好消息啊!百度找到下载。
  • 运行SID,反编译setup.inx,然后查找“注册码”字样,果然找到了!关键代码如下:
@000085A9        begin
@000085B2:0021      EzDefineDialog("MYdialog", "", "", 13029);
@000085CE:0006      local_number1 = 0;
@000085DA:0021      function_667();
@000085E0:0006      local_string6 = LASTRESULT;
@000085EA:0006   label_85ea:
@000085EC:0001      // switch/while/???
@000085F0:000D      local_number10 = (local_number1 = 0);
@000085FF:0004      if(local_number10) then // ref index: 10
@0000860B:0021         CmdGetHwndDlg/WaitOnDialog("MYdialog");
@0000861C:0006         local_number2 = LASTRESULT;
@00008626:0001         // switch/while/???
@0000862A:000A   label_862a:
@0000862C:000D         local_number10 = (local_number2 = -100);
@0000863B:0004         if(local_number10) then // ref index: 1
@00008647:0021            function_667();
@0000864D:0006            local_string8 = LASTRESULT;
@00008657:0014            local_string3 = (local_string8 ^ "wPCInfoAPI.dll");
@00008672:0021            function_279(local_string3, "isAPI_GetPCID", local_number6, local_string6);
@00008691:0006            local_number7 = LASTRESULT;
@0000869B:002D            NumToStr(local_string7, local_number6);
@000086A5:0021            CtrlSetText("MYdialog", 100, local_string7);
@000086BE:0005            goto label_88b5;
@000086C7:000C         endif;
@000086C7:000C   label_86c7:
@000086C9:000D         local_number10 = (local_number2 = 1);
@000086D8:0004         if(local_number10) then // ref index: 3
@000086E4:0021            CtrlSetText/CtrlGetText("MYdialog", 110, local_string5);
@000086FD:002C            StrToNum(local_number9, local_string5);
@00008707:0021            function_279(local_string3, "isAPI_CheckCode", local_number9, local_string6);
@00008728:0006            local_number8 = LASTRESULT;
@00008732:000D            local_number10 = (local_number8 = 1);
@00008741:0004            if(local_number10) then // ref index: 1
@0000874D:0021               function_279(local_string3, "isAPI_RegistryCode", local_number9, local_string6);
@00008771:0006               local_number7 = LASTRESULT;
@0000877B:0006               local_number1 = 1;
@00008787:0005               goto label_87b8;
@00008790:0002            endif;
@00008790:0002   label_8790:
@00008792:0021            function_457("无效的注册码", -65533);
@000087AC:0006            local_number1 = 0;
@000087B8:0001   label_87b8:
@000087BA:0005            goto label_88b5;
@000087C3:0005         endif;
@000087C3:0005   label_87c3:
@000087C5:000D         local_number10 = (local_number2 = -200);
@000087D4:0004         if(local_number10) then // ref index: 1
@000087E0:0006            local_number1 = 1;
@000087EC:0002            abort;
@000087F0:0005            goto label_88b5;
@000087F9:0004         endif;
@000087F9:0004   label_87f9:
@000087FB:000D         local_number10 = (local_number2 = 9);
@0000880A:0004         if(local_number10) then // ref index: 1
@00008816:0002            abort;
@0000881A:0005            goto label_88b5;
@00008823:0005         endif;
@00008823:0005   label_8823:
@00008825:000D         local_number10 = (local_number2 = -1);
@00008834:0004         if(local_number10) then // ref index: 1
@00008840:0021            function_457("内部对话框错误", -65533);
@0000885C:0002            abort;
@00008860:0005            goto label_88b5;
@00008869:0006         endif;
@00008869:0006   label_8869:
@0000886B:000D         local_number10 = (local_number2 = 12);
@0000887A:0004         if(local_number10) then // ref index: 1
@00008886:0021            ReleaseDialog/EndDialog("MYdialog");
@00008897:0021            WaitOnDialog/ReleaseDialog("MYdialog");
@000088A8:0027            // return coming
@000088AC:0023            return 12;
@000088B5:0001         endif;
@000088B5:0001   label_88b5:
@000088B7:0005         goto label_85ea;
@000088C0:0004      endif;
@000088C0:0004   label_88c0:
@000088C2:0021      ReleaseDialog/EndDialog("MYdialog");
@000088D3:0021      WaitOnDialog/ReleaseDialog("MYdialog");
@000088E4:0024      return;
@000088E8:0026   end; // checksum: cb46ed19
伪代码基本上还是可以看懂的。这里我们看到了关键信息,红色字体。安装包注册功能是调用了外部wPCInfoAPI.dll,用到了isAPI_CheckCode接口,完成注册后,估计用isAPI_RegistryCode实现注册码的保存。此外获取isAPI_GetPCID接口应该是获取机器码的。

看到这里,是不是很激动?!似乎发现了目标,可接下来我蹉跎了一整天!

3>再用OD看一下
祭出强大的OD,挂了下,想看看上面分析的接口在不在……可是installshield 安装包跟了进去看了很久都没找到我要找的东西(也许是水平太次吧)。




  • 只知道这个用的是什么版本做的包,然并卵。
  • 【图3】

    【图3】
  • 【图3】




  • setup.exe的模块里根本没有我要的wPCInfoAPI.dll,也没有传说的IKernel.exe!
  • 【图4】

    【图4】
  • 【图4】




  • 单独运行setup.exe,用Procexp工具看一下,原来IKernel.exe变成了IKernel.dll,看来IS防忽悠能力提升了……。一想到要跟进dll,再去分析作为脚本解析引擎的它,立马觉得:书到用时方恨少,不会搞了。以下好几个小时,纠结郁闷彷徨失落中~~~
  • 【图5】

    【图5】
  • 【图5】

4>峰会路转时,冷静~
很多人说破解遇到障碍时,不放休息下,让头脑冷静下来,也许就有新的灵感。实时的确如此,呵呵。




  • 过了一晚,次日早上,突然想到wPCInfoAPI.dll会不会安装后才有,不妨安装一次试试。用第一种模式安装。然后在安装目录下,果然发现它!心情立刻激动!
  • 【图6】

    【图6】
  • 【图6】




  • 继续淘金,竟然让我找到了可独立注册的exe!哈哈!这下拨云见日~~!
  • 【图7】

    【图7】
  • 【图7】


发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| longmarchw 发表于 2015-8-29 01:25
本帖最后由 longmarchw 于 2015-9-12 09:29 编辑

是不是很眼熟?到此,破解的目标就定位在这个exe上了。剩下的事情交给OD吧!

4>OD再次上场,火力全开




  • 加载exe,查看加载的模块信息,要找的那个dll妥妥的在呢。
  • 8

    8
  • 【图8】




  • 进入dll领空,查找模块信息。
  • 9

    9
  • 【图9】

下断点!反复调试~……………………………………………………………………最终找到了我要找的东西。

10

10

【图10】









说明下:



  • call 100022E0,这一句是调用dll内部GetPCID接口,获取机器码
  • call 10002420,这一句是调用dll内部CheckCode接口,获取注册码
  • cmp dword ptr ss:[ebp+0xC],eax,就是比较你输入的序列号和程序内部的序列号是否一致的判断,你要找的序列号就在eax里躺着呢~~~
  • 这个序列号,在提示注册成功后程序生成了一个文本文件,明文记录着序列号。。。为程序作者汗一把!

好!!至此为止,破解完成!!运气果然还是不错的。

至于如何在计算其他计算机上的序列号,我就不解释了,留给大家思考吧,其实答案就在上面这张图里。


感谢Hmily 的 指点,重新编辑了。觉得不错的请支持下吧~




Hmily 发表于 2015-9-2 12:12
我醉了,你传完的图,在正文中点击一下上传好的图片就插入了啊,@qwe2913207  老师来做个教程吧!


图片上传贴图教程:
http://ww4.sinaimg.cn/large/6a1ff2e7jw1evo1rywnlfg21hb0stqvg.gif

soulovess 发表于 2015-8-29 06:55
segasonyn64 发表于 2015-8-29 23:55
终于看明白了,感谢分享经验。。。
ghostfish 发表于 2015-8-30 09:53 来自手机
草,最近你进步神速,你师虎知道你这么牛b吗?

点评

鱼叔,我在这  发表于 2015-8-30 16:11
 楼主| longmarchw 发表于 2015-8-31 14:47
soulovess 发表于 2015-8-29 06:55
【图10】在哪??

在呀,请仔细看
qinjun5230 发表于 2015-9-7 08:39
支持作者,不过这个图真是杀死强迫症患者
 楼主| longmarchw 发表于 2015-9-12 09:30
谢谢Hmily的指点,已重新编辑了图片,嘿嘿
kjq999 发表于 2017-8-17 21:01
我现在也有个InstallShield破解,已经提取setup.inx的代码,但是还是搞不定...
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-17 04:42

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表