疫情期间,学校每天都要填*疫情信息,每天填写不及时都要被催,于是便萌生了一个想法(身为CS的学生竟如果能写一个脚本每天帮我填写那就再好不过啦~)。
0x01 逆向工程中用到的工具
- 安卓模拟器 (可以用夜神等
1024s.cn 模1024s.cn 拟器配合FD抓包) - PostMan (模拟发送请求)
- Fiddler Web Debugger (传说中的FD抓包工具)
- Jadx (强大的App反编译工具)
0x02 逆向思路
- 抓取服务器接口
- 分析反编译App源码
- 模拟APP登录
- 模拟填报疫情信息并提交
0x03 App的登录逻辑
- 从服务器获取公钥(PublicKey)
-
生成一段随机的Base64代码(RandomBase64),然后用公钥加密
-
将加密生成的代码放到请求中,继续请求获取公钥的链接,获取一个加密的Unique-Code代码,并将此代码用一开始生成的RandomBase64解密,拿到解密后的Unique-Code
-
将用户的登录信息用开始生成的RandomBase64进行加密
-
将Unique-Code放入请求头,将加密后的用户信息作为参数,带参访问服务器的登录接口。登录成功后服务器会返回用户的所有信息,当然是经过加密的,解密后即可获得用户的所有信息
-
登陆成功后根据服务器返回的信息
本文来自:1024s.cn 填充Access-Token并进行加密,然后将其放入请求头。在以后访问接口时请求头需带Unique-Code和Access-Token
0x04 具体的流程和步骤
- 先用FD抓到了第一个接口,如图所示。
可以看到在app启动时请求了两次服务器,并且拿到了一串代码,这就是加密的公钥
- 使用Jadx工具对App进行反编译,对反编译的代码进行分析
发现这个随机生成的Base64代码是通过asBaseSecretUtil中的某方法生成的,然后我们将反编译代码中整个a
- 继续分析FD抓到的数据包,发现客户端二次请求服务器并且携带了一些加密数据
- 根据抓到的数据包,可以看到请求时携带了Unique-Code和Access-Token
1024s.cn 和加密后的RandomBase64Key,然后把Unique-Code放到请求头,然后将RandomBase64Key作为参数,使用Postman模拟请求服务器,可以拿到一串加密后的数据,然后结合逆向代码,并且尝试用RandomBase64解密返回的数据,成功拿到了Unique-Code,然后放到请求头中。并且在逆向代码中可以可以找到登录时代码,可以发现上传时将一个用户Bean进行加密,然后带上加密的数据请求服务器。我们尝试用RandomBase64加密此数据,并本文来自:1024s.cn 且访问服务器本文来自:1024s.cn ,这时候服务器返回了一段加密数据,和登陆成功的字样,代表模拟登陆成功了。
- 然后我们尝
本文来自:1024s.cn 试用RandomBase64进行解密,发现返回了用户的大量信息,这些信息很多都是不需要的,十分不安全。如下图
- 登陆成功后根据拿到的数据封装加密后的Access-Token,以后进行其他操作的时候带上此Token和Unique-Code就可以了
0x05附上小伙伴写的java代码
小伙伴是个Java大佬 大家可以戳这个链接 神秘的小伙伴 访问他的博客。
至此我们已经用Java模拟登录成功了APP,然后就可以用Python或者其他语言来编写自动化填写*情信息的代码了,然后可以把程序挂到服务器上写一个定时任务,这样每天就不用担心班长和导员会来催填了!
0x06利用接口实现自动化操作
最后附上自己用Node.js写的批量自动化填写疫情报告