ysd87 发表于 2014-4-18 20:11

对火警的破解过程

本帖最后由 ysd87 于 2014-4-18 23:16 编辑

首先感谢 大大的新手教程,菜鸟小白我看了之后第一个拿小米火警V0415.3来破解
------------------------------------------------------------------------------我是分割线--------------------------------------------------------------------------------------------------------------------
先上Blue大的新手教程传送门
第一课 http://www.52pojie.cn/thread-248348-1-1.html
第二课 http://www.52pojie.cn/thread-249034-1-1.html
第三课 http://www.52pojie.cn/thread-250626-1-1.html
第四课 http://www.52pojie.cn/thread-250633-1-1.html
------------------------------------------------------------------------------我是分割线--------------------------------------------------------------------------------------------------------------------
不说废话了,开始
首先,不管那么多,拿 NETReflector加载小米火警.exe 再说


发现一堆乱七八糟的名字,这不科学啊{:17_1080:}肯定是被混淆过了的,这就需要反混淆
还好 Blue 大教程里面的那个Reflexil 插件自带有反混淆的功能








果然发现了,这exe 用了 Dotfuscator 混淆过了,,戳死它,这会生成一个 小米火警.Cleaned.exe 的文件,再用Re来加载它
戳得爽吧,这下代码好看多了{:17_1078:}
终于开始正真的破解了
1.最核心的问题授权破解
用Bule大的方法。。直接搜索   “授权” 相信大家都会找到这个地方
string[] strArray = u.b("AddShouquan:" + xiaomiId + "||" + str).Split(new string[] { "||" }, StringSplitOptions.None);
            if (strArray.Length == 2)
            {
                MessageBox.Show(strArray, "授权结果");
                if ("OK".Equals(strArray))
                {
                  this._vm.i.a(ai.e);
                  selectedItem.Message = "";
                  this._vm.i.b(true);
                  this._vm.i.t();
                }
            }

幸福来的太容易了,很像关键代码,我的思路是看它授权成功的时候做了什么操作,,我再把这写操作注入到对象的构造器上面
在这里搞了好久。事实证明,不行。。怎么办{:17_1081:}
最后,在Re里面乱翻代码,可以说这里面每个方法都给我翻过了几遍。看哪个方法比较可疑
后来注意到一个方法 Class121里面的 method_0 方法,很明显一看就知道是登陆的方法, 登陆成功之后做了两个操作
this.Enum0_0 = Enum0.const_4;
            this.miSekillPanelVM_0.method_6(this).XiaomiId = str3.Split(new string[] { "userId=" }, StringSplitOptions.None).Split(new char[] { ';' }).Split(new char[] { ',' });


给ID赋值当然不用说啦。。关键在于 赋值了个 this.Enum0_0 = Enum0.const_4; 然后就没后续操作了,也就是说后续操作是通过判断this.Enum0_0的状态来进行操作 const_4 代表着登陆成功的状态,大家都知道登陆成功之后就是开始验证授权了,那就是说授权失败的状态也是通过赋值 Enum0_0的
好啦。解析来查找 给 Enum0_0 赋值的地方了


这么多引用{:17_1085:}不怕,老实的一个个看下去,
在Class121的method_11() 看到。。方法内容是根据Enum状态的不同执行不同操作,仔细一看,这分明就是整个,从登陆到抢购的执行流程嘛,
刚才登陆的时候 赋值了个Enum0.const_4,那么找到这个状态接下去要执行的方法,跑不掉了吧,戳进去


