好友
阅读权限10
听众
最后登录1970-1-1
|
本帖最后由 longmarchw 于 2015-9-12 09:30 编辑
严格意义上来说,这不是一次真正的安装包破解,但实际完成的结果,却又恰恰达成了安装包破解的目标。作为一名新手,仅以此文,抛砖引玉。
涉及的附件,参见另一贴:
http://www.52pojie.cn/thread-404847-1-1.html
---------------------------------------------------------------------------------------------------------------------------
数日前,一个朋友让我帮忙看一款商用软件。解决安装时注册码的问题。
1>初次碰面
拿到软件安装包后试着在虚拟机里跑了几个画面,关键画面如下:
- 安装包有三种安装模式,朋友要的是第二种:开发模式。
-
【图1】
- 【图1】
- 继续下一步,画面如下图:
-
【图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】
- setup.exe的模块里根本没有我要的wPCInfoAPI.dll,也没有传说的IKernel.exe!
-
【图4】
- 【图4】
- 单独运行setup.exe,用Procexp工具看一下,原来IKernel.exe变成了IKernel.dll,看来IS防忽悠能力提升了……。一想到要跟进dll,再去分析作为脚本解析引擎的它,立马觉得:书到用时方恨少,不会搞了。以下好几个小时,纠结郁闷彷徨失落中~~~
-
【图5】
- 【图5】
4>峰会路转时,冷静~
很多人说破解遇到障碍时,不放休息下,让头脑冷静下来,也许就有新的灵感。实时的确如此,呵呵。
- 过了一晚,次日早上,突然想到wPCInfoAPI.dll会不会安装后才有,不妨安装一次试试。用第一种模式安装。然后在安装目录下,果然发现它!心情立刻激动!
-
【图6】
- 【图6】
- 继续淘金,竟然让我找到了可独立注册的exe!哈哈!这下拨云见日~~!
-
【图7】
- 【图7】
|
|
发帖前要善用【论坛搜索】功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。 |
|
|
|
|