抖音 xgorgon 0408 数据加密算法 hook 逆向分析记录,抖音接口,抖音API

抖音xgorgon算法用ollvm混淆了,主要是流程平坦化,流程混淆和运算替换。
X-Gorgon是对cookie,X-SS-STUB,X-Khronos,Url进行混合加密之后的参数。这里也区分情况,有些接口只有url和X-Khronos参与接口加密,有些是url,X-Khronos,X-SS-STUB参与接口加密,有些则是所有都进行接口加密。

 

概述

抖音版本里面加了好几个算法,有as,cp(早期就这两个),mas,X-Gorgon,X-SS-STUB,X-Khronos算法,很多关键key之间有相互关联,只要有一个环节算错了,就会请求不到数据。目前版本的抖音加了很多的验证,及代码混淆,难度偏大。

初探

抖音的签名算法在libcms.so中,在JNI_Onload中动态注册jni函数。
算法用ollvm混淆了,主要是流程平坦化,流程混淆和运算替换
主要用到一些逆向工具IDA,Xposed框架

研究

8.0版本之后的算法主要是X-Gorgon和X-SS-STUB.之后经过抓包抖音接口,查看Java层,so层代码,分析如下原理。

  • X-SS-STUB是post请求时body部分的md5值,但是在为空的情况下,有时候不参与加密,有时候参与加密,具体接口需要具体分析
  • X-Khronos比较简单就是一个unix时间戳
  • X-Gorgon是对cookie,X-SS-STUB,X-Khronos,Url进行混合加密之后的参数。这里也区分情况,有些接口只有url和X-Khronos参与接口加密,有些是url,X-Khronos,X-SS-STUB参与接口加密,有些则是所有都进行接口加密。具体接口具体分析

分析

今天有空分享一下抖音的加密算法,作为拥有庞大用户量的APP,其通信协议加密的强度肯定是不弱的,关键算法被VM,只能动态分析去理解。我们通过抓包分析,请求的URL上带有AS、CP两个加密字段,这两个字段是早期版本算法,后又陆续添加了MAS、X-GORGON算法。我们今天先对AS、CP两个字段进行分析,这个只能通过动态调试去跟踪加密过程。
首先我们通过工具调试定位到函数

- [IESAntiSpam testForAlert:msg:]

定位的详细过程忽略……,进入继续调试后发现调用SUB_102E3345函数进行加密排序
1.整理分析流程

 
1.时间戳转十六进制
 
2.将时间戳排序俩次,
  a1 v3 是排序key
  sprintf(byte_102323F30, "%08x", a1);
  sprintf(byte_102323F3A, "%08x", v3);
 
3.将url参数用MD5加密一次或俩次根据时间戳&运算
 
4.将第一次排序结果写入前16位地址加一写入(从1插入),隔一位插入,前边拼a1
 
5.将第二次排序结果写入后16位(从0插入)后边拼e1
 

2.结果排序

a1d5b43se234dccea7
 
456dcd5s2320cf3e1
 
&cp=456fcd5s2320cfs3e1&as=a1d5b43se234dccea7
 
拼接完成后就可以请求了

后期版本添加了mas算法和最新的X-gorgon算法,目前最新系列版本算法如果需要了解的话可以交流。
3.流程详述



        str4来源:
      这里非常简单,它就是枚举传进来的第二个参数map,判断如果有X-SS-STUB这个值的话就获取,反之则填充32个0,那么我们抓包发现并没有X-SS-STUB这个参数,实际上如果我们的包是POST的话它就会有,实际上它就是POST数据的一个MD5签名值。
        str5来源:
str5也非常简单,也是枚举map里面有没有COOKIE,如果有就把COOKIE进行MD5,那么该参数也到此结束了
        str6来源:

