解密刺猬猫轻小说APP响应数据


最近入坑了刺猬猫轻小说,于是乎想给自己喜欢作品的QQ书群内添加一个报更机器人。

原定想法是抓包web网站上的接口和数据来实现功能,可惜网站上的信息不全,一些小说无法找到,便只好将目光投向了刺猬猫的APP。

我在电脑上使用夜神模拟器以及Fiddler来抓包app的接口请求,随便点开一条抓包信息,可以看出响应数据并非明文,而是经过了某种加密后的base64编码。

network_info

显然,想要得到明文,就要知道app解密响应数据的具体代码,这对于我这种第一次进行app爬虫的萌新无疑是一次有意思的经历。


反编译刺猬猫APP

下载刺猬猫app的安装包(即apk文件),将其后缀改成zip,解压,得到以下目录结构。

network_info

在目录中可以看见classes.dex和classes2.dex两个文件,dex文件是Android系统的可执行文件,而目录中两个文件的大小显然有点不对劲。

将目光投向tencent_stub文件,显然,该apk文件是经过了腾讯御安全的加固,想要反编译出正确的代码,就要脱掉腾讯乐固的这一层壳。

我在模拟器中安装了xposed框架以及反射大师模块,成功绕过加固脱出了原本的dex文件,并通过jadx转换成具体的java项目。

project_directory


寻找解密模块

考虑到接口返回的很大可能是json数据,我便通过jadx的搜索功能查找项目中有关JSONObject的代码,随后一行代码引起了我的注意:

JSONObject jSONObject = new JSONObject(new ParseKsy().decrypt(str));

通过观察,我确定这个ParseKsy便是用于解密响应数据的封装类,并单击定位至定义处

parseksy_code

观察该类的变量定义以及初始化代码,可以确定响应数据采用的是AES加密,加密模式为CBC,密匙为zG2nSeEfSHfvTCHy5LCcqtBbQehKNLXn字符串SHA-256加密后的值,偏移量为0000000000000000


编写解密代码

出于个人爱好,我使用Go语言编写了ParseKsy解密函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
import (
"crypto/aes"
"crypto/cipher"
"crypto/sha256"
"encoding/base64"
)

func base64Decode(data []byte) (dst []byte) {
length := base64.StdEncoding.DecodedLen(len(data))
dst = make([]byte, length)
idx, _ := base64.StdEncoding.Decode(dst, data)
dst = dst[:idx]
return dst
}
func aesDecrypt(data, key, iv []byte) []byte {
block, _ := aes.NewCipher(key)
blockMode := cipher.NewCBCDecrypter(block, iv)
result := make([]byte, len(data))
blockMode.CryptBlocks(result, data)
return result
}

func sha256Encode(src []byte) []byte {
sha := sha256.New()
sha.Write(src)
return sha.Sum(nil)
}

func ParseKsy(data []byte) string {
return string(aesDecrypt(
base64Decode(data),
sha256Encode([]byte(`zG2nSeEfSHfvTCHy5LCcqtBbQehKNLXn`)),
make([]byte, 16),
))
}

测试一下代码,成功将接口响应数据解密为json数据

test_mycode


遇到的坑

  • 安装包经过腾讯御安全加固,需要进行脱壳
  • 代码中有一些内容是经历了base64编码的,用函数解密来隐藏具体代码
    (如将”txt_content”编码成”dHh0X2NvbnRlbnQ=”,害我找不到”txt_content”的位置)
  • 小说具体章节内容需要再AES解密一次,密匙为command参数SHA-256加密后的数据

Author: DawnNights
Reprint policy: All articles in this blog are used except for special statements CC BY 4.0 reprint policy. If reproduced, please indicate source DawnNights !
  TOC