mqk233 发表于 2022-3-30 13:39

记一次酷狗apk登陆算法逆向获取登录token过程

本帖最后由 mqk233 于 2022-3-30 15:16 编辑

酷狗版本:8.9.0
逆向工具:jadx1.3.4
抓包工具:fiddler3.1.0

1、使用fiddler进行登录接口抓包
1.1、设置过滤条件

1.2、获取到登录接口

1.3、整理参数如下:
POST接口:http://login.user.kugou.com/v6/login_by_pwd
请求体:
{
    "p2": "A038899805D811C6858A113F09825916C0A2547723463EF7C94301DB2C541A4CC52372F487D13B2B0594C627E225E241FCD1105D8D7C6B9821D15B4FE47712FDF25F9D99E92D596377C2DAC59673A34351B102D2ADF9152944F38DA3B9F9080BF0EC94D50DECCF83BEAC2B4428789E7DC75DE3A369A7BFC1258838F4ED0342F4",
    "appid": 1005,
    "mid": "305243775012141412962769920046735937901",
    "clientver": 8921,
    "t1": "d668aa79552f22c2f4f3d2880f0b1bb4afc026b3b000b753f29fb580f8ad5dc00df1b99fa88c4dbffc25a97c85aaf9b96e9c4a9146af3982fb520c989a914d88f2942a98224d48212fe2760095c6b4f6b74cfb1e63d5b7afecaaeab8034c15d60f2831b0b39c11f7a3f58b2e666966b81194d728cb28bb71990183ed4c50aac3e69e0b7eb6ed1b59d7bb12d0d95d96139d9e059ce477afa40be87a03c8c3449390bcbf78d8e8d9f3ff1958f0808e5d4f",
    "uuid": "921fc8696d43b57262eca82928e64c2e",
    "t2": "94fa08855a82e28c77ce47546a85e67e88a34216959f6a731aaeaea810f6409827e95eb74c0b803357560cb8588a0f0354e3daf11c30534f96be7e307df6033ac0dac77766a062923b9920685b781a5b1a7af2312a40d442efe64f148223761059a0ceb3adc7002785cd22491dad5de45ec72badf149cde4df6a308b339cf15c",
    "clienttime_ms": "1648613429543",
    "key": "f5ff7e499765aa7d012d523992e54d7b",
    "username": "13097200647"
}
1.4、分析接口:
多次登录之后发现固定参数有appid、mid、clientver、t1、t2、username、uuid,就剩下clienttime_ms、key、p2参数,clienttime_ms一看就是时间戳,那就剩下key、p2两个参数了。
2、使用jadx逆向apk
2.1、全局搜索关键字“key”,筛选一下和请求有关的方法getpostrequestentity


2.1.1、分析getpostrequestentity方法:
参数key值是由new ba().a(b + b2 + valueOf + valueOf2);方法得到的。
看下new ba().a方法,md5加密没跑了。

所以猜想key值就是四个字符串b + b2 + valueOf + valueOf2进行md5加密得到的。
第一个字符串b: String b = com.kugou.common.config.c.a().b(com.kugou.android.app.a.a.lo),点进去看com.kugou.android.app.a.a.lo是啥东西,appid,这个请求参数里面有啊。

第二个字符串b2:同上b2为appkey。
全局搜索"c.a().b(com.kugou.common.config.a.lp);"找到下面一条记录。

点进去找到appkey。

第三个字符串valueOf:String valueOf = String.valueOf(br.F(this.c)),请求参数里面的clientver。
第四个字符串valueOf2:String valueOf2 = String.valueOf(time.toMillis(false)),当前毫秒时间戳应该没跑了。
将以上四个字符串"appid+appkey+appversion+timestamp"连起来进行md5加密和请求参数里面的key对应证实了以上结论。
2.2、全局搜索关键字“p2”,筛选一下和请求有关的方法getpostrequestentity

2.2.1、分析getpostrequestentity方法:
找到这一行:this.a.put("p2", NativeParams.getEncryptText(hashMap2));
点进去getEncryptText方法。找到最后一个类package com.kugou.common.player.kugouplayer.j。发现首先加载了libj.so库,之后将参数hashMap2传入下图j方法,最后将j方法返回值传入native方法_i最后得到加密的值(也就是p2)。


走到这实在走不下去了,这个native方法_i也不知道是不是代码混淆之后的名称,尝试逆向libj.so库不知道从哪下手,有大佬能指点一下嘛。
酷狗apk:https://www.wandoujia.com/apps/34221/history_v8904

mqk233 发表于 2022-4-1 18:36

有大佬指点一下嘛。。。

laos 发表于 2022-4-2 16:18

IDA载入SO 加载完后 按下Ctrl+S选择.data段查看通过jni_onload注册的函数然后开始分析吧



mqk233 发表于 2022-4-2 19:28

laos 发表于 2022-4-2 16:18
IDA载入SO 加载完后 按下Ctrl+S选择.data段查看通过jni_onload注册的函数然后开始分析吧

嗯,按照你说的方法找到了具体的方法,但是这汇编语言不是很懂,能帮忙看下嘛。

mqk233 发表于 2022-4-2 19:39

so文件链接: https://pan.baidu.com/s/1KglxnliPNrTy5tSzjxKfbw?pwd=ji5d 提取码: ji5d

laos 发表于 2022-4-4 20:21

mqk233 发表于 2022-4-2 19:28
嗯,按照你说的方法找到了具体的方法,但是这汇编语言不是很懂,能帮忙看下嘛。

繁琐, 说了p2还有t1, t2

重点都在各个 f 开头的函数

t1 t2 是AES加密
p2 是RSA

mqk233 发表于 2022-4-5 16:47

laos 发表于 2022-4-4 20:21
繁琐, 说了p2还有t1, t2

重点都在各个 f 开头的函数


t1和t2在请求参数里面是固定的,我试过请求中设置t1、t2为0都能请求成功,这两个参数不影响p2的,重点是p2最终是由密码和时间戳加密而成的,中间的加密算法不知道是怎么样的。

mqk233 发表于 2022-4-5 16:52

本帖最后由 mqk233 于 2022-4-5 17:06 编辑

laos 发表于 2022-4-4 20:21
繁琐, 说了p2还有t1, t2

重点都在各个 f 开头的函数


就是差这个p2参数的加密算法没实现。
参照java代码的rsa加密也没成功:
页: [1]
查看完整版本: 记一次酷狗apk登陆算法逆向获取登录token过程