概述

反正就是网课app了,逆向之后可以实现签到什么的

本文仅为学习用途,请勿使用本文相关信息进行其他活动

准备

在网上找了一下分析该app的文章,但是只找到一篇2017年的文章,链接

看了文章,发现很多细节的地方并没有说清楚,于是只好自己上手操作

开始

首先抓包

抓https有时候可能需要一个xposed模块让系统信任所有证书

JustTrustMe

很显然他的登录协议已经发生了改变,在请求头部多出了一个signature,如果不带signature就无法登录,查看了其他数据包之后分析这个参数是客户端生成的

为了找出这个sign生成的算法只好通过逆向

登录

1.大致浏览

使用jadx打开

文章中的app并没有加固,但是当我开始分析的时候它已经加固了

加固后的app直接分析看不到任何程序相关的源代码

查找网上各类资料后最终选择使用xposed来脱壳,插件叫做易开发

很幸运使用这个模块成功脱壳,按照文章的思路进行搜索,找到了两个函数可能返回签名

为了找出登录是使用了哪一个方法,只好搜索登录的url来进一步确认

通过查找该变量的用例找到了构造登录数据包的方法

而这里的b就是构造请求头的方法(同名的函数有很多),点击b就可以跳到对应的方法

可以看到它调用的是只有三个参数的a方法

方法a主要将a的三个参数拼成一个字符串,在返回处还调用了两个函数

因为jadx不能同时加载多个dex,我尝试将其转换为三个jar再合并也没有成功,最后只能通过搜索在几个dex文件中寻找这个方法

最后发现d.a是进行HmacSHA1加密的方法

d.j是一个传入Contex来计算一个值的方法,我没能看懂他的操作(无法成功反编译,只有字节码)

至于上面的a方法的参数是什么的话,其实就和文章中的一样

找参数

其实除了那个计算出来的值,其他参数还是很好找的,根据那些似懂非懂的代码判断这个值只与客户端的一些不变的参数有关,找出这个参数即可实现登录

为了找出那个参数,最常用的方法可能是直接在该方法处下断点来获取返回值,只好查阅资料来寻找方案

博主对字节码并不熟悉且大多数壳都有反调试,脱壳后的修复也比较复杂(博主不会逆向),最后决定使用一个并不是十分方便的方法——使用xposed模块直接获取返回值

编写xposed模块其实也不是很难,有两个坑需要注意,一是hook带壳应用的时候不太一样,二是hook私有方法需要先设置为可访问

获取签到状态

这里的就和文章中的一样了,博主顺便也吧获取班级列表的接口看了一下,这样就可实现全部课程的签到

这里的signature校验算法是参数多一些的那个a方法,并不是登录的算法

签到

坑。。。。。。

这个应用的签到服务器居然是另一个,导致我以为获取了签到状态就已经签到成功了

更坑的是那个手机版免root抓包程序居然没有解密那个包(非443端口),我还以为是什么第三方sdk的包

最后通过那个域名在代码里找到了逻辑,配合fiddler抓到了那个包成功实现了签到

最后我要吐槽一下这个应用的签到,发送签到成功的数据里并没有手势信息,他的手势签到是在客户端验证的

也就是说你甚至可以在不知道手势的情况下直接签到成功

当然你也可以查看签到信息来得到手势,,,,,,,,