锦州市广厦电脑维修|上门维修电脑|上门做系统|0416-3905144热诚服务,锦州广厦维修电脑,公司IT外包服务
topFlag1 设为首页
topFlag3 收藏本站
 
maojin003 首 页 公司介绍 服务项目 服务报价 维修流程 IT外包服务 服务器维护 技术文章 常见故障
锦州市广厦电脑维修|上门维修电脑|上门做系统|0416-3905144热诚服务技术文章
天喜转盘抽奖软件一个非常简单的.net程序的爆破 [.NET逆向]

作者: 肥牛  日期:2017-05-24 18:13:05   来源: 本站整理

 待破解软件:天喜转盘抽奖软件(一年版)
使用工具: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,保存。
 

现在再去运行一下待破解的程序,点击开始,软件继续抽奖,不再弹出注册提示窗口,说明破解完成。
 

这个爆破,只改了一个字节,对程序的完整性没有影响。只是这个软件属于注册机制做得比较差的软件,所以破解起来也没什么技术含量,好像挺没有成就感的。
下次找一个带壳的练练。



热门文章
  • 机械革命S1 PRO-02 开机不显示 黑...
  • 联想ThinkPad NM-C641上电掉电点不...
  • 三星一体激光打印机SCX-4521F维修...
  • 通过串口命令查看EMMC擦写次数和判...
  • IIS 8 开启 GZIP压缩来减少网络请求...
  • 索尼kd-49x7500e背光一半暗且闪烁 ...
  • 楼宇对讲门禁读卡异常维修,读卡芯...
  • 新款海信电视机始终停留在开机界面...
  • 常见打印机清零步骤
  • 安装驱动时提示不包含数字签名的解...
  • 共享打印机需要密码的解决方法
  • 图解Windows 7系统快速共享打印机的...
  • 锦州广厦电脑上门维修

    报修电话:13840665804  QQ:174984393 (联系人:毛先生)   
    E-Mail:174984393@qq.com
    维修中心地址:锦州广厦电脑城
    ICP备案/许可证号:辽ICP备2023002984号-1
    上门服务区域: 辽宁锦州市区
    主要业务: 修电脑,电脑修理,电脑维护,上门维修电脑,黑屏蓝屏死机故障排除,无线上网设置,IT服务外包,局域网组建,ADSL共享上网,路由器设置,数据恢复,密码破解,光盘刻录制作等服务

    技术支持:微软等