zhw990217 发表于 2018-2-3 13:49

XX 考试模拟软件 二级c & 二级c vip 破解

本帖最后由 姐又寡闻了 于 2019-6-6 18:50 编辑

【零】初衷
       (萌新发帖,有所不周之处,望海涵)
       因为有个朋友 要考 二级c下载软件后发现要付费,于是我就想可不可以 运用 从各位大佬这里学到的知识来破解它。

      https://www.52pojie.cn/forum.php?mod=image&aid=1046858&size=300x300&key=fd4bda4c25c5c1bd&nocache=yes&type=fixnone
【一】查壳,od载入。。。
       我一开始 ,就直接od载入,发现程序自动退出了,再附加一看,也不行,在网上找了许多资料后,下载了许多.net的专用工具(详见后文)
调整了思路后:
我 使用 DONETStringSearch 查找了.exe 结果什么 有用的字符串都没找到,那么,破解的关键 就在dll文件上了                                    
我看到了这个名字:https://www.52pojie.cn/forum.php?mod=image&aid=1046866&size=300x300&key=d9877173663bce2f&nocache=yes&type=fixnone
那么,查一下是否混淆,并使用 de4dot反混淆了一下                                                                                                                              
使用 Reflector.exe 打开了 SystemFream.dll            https://www.52pojie.cn/forum.php?mod=image&aid=1046868&size=300x300&key=64d4e05fd7337196&nocache=yes&type=fixnone
哇,我看到了什么:

那么很显然我们已经到了 入口

