抖音 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之間有相互關聯,只要有一個環節算錯了,就會請求不到數據。目前版本的抖音加了不少的驗證,及代碼混淆,難度偏大。android

初探

抖音的簽名算法在libcms.so中,在JNI_Onload中動態註冊jni函數。算法

算法用ollvm混淆了,主要是流程平坦化,流程混淆和運算替換安全

主要用到一些逆向工具IDA,Xposed框架cookie

研究

8.0版本以後的算法主要是X-Gorgon和X-SS-STUB.以後通過抓包抖音接口,查看Java層,so層代碼,分析以下原理。session

  • 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.整理分析流程post

 

 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.結果排序this

a1d5b43se234dccea7  456dcd5s2320cf3e1  &cp=456fcd5s2320cfs3e1&as=a1d5b43se234dccea7  拼接完成後就能夠請求了

後期版本添加了mas算法和最新的X-gorgon算法,目前最新系列版本算法若是須要了解的話能夠交流。

3.流程詳述

image.png

那麼咱們就可以更加確信header裏的x-gorgon對它進行了一次簽名,因此咱們直接jadx上手閱讀一波反編譯後的代碼,這裏我直接搜索了x-gorgon關鍵字,列出瞭如下結果:

那麼咱們就可以更加確信header裏的x-gorgon對它進行了一次簽名,因此咱們直接jadx上手閱讀一波反編譯後的代碼,這裏我直接搜索了x-gorgon關鍵字,列出瞭如下結果:

image

這裏我選擇了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()跟進去

       image.png

 

       咱們看到它對這個字符串進行了取 ? 和 # 中間值,懷疑是url,若是是url證實它只是取了url後面的參數,那麼繼續看它的下一個方法:d.a()

       咱們看到這裏就是進行了MD5簽名取值,那麼a2分析到此結束,咱們繼續分析第2個參數

image.png

 

       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是當前都十位時間戳。

   image.png

       最後把計算好都byteArray通過位移轉換成了string類型,並put到map裏面,那麼咱們也清楚到看到,k-khronos也就是剛剛到currentTimeMillis時間戳了。咱們發現因爲om.ss.sys.ces.a.leviathan是在so層到libcms.so文件,而且裏面有大量到混淆就沒有再度分析。咱們能夠經過xposed或者unidbg到方法進行調用。

image.png

0x02:參數確認

        這裏咱們分析完了它算法到具體參數構造完成後,咱們還須要確認它傳到參數是不是咱們所聯想到,那麼這裏咱們發現因爲它這個方法是一個callback,咱們往前跟一下,尋找一個合適到hook點,使用frida進行hook

       image.png

       這裏我對它進行了調用查找,看到只有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是否是返回的值。

image

image

3.總結:

以上就是對抖音對一個簡單的x-gorgon的分析筆記過程,但願可以有所幫助,也可以對自身的產品安全方面進行一個參考借鑑。

 

 


TiToData:專業的短視頻數據接口服務平臺。

更多信息請聯繫: TiToData

 

覆蓋主流平臺:抖音,快手,小紅書,TikTok,Zynn,YouTube,1688,拼多多,淘寶,美團,餓了麼,淘寶,微博

相關文章
相關標籤/搜索