string str = Class0.smethod_0(Class1.smethod_0("awBoAHQAQwBoAHUAZQBBAgGAlBAVAMGA") + ":" + this.miSekillPanelVM_0.method_6(this).XiaomiId);
      this.miSekillPanelVM_0.method_5(str);
      if (str.StartsWith(Class1.smethod_0("ARw==AE4")))
      {
            this.Enum0_0 = Enum0.const_5;
            this.Boolean_1 = false;
            this.miSekillPanelVM_0.method_6(this).Message = Class1.smethod_0("C4ALpUuAC5R+1PzDXuuftA+d");
      }
      else if (str.StartsWith(Class1.smethod_0("ASw==AE8")))
      {
            this.Enum0_0 = Enum0.const_8;
            this.Boolean_1 = true;
      }
      else
      {
            this.Enum0_0 = Enum0.const_23;
            this.miSekillPanelVM_0.method_6(this).Message = Class1.smethod_0("++VGWdD/wFgb2OI+U49XXiTZ");
      }




关键代码在这了,这就是验证授权的地方了。。那么到底哪个才是正确授权的逻辑呢
{:17_1088:}在上面的执行流程可以看到,Enum0.const_4接下里的状态是 6 跟 8
很明显了,中间那个判断就是授权成功的逻辑了。。。找到了。。那么就修改IL改变方法逻辑就行啦
{:17_1074:}具体怎样改我就不多说了,大家自己动手,相信能够改出来的



------------------------------------------------------------------------------我是分割线--------------------------------------------------------------------------------------------------------------------
授权搞定了,那么接下来就是臭名昭著的后门{:17_1051:}
不用考虑,后门肯定要取自己的服务器数据。。最直接的,,抓包,我用的是 HTTP Analyzer
额。这个时候问题来了,我发现。我开着 HTTP Analyzer的时候。软件就到了登陆中就死都不动了,
我关掉它,又能跑下去了。。纠结啊{:17_1085:}
折腾好久才找到,居然在软件里面判断了现有进程的标题,对于特定的标题,软件就罢工{:17_1051:}真可恶
在 Class118 的 method_7()
foreach (Process process in enumerable)
                        {
                            string str = process.MainWindowTitle.ToLower();
                            if (!(((!str.Contains("http") && !str.Contains("sniffer")) && ((!str.Contains("wireshark") && !str.Contains("sock")) && !str.Contains("charles"))) || process.MainWindowTitle.ToLower().Contains("http://")))
                            {
                              Thread.Sleep(0x3e8);
                              this.method_7();
                            }
                        }


{:17_1059:}戳爆它,继续抓包

抓到的包看到。。登陆完成之后还发了一个请求,指向 http://115.28.34.62:1986/CheckAuth.aspx
狐狸尾巴出来了,接下来就是 搜索字符串,找到 Class0 的 smethod_0(string)
string str = "http://115.28.34.62:1986/CheckAuth.aspx";
      if (bool_0)
      {
            str = "http://wyh.hd.xiaomi.com:1986/CheckAuth.aspx";
      }
      string str2 = Class1.smethod_3(string_1);
      Class118 class2 = new Class118 {
            bool_1 = true
      };
      return Class1.smethod_4(class2.method_0(str, "data=" + HttpUtility.UrlEncode(str2)));


查找引用




