超级炒冷饭——乖离性MA科技制作简谈(1) 登陆部分
https://www.makedie.xyz/archives/1427
脱机挂?什么东西?很多人是一脸懵逼的……很多人还停留在什么八门神器啊什么IGG上面
但是实际上游戏偷懒这种事情早就已经高的不知道哪里去了
本文仅仅是简谈,所以需要一定的理解力(其实是我语文老师死的早)
如果有很多人想看的话会继续详细化的
今天就尝试带大家手把手来弄一个乖离性百万亚瑟王科技……柿子要挑软的捏,毕竟明文包现在我们开始吧……XD
讲道理……任何一个网路游戏我们都可以理解成用户操作客户端与伺服端的通信,乖离也是如此
那么我们的目标是修改客服端数据然后作大死?当然不是……
本教程不是干这些的
我们是把用户操作这部分交由自动化操作,然后自己实现一个客服端与伺服器通信
那么我们先定一个小目标:成功的登录游戏 这个目标也是本章讲的内容
捕获通讯
当然,联网游戏必然会有通讯,所以我们首先就是要抓包一波,不抓一把难道硬生生看着客服端瞎搞么
在它loading的时候我们用fiddler就可以捕获到很多东西了
嗯?刚刚好遇见切切活动啊……不过还是继续写吧23333
当出现这个画面的时候就意味着我们的抓包已经结束了……游戏可以关掉了,因为我们本章目标仅仅是登陆而已
接下来的过程我们分析一下包就好我们先来看看明显到爆炸的login……不是abcd这样子的真是太好了HHHH,有些游戏不仅仅是封包加密,就连地址都是abcd
看着这个post……我们重新登陆几次就可以发现,变化的只有UUID与hash_token而已构造这个包的话用
string login = "{ \"uuid\":\"" + UUID + "\",\"hash_token\":\"" + HashToken + "\",\"clver\":\"460\",\"os\":1,\"carrier\":1,\"market\":2,\"lang\":0,\"device\":\"samsung SM-W2017\",\"token\":\"\",\"os_ver\":\"Android OS 6.1.1 / API-23 (CTC-W2017KEU1APK1)\",\"bsid\":\"\"}";
你要有强迫症的话也可以用json来啊……如同下面代码一样自行序列化反序列化JSON
//var data = JsonConvert.SerializeObject(new LoginPost()
//{
// uuid = UUID,
// hash_token = Hash_Token,
// clver = "460",
// os = "1",
// carrier = "1",
// market = "2",
// lang = "0",
// device = "samsung SM-W2017",
// token = "",
// os_ver = "Android OS 6.1.1 / API-23 (CTC-W2017KEU1APK1)"
//});
反正这样子来反而会很坑你信不信,运行起来速度反而会慢哦
UUID我们可以在/data/data/net.gamon.kmaTW/shared_prefs/SmartBeat.xml找到
那么hash_token要怎么去计算呢?这种时候就要拆开客户端仔细观察了。噫……unity游戏?这就是我说的软柿子了。
简单搜索hash我们已经可以找到这个地方……很简单对不对……
复制一下我们就可以直接拿来用了,52有代码框插件我就可以放心复制出来了,比起wordpress论坛排版还是挺有难度的
public static string GetHashFromUUID(string UUID)
{
int[] array = new int[12];
for (int i = 0; i
{
switch (i)
{
case 0:
array[i] = 78;
break;
case 1:
array[i] = 68;
break;
case 2:
array[i] = 51;
break;
case 3:
array[i] = 26;
break;
case 4:
array[i] = 35;
break;
case 5:
array[i] = 44;
break;
case 6:
array[i] = 117;
break;
case 7:
array[i] = 46;
break;
case 8:
array[i] = 25;
break;
case 9:
array[i] = 76;
break;
case 10:
array[i] = 44;
break;
case 11:
array[i] = 50;
break;
}
}
byte[] bytes = Encoding.UTF8.GetBytes(string.Format("{0}{1}{2}{3}{4}{5}{6}{7}{8}{9}{10}{11}{12}", new object[]
{
UUID,
Convert.ToChar(Convert.ToInt32(array[0].ToString(), 16)),
Convert.ToChar(array[1]),
Convert.ToChar(array[2]),
Convert.ToChar(Convert.ToInt32(array[3].ToString(), 16)),
Convert.ToChar(array[4]),
Convert.ToChar(Convert.ToInt32(array[5].ToString(), 16)),
Convert.ToChar(array[6]),
Convert.ToChar(array[7]),
Convert.ToChar(Convert.ToInt32(array[8].ToString(), 16)),
Convert.ToChar(Convert.ToInt32(array[9].ToString(), 16)),
Convert.ToChar(array[10]),
Convert.ToChar(Convert.ToInt32(array[11].ToString(), 16))
}));
SHA1 sHA = new SHA1Managed();
string HashToken=Convert.ToBase64String(sHA.ComputeHash(bytes));
return HashToken;
}
创建一个C#工程……我们来复现这部分计算代码吧
当然画窗口这部分我是不讲的……因为这个完全是看个人的喜好,本例子中就画了文本框用来输入UUID、显示token、显示登陆数据
看代码可知 Convert.ToBase64String(sHA.ComputeHash(bytes)))生成的就是token,bytes部分代码复制即可了
继续观看下一个数据connect
可以看见它发送了一个数据就是login.php返回的sess_key,那么我们应该如何处理才能获取这个sess_key?自己写代码固然是一个方法……但是我更偏好于从游戏程式中拉取它的代码
简单找找看我们可以看见这个,直接把获取key部分弄下来就可以了,其他管这么多干嘛
public static int GetSSKEY(string jsonstr)
{
IDictionary dictionary = (IDictionary)Json.Deserialize(jsonstr);
sess_key = (string)dictionary["sess_key"];
return 0;
}
这个处理json的部分在 Assembly-CSharp-firstpass.dll里面……我们直接引用这个就好了
嗯……拿到了sess_key我们把它作为一个公有静态变数,别问我为什么,接下来几讲你会明白的
解决了connect我们再看下一个HomeShow
看见这个我们就明白了……登陆已经完成了。还记得上面那张图么……
这些信息就是登陆后会出现的信息关于如何处理这些信息,我们在下一章文章再讨论。
别问我为什么下一章再解决……我去刷卫星炮PA去
卫星炮才1……这输出怎么能有啊……话说有没有大佬带我刷SHAQ地坑啊
接下来就是测试的时候了。
显示了跟fiddler一样的信息……我们的登陆部分成功的完成了撒~
本章工程地址,话说不用网盘行不行……网盘更新很不方便啊ORZ
https://coding.net/u/YoshinoSakura/p/KairiseiMA_TW/git/commit/dc463f17a7d1e5379ebae84a3b6d11a84788ea12
请务必看好commit版本……不然会对不上代码的,因为只是为了登陆成功……所以类似逻辑判定都是没有的即使是连基础的UUID是否为空的判定都没有,再后几章才会开始修复各种因为逻辑带来的问题
才会开始讲优化与以外防止与处理
那么今天就到这里了……下一章我看看什么时候刷完卫星炮PA再说
预计是讲述如何处理主页面的信息,并将其化为可读性高的形式
技术这种东西是需要大家一起交流的,故此发进论坛中,因为常年都没有写文章,所以有些语无伦次
这个时候就应该说:请大家斧正
附注http发送部分参考了
http://www.cnblogs.com/itjeff/p/4022220.html
词汇注解……不知道为什么每次手快都会打出奇奇怪怪的词汇
程式=程序
ORZ=颜表情,失意体前屈
判定=判断
伺服=服务
变数=变量
信赖CS模组=可信客户端模型
反组译=反编译,但并不是反汇编
稍微把图片上传了一下,才发现论坛并没有自动保存图片到本地的功能,用WP用的太习惯导致没留意这个问题
如果有什么好的建议可以提出哦,下次写东西才能更加的清楚明了