好友
阅读权限20
听众
最后登录1970-1-1
|
ysd87
发表于 2014-4-18 20:11
本帖最后由 ysd87 于 2014-4-18 23:16 编辑
首先感谢 [Blue]大大的新手教程,菜鸟小白我看了之后第一个拿小米火警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 再说
火警1
发现一堆乱七八糟的名字,这不科学啊肯定是被混淆过了的,这就需要反混淆
还好 Blue 大教程里面的那个Reflexil 插件自带有反混淆的功能
火警3
果然发现了,这exe 用了 Dotfuscator 混淆过了,,戳死它,这会生成一个 小米火警.Cleaned.exe 的文件,再用Re来加载它
戳得爽吧,这下代码好看多了
终于开始正真的破解了
1.最核心的问题授权破解
用Bule大的方法。。直接搜索 “授权” 相信大家都会找到这个地方
[C#] 纯文本查看 复制代码 string[] strArray = u.b("AddShouquan:" + xiaomiId + "||" + str).Split(new string[] { "||" }, StringSplitOptions.None);
if (strArray.Length == 2)
{
MessageBox.Show(strArray[1], "授权结果");
if ("OK".Equals(strArray[0]))
{
this._vm.i[selectedItem].a(ai.e);
selectedItem.Message = "";
this._vm.i[selectedItem].b(true);
this._vm.i[selectedItem].t();
}
}
幸福来的太容易了,很像关键代码,我的思路是看它授权成功的时候做了什么操作,,我再把这写操作注入到对象的构造器上面
在这里搞了好久。事实证明,不行。。怎么办
最后,在Re里面乱翻代码,可以说这里面每个方法都给我翻过了几遍。看哪个方法比较可疑
后来注意到一个方法 Class121里面的 method_0 方法,很明显一看就知道是登陆的方法, 登陆成功之后做了两个操作
[C#] 纯文本查看 复制代码 this.Enum0_0 = Enum0.const_4;
this.miSekillPanelVM_0.method_6(this).XiaomiId = str3.Split(new string[] { "userId=" }, StringSplitOptions.None)[1].Split(new char[] { ';' })[0].Split(new char[] { ',' })[0];
给ID赋值当然不用说啦。。关键在于 赋值了个 this.Enum0_0 = Enum0.const_4; 然后就没后续操作了,也就是说后续操作是通过判断this.Enum0_0的状态来进行操作 const_4 代表着登陆成功的状态,大家都知道登陆成功之后就是开始验证授权了,那就是说授权失败的状态也是通过赋值 Enum0_0的
好啦。解析来查找 给 Enum0_0 赋值的地方了
这么多引用不怕,老实的一个个看下去,
在 Class121的method_11() 看到。。方法内容是根据Enum状态的不同执行不同操作,仔细一看,这分明就是整个,从登陆到抢购的执行流程嘛,
刚才登陆的时候 赋值了个 Enum0.const_4 ,那么找到这个状态接下去要执行的方法
,跑不掉了吧,戳进去
[C#] 纯文本查看 复制代码 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");
}
关键代码在这了,这就是验证授权的地方了。。那么到底哪个才是正确授权的逻辑呢
在上面的执行流程可以看到,Enum0.const_4 接下里的状态是 6 跟 8
很明显了,中间那个判断就是授权成功的逻辑了。。。找到了。。那么就修改IL改变方法逻辑就行啦
具体怎样改我就不多说了,大家自己动手,相信能够改出来的
------------------------------------------------------------------------------我是分割线--------------------------------------------------------------------------------------------------------------------
授权搞定了,那么接下来就是臭名昭著的 后门
不用考虑,后门肯定要取自己的服务器数据。。最直接的,,抓包,我用的是 HTTP Analyzer
额。这个时候问题来了,我发现。我开着 HTTP Analyzer的时候。软件就到了 登陆中 就死都不动了,
我关掉它,又能跑下去了。。纠结啊
折腾好久才找到,居然在软件里面判断了现有进程的标题,对于特定的标题,软件就罢工真可恶
在 Class118 的 method_7()
[C#] 纯文本查看 复制代码 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();
}
}
戳爆它,继续抓包
抓到的包看到。。登陆完成之后还发了一个请求,指向 http://115.28.34.62:1986/CheckAuth.aspx
狐狸尾巴出来了,接下来就是 搜索字符串,找到 Class0 的 smethod_0(string)
[C#] 纯文本查看 复制代码 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)));
查找引用
[C#] 纯文本查看 复制代码 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[0].Trim(),
Password = strArray2[1].Trim(),
Status = "Imported"
};
list.Add(item);
num++;
}
看来没错了。。这段代码存在明显的给用户名,密码赋值。。
当然还有其他判断依据 。。 UAcgBtAEkAbwBwAHQAcgAAcgBGAG0AbwBlAFM=gc2BGA 这个字符串解密出来的意思就是 ImportFromServer 怎么解出来的就不说了。
反正是找到了。。
好,接下来再找到哪个地方调用到这个该死的方法
怎么找就不用说了吧。。找到这。。这后门就出来啦。。
改IL,砸了它,自己动手丰衣足食哈。就不多说了。我是把他这个if逻辑里面的指令清空
------------------------------------------------------------------------------我是分割线--------------------------------------------------------------------------------------------------------------------
这上面也只是火警两个最主要的核心破解啦,当然,还有其他的,去更新,去账号限制,改标题之类的就不说了,这些不难找
这里面用到的东西大多都是 Blue大新手教程里面的。嘿,小白第一次破解。哪里不对的欢迎指出。。
Blue大不发布破解版只能自己更生了,既然Blue大自己搞定制版,那我也不好自己发放破解版了,大家有需要的可以找Blue大搞定制版
当然,也可以跟我一样自己更生啦,没问题的
好啦,本次就说到这啦,谢谢观赏。此乃我在吾爱的处女贴啊,各位看官多洒点分分啊没图没真相,上个最后的结果图吧
pic
这流程确实没详细说的那么详细,特别是IL指令的修改,没放出来就是让大家琢磨自己改,自己动手琢磨才印象最深刻(PS:其实是怕Blue大拿菜刀砍我)
|
免费评分
-
查看全部评分
|
发帖前要善用【论坛搜索】功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。 |
|
|
|
|