待破解软件:天喜转盘抽奖软件(一年版)
使用工具:Exeinfo PE(查壳)、GrayWolf(反编译)、IDA(解码HEX)、UltraEdit(修改EXE文件)
=====================华丽的分割线========================
刚注册吾爱破解,跟着大家学习一下破解。原来一直玩的是DOS下的破解,对于Windows的程序,只对原来的Delphi、C++等程序熟悉一些,对于现在的.NET以及JAVA程序的结构就不甚了解了。
昨天晚上闲来无事,想鼓捣一下破解,于是就去共享软件注册中心找个软件练练手。找到了这个,天喜抽奖程序。http://www.sharebank.com.cn/soft/SoftView_51272.htm。
下载安装发现需要.net framework 4.0,说明这是一个.net的程序。
安装运行的界面如下,未注册版本可以抽奖五次。(左上角显示最近五次抽奖结果)
如果再点击开始按钮,程序就会提示
正好就用这个程序练手吧,先查一下有没有壳:
提示这个程序是C#.NET或者VB.NET的,没有加壳,但是很可能用了.NET Reactor做了代码的混淆。既然没有加壳,那就直接上GrayWolf吧:
在左面的树状结构中,可以看到很多代码都是乱七八糟的,估计是被.NET Reactor混淆过的。所以,对于编写注册机这样的事情,我就不抱什么希望了。
最左面的树中,唯一一个可识别的节点是Ploverinfo,点开,下面是LuckyDraw。呵呵,这不就是幸运大转盘嘛。再点击进去看,有一个MainForm的节点,里面有一些软件首页上操作的功能。比如那个开始按钮。
[C#] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
|
private void Start()
{
if (Global.IsTrial && SchemaManager.Instance.Results.Count >= Global.get_TrialCount()) //这里判断注册标识,以及抽奖次数,这个判断方法有问题
{
MessageBox.Show(kgbOBx7BanbFa22Hp9.ol99ukmDA(14708)); //跳出未注册提示
return;
}
if (WheelManager.Instance.getGoal() == null)
{
MessageBox.Show(kgbOBx7BanbFa22Hp9.ol99ukmDA(14762));
return;
}
if (SchemaManager.CurrentSchema.IsInputInfo)
{.......
|
大家看这段代码
Global.IsTrial && SchemaManager.Instance.Results.Count >= Global.get_TrialCount()
Global.IsTrial 是否试用版,试用版的话就是True,注册版的话就是False
SchemaManager.Instance.Results.Count 是抽奖次数,Global.get_TrialCount()是系统设置的未注册可抽奖次数,也就是5次。
我说这段代码有问题,就是这里把两个条件放在一起用&&连接,也就是说,只有这两个条件都为True的时候,才会跳出对话框。对于&&条件来说,属于交集,就是相对严格的条件。你把未注册的条件设置的那么窄,也就是已注册的范围就广了。这个和注册的意义背道而驰了。
那对于爆破来说,只要把其中一个条件改为False,这个软件就被破解掉了。
所以劝大家今后写程序的时候,遇到这种情况,用&&还是用||要考虑好。
这里如果爆破的话,就把这里的brfalse.s改为brtrue.s就可以了。
当然,这样做,实际上的意义就是当这个软件未注册的时候,可以抽奖5次以上,而如果已注册,则只能抽奖5次以下。虽然用起来没问题,但是总是有些别扭吧。
还是继续看左面的树,发现一个Program,下面有个Main,点开看:
这个Main应该是程序运行时首先执行的代码,一般来说都是一些变量的初始化
仔细看右面部分的代码:
我用黄色框圈出来的,就是被.NET Reactor混淆过的代码,基本上看不明白是什么意思,所以我们也就不去研究了。
看红框圈起来的
Global.IsTrial = true;
哇靠,这是什么?软件运行起来,首先初始化为未注册版?再往下看:
if (Global.IsTrial)
{
Global.IsTrial = false;
Global.IsTrial = !Global.Instance.IsReg(kgbOBx7BanbFa22Hp9.ol99ukmDA(3274));
}
如果是未注册版,那就调用IsReg函数去判断是不是注册版,即使IsReg函数调用错误也把软件置为注册版。
看到了吧?软件作者的想法有问题,Global.IsTrial = false; 这一句就不该写啊!
我们把这两部分结合看,软件先是置成了未注册版,然后判断未注册的话再去改状态。那么反过来说,假如是已注册,后面那句就没用了。
也就是说,爆破的话,只需要把
Global.IsTrial = true;
改为
Global.IsTrial = false;
就搞定了。
唉唉唉,我再说一下啊,写程序可不能这样写啊,漏洞太大了。
我们现在已经知道怎么改了,用ILDASM解出*.il文件,修改相应代码后再用ilasm重新编译即可。不过,那样生成的文件与原文件可能会有差异,咱不是讲究完美嘛,还是直接修改EXE的字节好了。可是对于.NET的汇编助记符,我可不是很熟悉,只好借助IDA了。
运行IDA,加载需要破解的程序,在左面找到main:
在右面的代码中,可以找到刚才我们要修改的语句:
ldc.i4.1
stsfld bool [Ploverinfo.CommonLib]Ploverinfo.CommonLib.App.Global::IsTrial
这两句的意思就是给IsTrial这个变量赋值1,1就是True嘛。那么我们现在改成False,所以知道改哪里了吧?
对的,就是把
ldc.i4.1
改成
ldc.i4.0
就可以了
在这里点中ldc.i4.1这条语句,然后切换到HEX View-A的视图
能看到当前17是被选中的状态,说明ldc.i4.1这句的汇编助记符是17,那么百度一下(或者在上下文里找找)就知道ldc.i4.0的助记符是16。也就是说,我们把这里的17改为16就可以。
运行UlTraEdit,打开要破解的程序,搜索16进制代码。为了准确定位,可以多搜几位,比如我搜的就是000A166F2701000A1780,找到后,把17改成16,保存。
现在再去运行一下待破解的程序,点击开始,软件继续抽奖,不再弹出注册提示窗口,说明破解完成。
这个爆破,只改了一个字节,对程序的完整性没有影响。只是这个软件属于注册机制做得比较差的软件,所以破解起来也没什么技术含量,好像挺没有成就感的。
下次找一个带壳的练练。
|