介绍:

**本次剖析抖音版本:14.1    x-gorgon版本:0404

抖音作为目前流量最大、日沉闷最高的平台,目前也有很多不同行业的人对它进行逆向剖析钻研,在抓包剖析过程中,抖音的通信会波及到一个叫x-gorgon的签名,该签名是发送数据申请必不可少的根底参数,本次我就带大家剖析下这个参数。

小编自恋一下,逆向大神 属于逆向爱好者,如须要交换技术或者算法请在评论区留下邮箱,或者分割我邮箱1610199291@qq.com

抓包

        假如咱们的业务须要爬虫获取抖音的热门视频列表,那么咱们先通过抓包来定位到具体的接口,这里我抉择应用charles工具进行抓包,具体配置https办法能够百度的办法。安卓手机抓包最好应用6.0以下的!

  通过抓包发现接口是来自: https://aweme.snssdk.com/aweme/v2/feed/ 前面跟了很长的参数,具体字面意思剖析预计是手机的型号以及抖音本人生成的一些信息,咱们发现其返回的是protobuf格局,charles曾经帮咱们解析好了,那么咱们编写python3脚本结构一个跟他一样的申请进行尝试。

 咱们发现可能失常的返回数据,然而咱们看到他的header除了 x-gorgon和x-tt-trace-id以外,其余的都很好了解,咱们会发现,如果咱们扭转了URL的参数,然而header内容得不到对应的批改,就会返回不到数据,如下所示:

{

  • status_code: 2154,
  • aweme_list: [ ],
  • has_more: 1,
  • min_cursor: 0,
  • max_cursor: 0

}

剖析

        那么咱们就可能更加确信header里的x-gorgon对它进行了一次签名,所以咱们间接jadx上手浏览一波反编译后的代码,这里我间接搜寻了x-gorgon关键字,列出了以下后果:

这里我抉择了hashMap.put("X-Gorgon", a3);这一行,跳转进去咱们来剖析一下它的代码

        这里咱们看到有一个它的值是来自a3,a3则是通过String a3 = a.a(com.ss.sys.ces.a.leviathan(i, currentTimeMillis, a.a(a2 + str4 + str5 + str6)));这行代码进行获取到的后果,咱们看到它传了4个参数,咱们来认真看一下这4个参数具体都是什么内容:

        a2起源:

            String b2 = tt.d(str);

            d.a(b2);

        str它就是该办法传进来的参数,咱们前面能够通过hook形式来获取它的具体内容,而它会执行tt.d()、d.a() 进行2次操作,咱们对其tt.d()跟进去

        

        咱们看到它对这个字符串进行了取 ? 和 # 两头值,狐疑是url,如果是url证实它只是取了url前面的参数,那么持续看它的下一个办法:d.a() 

        

        咱们看到这里就是进行了MD5签名取值,那么a2剖析到此结束,咱们持续剖析第2个参数

        str4起源:

这里非常简单,它就是枚举传进来的第二个参数map,判断如果有X-SS-STUB这个值的话就获取,反之则填充32个0,那么咱们抓包发现并没有X-SS-STUB这个参数,实际上如果咱们的包是POST的话它就会有,实际上它就是POST数据的一个MD5签名值。

        str5起源:

            str5也非常简单,也是枚举map外面有没有COOKIE,如果有就把COOKIE进行MD5,那么该参数也到此结束了

        str6起源:

1

2

3

4

5

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是以后都十位工夫戳。

    

        最初把计算好都byteArray通过位移转换成了string类型,并put到map外面,那么咱们也分明到看到,k-khronos也就是刚刚到currentTimeMillis工夫戳了。咱们发现因为om.ss.sys.ces.a.leviathan是在so层到libcms.so文件,并且外面有大量到混同就没有再度剖析。咱们能够通过xposed或者unidbg到办法进行调用。

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.jsJava.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是不是返回的值。

总结

        以上就是对抖音对一个简略的x-gorgon的剖析笔记过程,心愿可能有所帮忙,也可能对本身的产品安全方面进行一个参考借鉴。

免责申明

  1. 请勿应用本服务于商用
  2. 请勿应用本服务大量抓取
  3. 若因应用本服务与抖音官网造成不必要的纠纷,自己盖不负责
  4. 自己纯正技术喜好,若进犯抖音贵公司的权利,请告知