String c2 = tt.e(str3);
if (c2 != null && c2.length() > 0) {
     str6 = d.a(c2);
     StcSDKFactory.getInstance().setSession(c2);
}

        这里我们记得str3是cookie,它执行了tt.e(str3) 方法获取一个返回值,如果它不是空同样给这个返回值md5,那么我们跟进去看一下它是做了什么处理:
        这里我们看到它是枚举了cookie里面有没有sessionid这个值,如果有就取出来,那么str6到此结束
        参数整理:
            a2 = md5(url) 疑似对网址的参数进行md5
            str4 = x-ss-stub,只有post时才有效,否则是32个0
            str5 = md5(cookie)  对cookie进行md5
            str6 = md5(cookie['sessionid'])    对cookie里面对sessionid进行md5,否则也是32个0
        我们整理完了这4条参数后,继续分析,它将这4个参数进行了字符串合并,接着执行 a.a(a2+str4+str5+str6),我们跟进去看看里面做了什么操作
        我们看到它这里循环了总长度/2次,每次都是把  str[i] 转换成十进制左移4,然后加上 str[i+1] 都一个简单运算,并返回结果,也就是本来是4个32位(128位)然后经过加密后缩短成了64位长度。最后它执行了com.ss.sys.ces.a.leviathan(i, currentTimeMillis, a.a(a2 + str4 + str5 + str6))进行计算,我们看到它还传了2个参数,i和currentTimeMillis,我们往前可以看到 i是-1,而currentTimeMillis是当前都十位时间戳。
   

0x02:参数确认

        这里我们分析完了它算法到具体参数构造完成后,我们还需要确认它传到参数是否是我们所联想到,那么这里我们发现由于它这个方法是一个callback,我们往前跟一下,寻找一个合适到hook点,使用frida进行hook
       
        这里我对它进行了调用查找,看到只有1个地方,我们跟进去看看,跟进去之后它就是以下内容,就只是一个简单对赋值给sAddSecurityFactorProcessCallback,我们在对它进行调用查找,看看是什么地方对它进行对调用。

 public static void setAddSecurityFactorProcessCallback(a aVar) {
        sAddSecurityFactorProcessCallback = aVar;
    }    
 

 
    这里我们看到它从这里取的回调指针变量,然后判断如果不为null则执行,那么我们就可以直接hook这个方法:tryAddSecurityFactor$___twin___,这里我的hook代码也就比较简单,直接输出它传进去的map和str的值以及返回的map进行确认。

//frida -U com.ss.android.ugc.aweme -l test.js
Java.perform(function() {
    var NetworkParams = Java.use("com.bytedance.frameworks.baselib.network.http.NetworkParams");
    NetworkParams['tryAddSecurityFactor$___twin___'].implementation = function(str,map){
    var keyset = map.keySet();
    var it = keyset.iterator();
    console.log("str:\t"+str)
    while(it.hasNext()){
        var keystr = it.next().toString();
        var valuestr = map.get(keystr).toString()
        console.log("map:\t"+keystr+"\t"+valuestr)
    }
    var ret
    ret = this.tryAddSecurityFactor$___twin___(str,map);
    var keyset = ret.keySet();
    var it = keyset.iterator();
    while(it.hasNext()){
        var keystr = it.next().toString();
        var valuestr = ret.get(keystr).toString()
        console.log("ret map:\t"+keystr+"\t"+valuestr)
    }
    return ret;
    }
});
 

绿色部分就是str参数1的值,黄色则是map,蓝色则是返回的map,我们看下charles的这个包的header里的xgorgon是不是返回的值。

3.总结:

以上就是对抖音对一个简单的x-gorgon的分析笔记过程,希望能够有所帮助,也能够对自身的产品安全方面进行一个参考借鉴。



TiToData:专业的短视频数据接口服务平台。
更多信息请联系: TiToData


覆盖主流平台:抖音,快手,小红书,TikTok,Zynn,YouTube,1688,拼多多,淘宝,美团,饿了么,淘宝,微博

你可能感兴趣的:(网页爬虫,大数据,api)