首页/安卓逆向/ 安卓逆向触手TV安卓APP sign加密算法分析

安卓逆向触手TV安卓APP sign加密算法分析

作者:神奇   分类:安卓逆向   时间:2018-04-30 19:11:31  标签:


废话不多少 先上抓包数据:
 
登录数据:
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  完全一样 那么这个加密我们也就分析完毕了


温馨提示如有转载或引用以上内容之必要,敬请将本文链接作为出处标注,谢谢合作!

评论:

发表评论:

code