逆向分析某X视频APP通信协议

声明:破解他人的软件是违法行为,本文的逆向工程仅供学习研究用途。

最近朋友间流行一个国产的X视频App,其特点是使用国内网络便可以自由地观看视频。但是支持国内网络环境的在线服务往往会承担被审查的风险,因此有点好奇他的视频存储和获取是怎么实现的,于是便对其APP客户端进行了逆向分析。本文出发点仅仅是技术学习,因此所有与该App有关的信息都将打码。在下文中将称该App为JK,其对应的几个关键api接口部分字符使用x替换。

  • 目标平台:Android
  • 分析对象:JK.apk,Version=3.13.2
  • 分析工具:Charles,Jadx,IDA Pro,Frida

TL;DR 最终对JK App的视频请求协议逆向分析结果如下图所示:


APP视频获取协议逆向结果

0x01 抓包分析

在逆向之前我们先对其通信数据进行抓包,观察JK App的行为,如下图:


使用Charles抓包分析

首先定位到包含视频文件的http请求,可以看出最终的视频是以m3u8格式进行播放的。观察获取m3u8的http请求,对其结构进行修改并反复实验重放后可以确定其中起到关键作用的部分为

  1. avid开头的字符串
  2. 时间戳t以及
  3. 请求参数k

只要我们成功地获取到或者构造出以上三个部分,便可以得到m3u8视频了。经过实验我们甚至可以直接在浏览器打开该连接,然后使用chrome的HLS等m3u8播放插件播放,或者下载到本地用vlc播放。首先从avid入手,搜索该字符串,可以其包含在如下请求的Response Body中:

对该http请求体进行修改和重放,多次试验后确定起关键作用的部分为Header中的Bearer Token。我们继续使用全局搜索往前追溯token的来源,发现token来自于如下请求的Response Body中:

同样地,对该请求进行修改和重放,多次实验后确定其参数中起关键作用的是uuid后跟的字符串(
“`9e…“`)和key=后面的参数(“`5072..“`),而且就暂时看来这两个参数在每次重启app后的抓包请求中都不变。再往前找抓包记录就没有其他与这两个参数有关的信息了,只能通过直接逆向apk来分析。

0x02 逆向&Hook

根据抓包分析的结果,我们现在的目标很明确,首先要找出uuid后跟的字符串与参数key的生成规则。使用Android package info工具查壳,发现该app并没有加壳,于是直接使用Jadx打开apk,进行java反编译。使用adb连接安卓手机进行usb调试,打开app任意点开一个视频,使用adb打印当前的函数调用栈,可以很快的定位到该app的
“`MainActivity“`的位置在“`package i999.tv“`内。在Jadx内全局搜索uuid,并没有发现有用的线索,猜测其生成函数位于native层中。根据经验,在Jadx中全局搜索”crypt”,可以发现在“`i999.tv.MVVM.API“`包中有一个名为 “`videoCrypt“` 的函数,怀疑其与视频加密相关。查找到其声明可以发现为native层函数:

不仅如此,还同时发现了另外两个函数
“`getToken“`和“`getUrl“`。结合之前抓包分析的结果,这三个函数便成为了下一阶段的重点分析对象。

将apk文件后缀名改为zip然后解压,进入其中的lib文件夹,选择任意一种自己熟悉的架构对应的nativelib进行分析,本文这里选择了
“`arm64-v8a“`架构。使用IDA打开该文件夹下的“`libnative-lib.so“`文件,可以发现也没有进行加密,存在大量的函数名信息:

非常有趣的一点是,这里看到一个函数名为
“`findHookAppName“`,点进去后可以发现,这是一个检测当前app有没有被hook的函数,主要是通过查找安卓系统当前运行的进程中有无“`xposed“`和“`substrate“`来做的。如果有的话会发送给服务器一个”Crack”的字符串。。。感觉是开发者为了防止破解设下的监控,只不过本文意图只在于协议分析,对破解不感兴趣(笑)。

回归正题,我们在函数列表中搜索之前在Jadx里发现的三个函数,发现并没有对应的函数名。猜测这三个native函数使用了动态注册方式,在IDA中Shift+F12搜索字符串,发现了三个函数名的字符串所在位置:

按X查找交叉引用,定位到数据段信息:

根据动态注册JNI函数的机制可以知道,三个java中调用的native函数对应的库函数就是上图中的三个由下划线组成的函数了,接下来就是各个击破的环节。首先为了我们审计的方便,先按N把三个下划线函数名改成对应的真实名字:
“`getToken“` 、“`getUrl“` 和 “`videoCrypt“`。首先进入“`getToken“`函数:

