一、前言
最近个人原因所以许久没更新博客,然后前几天分析了这段时间很有意思的一个软件。软件对抓包无任何检测,有也问题不大。至于有没有签名验证没测试,全程Hook和抓包所以问题依旧不大。首先我因为是要拿视频,那肯定要看从选择视频到播放视频这个过程。

二、抓包分析
首先我打开了Fiddler抓包软件(其他也可以,自行选择)

Fiddler

我这里就不说如何配置Fiddler了,没安装和配置的自行百度。

直接进行抓包拿到关键地址,很明显可以看到一些东西,因为研究协议比较熟练。我首先先看数据

抓包过程

URL: https://cchzkj.cn/media/240/118210.m3u8?token=exxxxxxX2lkIjoyNDA4xxxxxxxxx3fQ.489bd2xxxxxxx9744fee7.xxxxxx
method: GET
lang: cn
version: 2.0.5
platform: Android
time: 1593769299
userid: bIgUbAFyB7cB
hash: 7e77051e903ea4ca8a1b220da3596eee
usertype: 756c436395924212c50e22900a5ca40f
img: https://encimga.qhhry.cn
3b273fb0da3f482d77f72a93150fb6f3: d2d3d377484aa72b8988d8e177b5046c
Host: cchzkj.cn
Connection: Keep-Alive
Accept-Encoding: gzip
User-Agent: okhttp/3.12.1

如果你是新手可能还在沉浸这个url里面的参数是如何来的,其实这个可以放一边。我们应该先看看请求头。根据抓包判断lang version platform time(时间戳-也算固定嘛) img Host 非固定且加密过的 userid hash usertype。总结完需要分析的就可以立马看apk了。

三、逆向软件
这里也有好多软件推荐,比如懒惰选手可以使用Androidkiller,动手力强的的可以直接用Apktool.jar。我这里就直接使用Androidkiller。

Androidkiller

我这里就直接反编译好了,然后打开jd-gui分析软件吧。(Androidkiller自带个人感觉不好用,Java还原度没jd-gui高)

jd-gui

以前在学校可能很多学编程的会用a , b , c这种来命名变量和类。崽种,这盛世如你所愿。好家伙重要部分全是a b c。(这种是经过混淆的,不是开发者源代码)。混淆了也要逆向啊,毕竟饭还是要恰的。

先搜索上面我说的这几个关键字吧

搜索关键字

这里先看看搜索的第一条

d.t.a.g.s类

基本看到存到HashMap hashMap.put("userid", str2);,基本确定上面有这个值。不急先看看再说。
先看userid hashMap.put("userid", str4);。str4往上面看看。

userid加密过程

int i = c.a((d)str4, (d)str3);
String str = e.a(i);
public static String a(int paramInt) {
    Random random = new Random();
    StringBuffer stringBuffer = new StringBuffer();
    for (byte b = 0; b < paramInt; b++)stringBuffer.append("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789".charAt(random.nextInt(62))); 
    return stringBuffer.toString();
}

经过分析只需要调用a方法传6-18之间都可以。
userid就分析完毕

再看看hash,这个方法需要几个值,这里先不看直接先看处理函数。

stringBuilder.append((String)illegalArgumentException);
stringBuilder.append(str1);
stringBuilder.append(str2);
stringBuilder.append(str4);
stringBuilder.append(str3);
str3 = e.j(stringBuilder.toString());

这里可以看到e.j是加密方法。所以继续看上面的值,看半天其他都解决了,就str3 = CipherClient.apiHashKey();

public static final String apiHashKey() {
    return CipherCore.getString("d708e111b5db90af74ef84ff4d5e647b");
}

方法

用了native,欧玛噶,众所周知so文件只能反汇编,拿到的还是伪代码。注意了哈,我们可以看到这个方法传的是固定值,那我大胆猜测返回值可能也是固定值。实验是检验真理的唯一标准。

直接手撸XP插件,具体创建项目我就不多逼逼了。

XposedHelpers.findAndHookMethod("net.idik.lib.cipher.so", lpparam.classLoader, "apiHashKey", new XC_MethodHook() {
    @Override
        protected void afterHookedMethod(MethodHookParam param) throws Throwable {
            super.afterHookedMethod(param);
            Log.i("返回值", (String) param.getResult());
        }
    });

插件开发

最后打印结果果然是固定的。666wInteriscommingyoUshouldNotpassmotherfuckeR=
另一个就更简单了,usertype直接就是前面几个参数。但是也有一个变化的值

这个值是通过下面这个方法拿到返回值。

看到PackageManager我猜测可能就是关于apk的一些信息,比如签名。
这里我也是直接使用hook hook软件。

XposedHelpers.findAndHookMethod("com.palipali.other", lpparam.classLoader, "d", new 
XC_MethodHook() {
    @Override
        protected void afterHookedMethod(MethodHookParam param) throws Throwable {
            super.afterHookedMethod(param);
            Log.i("pakageManager返回值", (String) param.getResult());
        }
    });

结果:uB2wmivAQ02bDpzB6/QKEPkk4yI=

拿到这里基本就基本结束了各种参数。

未完待续
因为篇幅过长,然后我就分为了上下篇。敬请期待!!!