string[] strArray = Class0.smethod_0(Class1.smethod_0("UAcgBtAEkAbwBwAHQAcgAAcgBGAG0AbwBlAFM=gc2BGA") + ":" + int_0).Split(new char[] { '\n' });
      int num = 0;
      foreach (string str in strArray)
      {
            if (!string.IsNullOrEmpty(str))
            {
                string[] strArray2 = str.Split(new char[] { '\r' });
                UserSekillVM item = new UserSekillVM {
                  Account = strArray2.Trim(),
                  Password = strArray2.Trim(),
                  Status = "Imported"
                };
                list.Add(item);
                num++;
            }


看来没错了。。这段代码存在明显的给用户名,密码赋值。。
当然还有其他判断依据 。。UAcgBtAEkAbwBwAHQAcgAAcgBGAG0AbwBlAFM=gc2BGA这个字符串解密出来的意思就是ImportFromServer怎么解出来的就不说了。
反正是找到了。。
好,接下来再找到哪个地方调用到这个该死的方法


怎么找就不用说了吧。。找到这。。这后门就出来啦。。
改IL,砸了它,自己动手丰衣足食哈。就不多说了。{:17_1073:}我是把他这个if逻辑里面的指令清空



------------------------------------------------------------------------------我是分割线--------------------------------------------------------------------------------------------------------------------
这上面也只是火警两个最主要的核心破解啦,当然,还有其他的,去更新,去账号限制,改标题之类的就不说了,这些不难找
这里面用到的东西大多都是Blue大新手教程里面的。嘿,小白第一次破解。哪里不对的欢迎指出。。
Blue大不发布破解版只能自己更生了,既然Blue大自己搞定制版,那我也不好自己发放破解版了,大家有需要的可以找Blue大搞定制版
{:17_1078:}当然,也可以跟我一样自己更生啦,没问题的{:17_1073:}

{:17_1067:}好啦,本次就说到这啦,谢谢观赏。此乃我在吾爱的处女贴啊,各位看官多洒点分分啊{:17_1074:}没图没真相,上个最后的结果图吧



这流程确实没详细说的那么详细,特别是IL指令的修改,没放出来就是让大家琢磨自己改,自己动手琢磨才印象最深刻(PS:其实是怕Blue大拿菜刀砍我)


ysd87 发表于 2014-4-18 20:12

果断自沙

紫色天堂 发表于 2014-4-18 20:16

蛤蛤,这种教程终于出来了,虽然不怎么详细~~~~~

顺便问一句,LZ能找到限制多开的代码么

linshoulu 发表于 2015-4-4 13:18

厉害,那么这样说火警的后门是真的存在的,太可怕了

小爱网络 发表于 2015-3-30 19:31

建议楼主去做个破解补丁 要不然每期都这样搞~~~~

追风之音 发表于 2015-1-19 12:23

谢谢LZ分享下载了 学习学习

LUOluodawei 发表于 2014-11-29 15:30

膜拜    求楼主发破解好的用下      983242188@qq.com
谢谢哈

lyh8766 发表于 2014-4-18 20:36

感谢楼主的教程,学习一下

半回车 发表于 2014-4-18 20:32

很好的科普帖子,学习了

zyf21 发表于 2014-4-18 20:29

终于出教程了

铅笔先生 发表于 2014-4-19 08:59

吴战神 发表于 2014-4-18 20:52
插件Reflexi怎么添加到Relector中

Blue大大的教程里面有哦

ysd87 发表于 2014-4-18 20:18

紫色天堂 发表于 2014-4-18 20:16
蛤蛤,这种教程终于出来了,虽然不怎么详细~~~~~

顺便问一句,LZ能找到限制多开的代码么

多开很容易找啊,在主窗体的构造函数里面做了限制了,干掉就是

紫色天堂 发表于 2014-4-18 20:19

ysd87 发表于 2014-4-18 20:18
多开很容易找啊,在主窗体的构造函数里面做了限制了,干掉就是

能把他的限制代码给我么,我照着找找

ak103 发表于 2014-4-18 20:20

膜拜大大啊

jojaajj 发表于 2014-4-18 20:22

支持教程,+1

ysd87 发表于 2014-4-18 20:24

紫色天堂 发表于 2014-4-18 20:19
能把他的限制代码给我么,我照着找找

就在主窗体 MainWindow 的构造方法啊,
里面有
Process[] processes = Process.GetProcesses();
      foreach (Process process in processes)
      {
            if (process.MainWindowTitle.Contains("小米抢购助手-火警 V"))
            {
                Environment.Exit(1);
                return;
            }
      }
这段就是

lwangqinger 发表于 2014-4-18 20:25

感谢楼主!阅读之后茅厕顿开啊,一切都明了了

紫色天堂 发表于 2014-4-18 20:27

ysd87 发表于 2014-4-18 20:24
就在主窗体 MainWindow 的构造方法啊,
里面有
Process[] processes = Process.GetProcesses();


多谢,照着你的说法试试
页: [1] 2 3 4 5 6 7 8 9 10
查看完整版本: 对火警的破解过程