可以看到这里也有一个防破解的检测,似乎是检查apk文件中某个数据(也就是参数a3)的sha1值。然后后面的部分就是把参数a4作为字符串接到了”Bearer”的后面(第69-70行)。根据JNI函数的特点,第一个参数是_JNIEnv表示JNI环境,第二个是jclass表示一个类的引用,因此第三个和第四个函数才是我们在Java中调用时的真正参数。回到Jadx中查找getToken的用例,重点关注第二个参数,发现如下调用:

我们一路查找用例过去,发现对于getToken真正的调用在BG8Application.m6884h中发生(m6884h是Jadx反混淆自动生成的方法名)。而BG8Application.m6884h的调用发生在对如下代码中:

根据该类的信息可以知道这里的调用就是从ResponseBody中取出了一个AssistPushConsts.MSG_TYPE_TOKEN对应的字段,而经过查找AssistPushConsts.MSG_TYPE_TOKEN=”token”。所以nativelib中的getToken其实就是把抓包分析中服务器返回来的token读出来然后加上Bearer而已。(这也需要写一个native函数来完成???)

因此对于getToken函数的分析并没有得到很多有用的信息,下一步看getUrl函数,按F5反编译,发现其中包含了”key=”、”?model=”等关键信息:

回忆之前抓包分析的结果,可以确定getUrl就是构造获取token请求的函数。按照之前分析的结果,我们需要重点关注uuid后跟的字符串(
“`9e…“`)和key=后面的参数(“`5072..“`)的构造方式。从反编译代码中151行左右的部分可知uuid后出现的串就是我们当前设备的android_id。根据162行的strcat推断key应该是157行getHashKey的结果,但是进入getHashkey之后却发现参数有三个,而上图中可以看到IDA 7.5只识别出了一个。猜测跟157行的前面几行没有正确反编译有关,首先手动重新load “`jni.h“`文件,重新将“`a1“`参数转换为“`struct JNIEnv_*“`类型,然后手动将153-156行的函数调用Force Call Type,经过修复后的反编译代码如下:

可知getHashKey的主要参数是变量v26,而由上面的代码可知v26便是调用接口获取到的android_id。接下来进入getHashKey。F5反编译可以发现如下代码:

由以上代码可知,该函数的作用就是将android_id两边加上两个字符串变成FokU2020avnightANDROID_IDavnightFokU2020,然后再传入my_sha256。进入my_sha256可以发现就是普通的sha256,我们可以对抓包获取到的url进行计算验证:

可以看到我们构造的参数成功获取到了token,证明了上述分析。现在我们已经确定了token的获取方式,也就可以获取到avid所在的JSON响应,下一步需要确定获取m3u8地址的请求的构造方式。

经过在Jadx和IDA之间来回搜索了几番之后,发现本地似乎根本没有构造m3u8的代码。此时重新查看抓包结果,发现在请求m3u8之前有一个响应返回结果是一大串很长的base64,而且解码之后发现是加密过的数据:

如果本地并没有m3u8的构造函数的话,这一串加密数据很可能就包含了视频真实地址信息。回忆之前和getToken、getUrl并列的第三个函数videoCrypt。一开始我以为这个函数是对视频本身进行解密的,后来使用frida hook之后发现对于每个视频它都只会运行一次,而且必定在前述加密的response返回之后运行,故而察觉这个函数可能是对这个加密响应进行解密的函数。使用frida对
“`javax.crypto.spec.SecretKeySpec“`的构造函数进行hook,从而打印出到app运行中所有用到过的密钥

Java.perform(function () {
    var SecretKeySpec = Java.use('javax.crypto.spec.SecretKeySpec');
    SecretKeySpec.$init.overload('[B', 'java.lang.String').implementation = function(p0, p1) {
        console.log('SecretKeySpec.$init("' + bytes2hex(p0) + '", "' + p1 + '")');
        return this.$init(p0, p1);
    };
});
function bytes2hex(array) {
    var result = '';
    console.log('len = ' + array.length);
    for(var i = 0; i < array.length; ++i)
        result += ('0' + (array[i] & 0xFF).toString(16)).slice(-2);
    return result;
}

发现在我们每次点开一个视频之后都会输出如下结果:

SecretKeySpec.$init("3032633365306166373534633038323638653961666336323836653136626433", "AES")
len = 32

看来对于该响应体的内容JK app使用了AES-256进行解密。进入videoCrypt,发现其同样检测了class.dex有没有被修改。。与之前一样是发送”Crack”信息到服务器,看来开发人员还是非常关心程序破解问题的。

继续进入decrypt函数,其主要内容可以大致分为三部分,第一部分为对输入的a4参数调用
“`getDataEncrypt“`函数进行加密,然后与”avnight”进行拼接并求MD5:

而getDataEncrypt函数仅仅是将参数a4转换为了“`yyyyMMdd-HHmmss“`格式,看来a4参数就是加密响应的header中的时间戳字段了;

在得到MD5之后,decrypt进行了如下的运算:

这一部分我不清楚是开发人员有意混淆还是编译器优化时自动混淆的,其实简单分析一下就可以发现是一个将MD5的16字节输出转化为一个Hex字符串的snippet,这样的目的应该是让16字节输出的MD5变成一个32字节的字符串,从而可以用作AES-256的密钥。最后一段的内容直接验证了我们的猜想,这里使用md5的HexString作为32字节的密钥,解密模式为“`AES-256-CBC“`,填充模式为“`AES/CBC/PKCS7Padding“`,初始向量(IV)为对“`yyyyMMdd-HHmmss“`格式的时间戳调用“`getIV“`的返回值,且数据在解密前先经过了一次base64解码。

进入“`getIV“`函数可以看到仅仅是简单地在“`yyyyMMdd-HHmmss“`格式的时间戳后面加上了一个’#’。到这里我们所有的解密流程就分析完了,下一步是编写代码复现解密过程。

0x03 编程验证

基于前一节的分析结果,编写解密代码对前述抓包过程中遇到的加密数据包进行解密,java代码如下:

package com.company;

import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.io.UnsupportedEncodingException;
import java.nio.charset.StandardCharsets;
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Base64;

public class Main {
    private static final char hexDigits[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};

    public static String decodeBase64(String targetString) {
        Base64.Decoder decoder_Default = Base64.getDecoder();
        String result = null;
        try {
            byte[] result_temp = decoder_Default.decode(targetString.getBytes("utf-8"));
            result = new String(result_temp);
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        return result;
    }

    public static byte[] sign_MD5(String targetString) {
        byte[] result = null;
        try {
            MessageDigest generator_MD5 = MessageDigest.getInstance("MD5");
            generator_MD5.update(targetString.getBytes("utf-8"));
            result = generator_MD5.digest();
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
        return result;
    }

    private static String byteToHexString(byte[] target) {
        String result = null;
        int dataLength = target.length;
        char resultTemp[] = new char[dataLength * 2];
        try {
            int k = 0;
            for (int i = 0; i < dataLength; i++) {
                byte byte0 = target[i];
                resultTemp[k++] = hexDigits[byte0 >>> 4 & 0xf];
                resultTemp[k++] = hexDigits[byte0 & 0xf];
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        result = new String(resultTemp);
        return result;
    }

    public static String decryptAES(String raw_content, String key, String IV_STRING)
            throws InvalidKeyException, NoSuchAlgorithmException,
            NoSuchPaddingException, UnsupportedEncodingException,
            InvalidAlgorithmParameterException, IllegalBlockSizeException, BadPaddingException {


        byte[] byteContent=Base64.getMimeDecoder().decode(raw_content);

        byte[] enCodeFormat = key.getBytes(StandardCharsets.US_ASCII);
        SecretKeySpec secretKeySpec = new SecretKeySpec(enCodeFormat, "AES");

        byte[] initParam = IV_STRING.getBytes(StandardCharsets.US_ASCII);
        IvParameterSpec ivParameterSpec = new IvParameterSpec(initParam);

        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
        cipher.init(Cipher.DECRYPT_MODE, secretKeySpec, ivParameterSpec);

        byte[] decryptedBytes = cipher.doFinal(byteContent);
        String ret = new String(decryptedBytes, StandardCharsets.UTF_8);
        return ret;
    }

    public static void main(String[] args) throws NoSuchPaddingException, BadPaddingException, InvalidAlgorithmParameterException, NoSuchAlgorithmException, IllegalBlockSizeException, UnsupportedEncodingException, InvalidKeyException {
        String iv_str = "20210116-185205#";
        String targetString="avnight20210116-185205";
        String raw_content="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";
        // MD5
        byte [] md5_bytes=sign_MD5(targetString);
        String md5_str=byteToHexString(md5_bytes);
        System.out.println(md5_str);
        // Decryption
        String ret=decryptAES(raw_content,md5_str,iv_str);
        System.out.println(ret);
    }
}

运行后结果如下:

可以发现解密结果中便包含了最终的m3u8地址。由于我们仅仅对其视频获取协议感兴趣,本次的逆向分析到这里就结束了。可以看出来,该app的安全防护还是有待改进的,认证加密机制有待加强。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

此站点使用 Akismet 来减少垃圾评论。了解我们如何处理您的评论数据