【二】 分析
          经过分析后,我找到了关键函数 (这多亏了 Reflector 可以把 源文件 使用 c#源码的形式 展现出来)      
         
          如图:                                                   
                                                                                                         
          遍历源代码 我们找到了 关键跳转:


源代码如下:
   if (!new CheckNetStatus().CallPing("www.baidu.com"))   //      
   {            if ((this.tbSN.Text != "MSPK34SF1M27WQ") || (Parameters.CurrentCourse.Sign.ToLower() != "msofficenew"))      
       {                if ((this.tbSN.Text == "MSPK34SF1M27WQ") || (Parameters.CurrentCourse.Sign.ToLower() == "cpro"))         
            {                   sok = new TipsOK("激活提示", "请检测网络是否通畅!"){   //
                                    SetIco = Resources.B_weiqu               
                        };                  
                     sok.ShowDialog();                  
                     return;         
            }               
         str= "Ok";   //      
         }            
            else         
            {         str= "Ok";            }   
         }      
      else   
      {      
          try            {                str = new UserRegister().PostInfo(this.CreateJson());            }         
          catch      
         {                this.btnSub2_Click(null, null);         
         }      
    }   


   switch (str)      
{            case "Ok":                                          
   {                base.Close();            
                      this.isOk = true;               
                      SqliteHelper.set_ConStr(AppDomain.CurrentDomain.BaseDirectory + @"data\" + Parameters.CurrentCourse.Sign + @"\data.dat");               
                      JFT_Class class2 = new JFT_Class();               
                      JFT_Class model = class2.GetModel();               
                      model.set_SN(this.tbSN.Text);            
                      model.set_ClassType(StringTest.DesEncrypt(Parameters.HMAC + this.tbSN.Text + Parameters.CurrentCourse.Sign));                     
                     class2.UpdateClass(model);            
                     sok = new TipsOK("激活提示", "恭喜,软件成功激活!")
   ...........





那么问题已经很清晰了,我选择断网会 报错"激活提示", "请检测网络是否通畅!"
我们只需要在该处 不跳转 就 破解 成立


下面我使用了 reflector 的一个插件reflexil (该插件可以修改 IL反汇编 代码)

又因为   if ((this.tbSN.Text == "MSPK34SF1M27WQ") || (Parameters.CurrentCourse.Sign.ToLower() == "cpro"))

使用了 || 所以我们需要修改两处IL代码 (具体代码含义见后文)

我们在
(116) IL_074 处       //其中 116 是在 reflector 的插件reflexil 中显示的偏移量   
(143) IL_08F 处       //IL_08F 是在 IL
   全部改为 bs_true_s

如右图:


改完收工。




【三】新的开始
在破解vip题库的时候遇到了很多问题
   首先是32位的reflector 改数据时 溢出 ,改完后成立一个负数
   else if (num== 0x65E485CF) //      
      {if (s== "Ok")//      
   {               base.Close();            
                     this.isOk = true;               
                     SqliteHelper.set_ConStr(AppDomain.CurrentDomain.BaseDirectory + @"data\" + Parameters.CurrentCourse.Sign + @"\data.dat");               
                     JFT_Class class3 = new JFT_Class();               
                     JFT_Class model = class3.GetModel();               
                     model.set_SN(this.tbSN.Text);            
                     model.set_ClassType(StringTest.DesEncrypt(Parameters.HMAC + this.tbSN.Text + Parameters.CurrentCourse.Sign));               
                     class3.UpdateClass(mode)l;               
                     FileManage.WriteFile(AppDomain.CurrentDomain.BaseDirectory + "User.dat", this.tbUser.Text + "|" + this.tbPass.Text, true);            
             new TipsOK("激活提示", "恭喜,软件成功激活!")
                        ...............
   


   else if ((num == 0xb8190cac) && (s == "SnNotExist"))//
      {            new TipsOK("激活提示", "输入的激活码不存在,请输入正确的激活码!")
       {         SetIco = Resources.B_wuyu }.ShowDialog();            return;      }      
                   new TipsOK("激活提示", "未知异常,请稍后重试!")
                { SetIco = Resources.B_weiqu }.ShowDialog();
    }


既然我们胡乱输入      会跳转到else if ((num == 0xb8190cac) && (s== "SnNotExist"))//         {                                  new TipsOK("激活提示", "输入的激活码不存在,请输入正确的激活码!")
            { SetIco = Resources.B_wuyu }.ShowDialog();               return;          }            
             new TipsOK("激活提示", "未知异常,请稍后重试!")
            { SetIco = Resources.B_weiqu }.ShowDialog();

所以这个也要改两处else if (num == 0x65E485CF) //   改成num== 0xb8190cac
                if (s== "Ok")//改成s != "Ok"      

    但是把       0x65E485CF 改成 0xb8190cac 在 32位环境下是 负数
                   else if ((num== -1206317908) && (s == "SnNotExist"))



本来以为 凉凉 但是 细细一看源码
IL_01ab:pop
IL_01ac:ret
IL_01ad:ldloc.1
IL_01ae:ldc.i4   0xb8190cac
IL_01b3:bgt.un   IL_0340         
IL_01b8:ldloc.1
IL_01b9:ldc.i4   0x65E485CF
IL_01be:beq.s      IL_01fe   //跳转到 激活成功
IL_01c0:ldloc.1
IL_01c1:ldc.i4   0xb8190cac
IL_01c6:beq.s      IL_01cd   //跳转到 激活失败
IL_01c8:br         IL_038d
IL_01cd:ldloc.0
IL_01ce:ldstr      "SnNotExist"

我一看,顿时放心了,成功在失败之前 被测试
所以
把 IL_01b9:ldc.i4   0x65E485CF
IL_01be:beq.s      IL_01fe   //跳转到 激活成功
改为
IL_01b9:ldc.i4   0xb8190cac
IL_01be:beq.s      IL_01fe   //跳转到 激活成功

PS: 改数据时如果使用 Reflector 不行,那就 用 winhex 搜   0x65E485CF,我的电脑上就出现了这个问题,
偏移量我忘了,大概是在 9E0A 处,但平台不同,版本不同,等等,不确定




然后在 (521)IL_0209 处 改为 brtrue


测试 通过









【软件&破解后的文件】

no.1
Reflector、reflexil、De4Dot、IL指令速查表
http://blog.csdn.net/u010349629/article/details/52058407
no.2 破解DLL(使用说明,在压缩包里)
二级C考试模拟   破解.zip
二级C语言VIP题库   破解.7z

NO3 工具 (附件大小限制,网盘)

de4dot 链接:https://pan.baidu.com/s/1qZATwwk 密码:gcjg

Reflector9.0.1.374(已包含插件)链接:https://pan.baidu.com/s/1jJiFsqE 密码:5nr6





【n】最后,如果我在文中有疏漏之处,敬请指正,新人第一次发帖,请轻喷,谢谢{:1_893:}

                                       

新时代小白 发表于 2018-2-6 17:57

激动得想哭,感谢楼主!3月份我也要考二级C语言,这个软件终于让我给找到了……:'(weeqw

Breeze_珉 发表于 2018-3-18 14:26

朽. 发表于 2018-2-6 22:27
问下 第一个附件是普通的题库吗 第二个才是vip题库吗?   vip题库的原件哪里下载啊。。

都是一样的,一个zip,一个7z,VIP题库可以直接去未来教育那里下载

欧琪茵 发表于 2018-2-5 13:22

没人回贴吗??

w1w2w1w2 发表于 2018-2-5 14:50

我试过了 这个东西很好 都能用牛{:1_893:}

青春丿易逝 发表于 2018-2-5 17:54

计算机类题库其实只用改一个字就OK了,楼主你去找找这段
course.Status = ((a == dataTable.Rows["ClassType"].ToString()) ? "已激活" : "未激活");

朽. 发表于 2018-2-6 22:27

问下 第一个附件是普通的题库吗 第二个才是vip题库吗?   vip题库的原件哪里下载啊。。

朽. 发表于 2018-2-6 22:44

有2018的吗 这怎么是2017呢

青春丿易逝 发表于 2018-2-6 22:57

朽. 发表于 2018-2-6 22:44
有2018的吗 这怎么是2017呢

链接:https://pan.baidu.com/s/1hufCaZq 密码:2333
给你一个

zhw990217 发表于 2018-2-7 13:18

朽. 发表于 2018-2-6 22:27
问下 第一个附件是普通的题库吗 第二个才是vip题库吗?   vip题库的原件哪里下载啊。。

http://www.eduexam.cn/wt/

sqzjok 发表于 2018-2-9 16:02

谢谢,收下了
页: [1] 2 3 4 5 6 7 8 9 10
查看完整版本: XX 考试模拟软件 二级c & 二级c vip 破解