登录数据:
POST https://api.chushou.tv/api/chushou-login.htm? HTTP/1.1
User-Agent: Android ChushouTV/3.1.2.11628
Content-Type: application/x-www-form-urlencoded
Content-Length: 264
Host: api.chushou.tv
Connection: Keep-Alive
Accept-Encoding: gzip
username=15845454545&password=25f9e794323b453885f5181f1b624d0b&imei=865166021513968&_t=1503798306999&_fromView=1&_fromPos=7&_appSource=209&_appVersion=3.1.2.11628&_identifier=1201806294&_imei=865166021513968&_appkey=CSAndroid&_sign=edbe71fa3258d690fdeacf6f1e697f9b
返回数据:
HTTP/1.1 200 OK
Server: openresty
Date: Sun, 27 Aug 2017 01:45:07 GMT
Content-Type: text/plain;charset=UTF-8
Content-Length: 62
Connection: keep-alive
{"code":1100,"message":"该手机号尚未注册","data":null}
数据分析:
username=15845454545 账号
password=25f9e794323b453885f5181f1b624d0b 密码 加密后的 但是他只是个单纯的密码进行的MD5
imei=865166021513968 设备号
_t=1503798306999 时间戳
_fromView=1 不知道啥东西 经多次抓包为固定值 不用管
_fromPos=7 不知道啥东西 经多次抓包为固定值 不用管
_appSource=209 不知道啥东西 经多次抓包为固定值 不用管
_appVersion=3.1.2.11628 APK版本号
_identifier=1201806294 不知道啥东西 经多次抓包为固定值 不用管
_imei=865166021513968 设备号
_appkey=CSAndroid 知道是啥 但是不知道干嘛用的
_sign=edbe71fa3258d690fdeacf6f1e697f9b 签名校验
我们搞的就是这个sign 他不对你登陆不上的
包知道了 加密参数名知道了 那就开始分析APK
JEB 加载分析 搜索_sign
查看第一个sign 查看代码发现
很幸运 我们第一次 一下就找到关键加密点了 什么?你问我怎么知道这里就是加密的?开玩笑 这么隐秘的事情能告诉你蛮
我们来分析翻译一下这段代码 从头看 PS:普通装逼已经不行了 我要发大招了....
v2.a("_appSource", com.kascend.chushou.h.b.a(v6)); v1.a("_appSource", com.kascend.chushou.h.b.a(v6)); v2.a("_appVersion", tv.chushou.zues.utils.a.c(com.kascend.chushou.b.d)); v1.a("_appVersion", tv.chushou.zues.utils.a.c(com.kascend.chushou.b.d)); v2.a("_identifier", com.kascend.chushou.h.d.a().i); v1.a("_identifier", com.kascend.chushou.h.d.a().i); if(!j.a(ChuShouTVApp.IMEI)) { v2.a("_imei", ChuShouTVApp.IMEI); v1.a("_imei", ChuShouTVApp.IMEI); } if(!j.a(this.i)) { v2.a("token", this.i); v1.a("token", this.i); } v2.a("_appkey", "CSAndroid"); v1.a("_appkey", "CSAndroid"); String v0_1 = v1.a(); String v1_1 = tv.chushou.zues.a.b("HAL$#%^RTYDFGdktsf_)(*^%[ DISCUZ_CODE_0 ]quot; + v0_1); v2.a("_sign", v1_1); if((f.a()) && !arg8.contains("chat/get.htm")) { f.b("MyHttpMgr", "URL = " + arg8 + v0_1 + "&" + "_sign" + "=" + v1_1); } return v2.a(); }为什么说这里是加密的地方呢 不是没有道理的 稍微懂点变成的人都看得懂 这里是他登录包的一个获取 最后经过了拼接
v2.a("_appSource", com.kascend.chushou.h.b.a(v6));
v1.a("_appSource", com.kascend.chushou.h.b.a(v6));
v2.a("_appVersion", tv.chushou.zues.utils.a.c(com.kascend.chushou.b.d));
v1.a("_appVersion", tv.chushou.zues.utils.a.c(com.kascend.chushou.b.d));
v2.a("_identifier", com.kascend.chushou.h.d.a().i);
v1.a("_identifier", com.kascend.chushou.h.d.a().i);
if(!j.a(ChuShouTVApp.IMEI)) {
v2.a("_imei", ChuShouTVApp.IMEI);
v1.a("_imei", ChuShouTVApp.IMEI);
}
if(!j.a(this.i)) {
v2.a("token", this.i);
v1.a("token", this.i);
}
v2.a("_appkey", "CSAndroid");
v1.a("_appkey", "CSAndroid");
这一整串 都是设置参数名+获取对应的参数值因为都是相同的操作 就不一一介绍了
v1.a v2.a 这个a方法 就是 正则表达式吧 那么这个里面方法应该就是正则操作
重点我们分析代码为:
String v0_1 = v1.a();
String v1_1 = tv.chushou.zues.a.b("HAL$#%^RTYDFGdktsf_)(*^%$" + v0_1);
v2.a("_sign", v1_1);
String v0_1 = v1.a(); 一个文本型的 v0_1 被赋值为v1.a();
那么 v1.a(); 是什么他是在哪被赋值的呢?
注意看上面 我贴出的代码 是不是 v1.a 那么这个a 你可以 认为成增加附加数据的意思 然后这个方法里面又利用正则处理完数据 又返回来了
也就是说这个v1.a 之一在增加数据 另一方面我们从他增加的参数名来看 他很有可能是拼接的加密数据的明文
是不是呢 我们继续看下一句代码
String v1_1 = tv.chushou.zues.a.b("HAL$#%^RTYDFGdktsf_)(*^%$" + v0_1);
又声明了个 v1_1 的变量 经过 tv.chushou.zues.a.b 方法执行 赋值给了v1_1 并且传递了一个参数
传递了什么参数?
"HAL$#%^RTYDFGdktsf_)(*^%$" + v0_1 HAL$#%^RTYDFGdktsf_)(*^%$ 这个字符串加上 v0_1
然后 v2.a("_sign", v1_1); 又经过a 方法 传递进去一个参数名和参数值 参数值就是 tv.chushou.zues.a.b("HAL$#%^RTYDFGdktsf_)(*^%$" + v0_1); 这一段的执行结果
注意 参数名和我们抓到的包是一样的 那么这时候我们需要知道一点 就是这个 v0_1 最终是什么数据?它拼接后是什么样子呢
等会调试下断电 看看 现在看看 v.chushou.zues.a.b 方法
继续跟踪我们来到了这里
public static String b(String arg1) {
return a.a(arg1, new String[0]).toString();
}
一个 为b 的静态方法 传递了一个 arg1参数 又调用 a.a 方法转换成 string类型 然后返回了数据
继续跟踪 来到这里
这里有个MD5 我们从抓包就可以看出来 就是个MD5加密 没什么稀奇的 那么这里就是他的加密核心了
你可以调用jar 从这里获取他的类 包名等 等等!什么? 一个MD5 你就要调用jar? 至于么? 额...... 还真不至于
又跟到加密代码了 没需要继续分析了 这时候我们下段点 来看看这个 v1_1 是个什么东西
下断点 附加模拟器点击登录 端在这里
读取v0 的数据 输出为:
appSource=209&_appVersion=3.1.2.11628&_appkey=CSAndroid&_fromPos=7&_fromView=1&_identifier=1201806294&_imei=865166021513968&_t=1503801131981&imei=865166021513968&password=25f9e794323b453885f5181f1b624d0b&username=15845454545
这一串就是之前v1 一直在拼接的数据 那么他就是我们加密的铭文了么? 是 ! 但是还有一个别忘了 HAL$#%^RTYDFGdktsf_)(*^%$
继续单步走 发现
这时候明文 和密文 都出现了
明文:
HAL$#%^RTYDFGdktsf_)(*^%$&_appSource=209&_appVersion=3.1.2.11628&_appkey=CSAndroid&_fromPos=7&_fromView=1&_identifier=1201806294&_imei=865166021513968&_t=1503801131981&imei=865166021513968&password=25f9e794323b453885f5181f1b624d0b&username=15845454545
密文:
38f8e561f6bb7b23e64b1a6ac6db65b0
我们知道他是MD5 那么我们来试验一下吧
经过试验对比我们发现 他们是对应的 进一步确定 我们看登录包的sign
ok 完全一样 那么这个加密我们也就分析完毕了
发表评论: