最近入坑了刺猬猫轻小说,于是乎想给自己喜欢作品的QQ书群内添加一个报更机器人。
原定想法是抓包web网站上的接口和数据来实现功能,可惜网站上的信息不全,一些小说无法找到,便只好将目光投向了刺猬猫的APP。
我在电脑上使用夜神模拟器以及Fiddler来抓包app的接口请求,随便点开一条抓包信息,可以看出响应数据并非明文,而是经过了某种加密后的base64编码。
显然,想要得到明文,就要知道app解密响应数据的具体代码,这对于我这种第一次进行app爬虫的萌新无疑是一次有意思的经历。
反编译刺猬猫APP
下载刺猬猫app的安装包(即apk文件),将其后缀改成zip,解压,得到以下目录结构。
在目录中可以看见classes.dex和classes2.dex两个文件,dex文件是Android系统的可执行文件,而目录中两个文件的大小显然有点不对劲。
将目光投向tencent_stub文件,显然,该apk文件是经过了腾讯御安全的加固,想要反编译出正确的代码,就要脱掉腾讯乐固的这一层壳。
我在模拟器中安装了xposed框架
以及反射大师
模块,成功绕过加固脱出了原本的dex文件,并通过jadx转换成具体的java项目。
寻找解密模块
考虑到接口返回的很大可能是json数据,我便通过jadx的搜索功能查找项目中有关JSONObject的代码,随后一行代码引起了我的注意:
JSONObject jSONObject = new JSONObject(new ParseKsy().decrypt(str));
通过观察,我确定这个ParseKsy便是用于解密响应数据的封装类,并单击定位至定义处
观察该类的变量定义以及初始化代码,可以确定响应数据采用的是AES
加密,加密模式为CBC
,密匙为zG2nSeEfSHfvTCHy5LCcqtBbQehKNLXn
字符串SHA-256
加密后的值,偏移量为0000000000000000
。
编写解密代码
出于个人爱好,我使用Go语言编写了ParseKsy
解密函数
1 | import ( |
测试一下代码,成功将接口响应数据解密为json数据
遇到的坑
- 安装包经过腾讯御安全加固,需要进行脱壳
- 代码中有一些内容是经历了base64编码的,用函数解密来隐藏具体代码
(如将”txt_content”编码成”dHh0X2NvbnRlbnQ=”,害我找不到”txt_content”的位置)- 小说具体章节内容需要再AES解密一次,密匙为
command
参数SHA-256加密后的数据