某游戏盒登录协议分析
### 前言之前在论坛看到有人分析了这个案列,但是没分析so层,这边帖子算是补全把,这个案列蛮经典的,适合协议分析练手,下面直接进入正题。
### 准备工作
首先我们得安装抓包软件,我这里是用Fiddler,该软件的配置和使用教程请看这篇博文,
链接: (https://www.cnblogs.com/woaixuexi9999/p/9247705.html)
然后还得配合Frida Hook 框架去分析,新手如果看不懂代码就要多去Hook,该框架的配置和使用教程请看这篇文章,这里我用的frida 版本是12.9.4,感觉这个版本比较稳定
链接:(https://www.jianshu.com/p/c349471bdef7)
### 抓包
首先咱们打开我们要分析的APP,点到登录模块,随便输入账号和密码点击登录,然后观察我们抓包到的数据,这里我们抓到两两条请求,很明显第一个就是我们要找的请求。
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210703130932818.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjAxNDc0OQ==,size_16,color_FFFFFF,t_70)
我再抓一次,然后把数据复制到文本,进行对比,分析哪些是变化的,通过数据对比发现,只有一个sign值是在变,password和sign是加密的,剩下的我们就去分析这些参数。
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210703131611921.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjAxNDc0OQ==,size_16,color_FFFFFF,t_70)
### 代码定位
这里我们抓到了请求链接,可以直接打开jeb或jadx去搜索url请求的关键字,这里我在jadx中搜/log-in,就能直接搜索到,但是大多时候我们搜索关键字会搜索不到,这个时候就只能同DDMS去方法剖析,具体的使用我在上一篇 愤怒的小鸟的博客中使用到了,这里就不在阐述
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210703135241857.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjAxNDc0OQ==,size_16,color_FFFFFF,t_70)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210703143201760.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjAxNDc0OQ==,size_16,color_FFFFFF,t_70)
### JAVA层代码分析
这里我们定位到了代码,发现在该类中这两个方法中的参数和我们抓到包中的参数非常吻合
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210703151000485.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjAxNDc0OQ==,size_16,color_FFFFFF,t_70)
上面找到了疑是参数的地方,我们去查看下loadData上层调用情况,
选中该方法,右键点击查看用例,就可以看到该方法的上层调用,我们点到上层代码,可以看到,这里设置了账号密码,还判断了验证码
![在这里插入图片描述](https://img-blog.csdnimg.cn/2021070313563226.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjAxNDc0OQ==,size_16,color_FFFFFF,t_70)
这里我们基本可以确定上面的那两个方法就是该请求的传参方法,至于是什么调用的,我们接下来就往下面看那我们沿着loadData方法一路点下去,都是调用父类的loadData,最后我们点到com.m4399.framework.providers.NetworkDataProvider 类中的loadData 方法中,这里就是正在请求方法,往下看我们发现这里调用了
我们最开始定位url地方,那个传参的方法,点进去该方法是个虚方法,那我们就一层去找他的实现方法,最后还是回到我们最开始分析的类中所以也验证了我们最开始的猜想,那两个方法就是我们请求传参的方法
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210703141831180.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjAxNDc0OQ==,size_16,color_FFFFFF,t_70)
那我们先回到com.m4399.gamecenter.plugin.main.providers.user.UserLoginDataProvider 类,去分析buildRequestParams 类,他也是调用的父类的buildRequestParams 方法,那我们一层一层往下点,在com.m4399.framework.providers.SignDataProvider 类中找到了他们的调用
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210703144500291.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjAxNDc0OQ==,size_16,color_FFFFFF,t_70)
经过上图的分析,我们可以知道sign值得生成是通过之前传入的值,先排序后再调用so层去处理,接下来我们再去分析so层的处理
### So层代码分析
根据java层分析,我们现在要分析libm4399.so 包中 getServerApi方法
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210703151135182.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjAxNDc0OQ==,size_16,color_FFFFFF,t_70)
我们先去分析getServerApi这个方法打开IDA,该函数是采用动态注册方式,直接按F5查看伪代码,根据java层传递的参数去修改参数类型,和名称以便于后面的分析
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210703145257456.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjAxNDc0OQ==,size_16,color_FFFFFF,t_70)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210703145600539.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjAxNDc0OQ==,size_16,color_FFFFFF,t_70)
我们点到该方法,F5查看伪代码,通过hook 去分析
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210703151720762.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjAxNDc0OQ==,size_16,color_FFFFFF,t_70)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210703151608586.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjAxNDc0OQ==,size_16,color_FFFFFF,t_70)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210703152237725.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjAxNDc0OQ==,size_16,color_FFFFFF,t_70)
这里走了两次,我们之前抓包抓了两个包第一个是登录请求的,第二个是图形码请求接口,这里我们得的界面没有弹出图形验证码所以暂时不用管他,上图可见第二个参数就是java层拼接的字符串,第三个参数是一个32个字节的字符串,咱们点到sub_551c 该方法里面去分析,这里有个分析小技巧,点到函数里面咱们从下往上看,看返回值和哪些变量关联,我们再去跟着分析这些变量的值从哪里,这样可以过滤掉一些无用的代码,但是这里你会发现返回值是v20,并没有找到和其相关的操作
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210703193435636.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjAxNDc0OQ==,size_16,color_FFFFFF,t_70)
这里通过静态分析没法直观的看出v20是从哪里赋值的,通过动态调试你会发现上面的这j_aeabi_memclr4 这两处函数指向的是同一个内存地址,那么下面我们去分析v19,
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210703194005286.png)
我们先看下和v19相关操作的函数,sub_4AD8, sub_4B00, sub_544C.这些函数都在操作v19,点到sub_4AD8你会明显的发现这些是MD5的特征数值,然后又要拼接后的sign和长度传给sub_4B00,那剩下的都不需要分析了,我们最开始hook 的方法得到一个字符串就是MD5的盐,和java层传过来的sign拼接后然后进行MD5加密
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210704163806184.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjAxNDc0OQ==,size_16,color_FFFFFF,t_70)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210704163955146.png)
### 测试
java层后so 层都分析完了,那我们就可以写模拟登录请求了,这里我一开始分析java层的时候就把模拟登录请求直接用他的so写好了,所以这里我把获取sign 值得方法改成我们自己写的MD5机密算再拼上盐就ok,最后测试结果如下
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210704170349326.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjAxNDc0OQ==,size_16,color_FFFFFF,t_70)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210704170419275.png)
### 总结
这个案例虽然我之前就分析过,但是当时没有做笔记所以现在写这个博客的时候又是从头分析记录截图下来的,自我感觉这边博客分析写得还是比较细的,希望各位看客老爷喜欢点个赞,总结下来就是多hook,多做笔记,so层的分析得要静得下心 PPZ丿皮皮智 发表于 2021-7-5 11:33
所以那个验证码是个自慰的本地验证功能吗。。
不是,是你请求次数过多后,才会弹出来 所以那个验证码是个自慰的本地验证功能吗。。 学习了~~谢谢谢谢 {:301_999:}没手动登录过的 好像会登录失败 学习了,谢谢分享
先mark了再说 感谢楼主分享,一起学习
流程很完整了,学习了
流程很完整了,学习了