某音最新X-Gorgon 註冊設備 xlog ascp mas等參數算法分析 2020-04-03逆向記錄

小編自戀一下,逆向大神 屬於逆向愛好者,如需要交流技術請在評論區留下郵箱,或者聯繫我郵箱[email protected]

某音版本里面加了好幾個算法,有as,cp(早期就這兩個),後面又加了mas,X-Gorgon,X-SS-STUB,X-Khronos算法,很多關鍵key之間有相互關聯,只要有一個環節算錯了,包括設備頻繁使用被封,就會請求不到數據。目前版本的抖音加了很多的驗證,及代碼混淆,難度偏大。

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

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

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

本人經過了幾個通宵,逆向出了04版本的X-Gorgon,現在說說抖音各個參數的作用吧!

X-Gorgon

生成方式:對cookie,請求的url 截取參數,拼接成字符串,然後經過下列方法進行加密

 

拿到加密的str以後轉成byte數組,獲取當前時間戳進行加密(中間有3個方法是核心這裏就不公開了)最後計算出X-Gorgon

 

X-SS-STUB是post請求時body部分的md5值,但是在爲空的情況下,有時候不參與加密,有時候參與加密,具體接口需要具體分析。

X-Khronos比較簡單就是一個unix時間戳

 

如下是請求抖音的視頻詳情接口demo

 

截圖

關於抖音註冊設備算法 以及xlog算法等等會在下次講解

 

xlog的做法

GET https://xlog.snssdk.com/v2/s?os=0&ver=0.6.10.25.17-IH-Do&m=2&app_ver=9.9.0&region=zh_CN&aid=1128&did=19671560880 HTTP/1.1
Host: xlog.snssdk.com
Connection: keep-alive
Cookie: sessionid=
X-SS-REQ-TICKET: 1582898273153
sdk-version: 1
x-tt-trace-id: 00-8c16dd31094948432b05140591f60468-8c16dd3109494843-01
User-Agent: com.ss.android.ugc.aweme/990 (Linux; U; Android 5.1.1; zh_CN; YQ601; Build/LMY47V; Cronet/77.0.3844.0)
Accept-Encoding: gzip, deflate
X-Gorgon: 0401d012000449c94d909ca41fa968eb6a8ab9ea7528d54eadae
X-Khronos: 1582898273

首先調用解密方法,將02開頭的 byte[]數組進行解密,解密後是一個json字符串,然後再調用xlog加密接口進行加密,然後提交,返回的依然是一個02開頭的,然後再進行解密,就可以看到結果了,
再次之前還有一個 sdfp包,也是需要用到這個加密解密的 可以參考文檔


import android.text.TextUtils;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public final class ByteUtil {

  private static final String NULL_MD5_STRING = "00000000000000000000000000000000";

  public static byte[] b(String paramString) {
    int i = paramString.length();
    byte[] arrayOfByte = new byte[i / 2];
    for (byte b = 0; b < i; b += 2)
      arrayOfByte[b / 2] = (byte)((Character.digit(paramString.charAt(b), 16) << 4) + Character
          .digit(paramString.charAt(b + 1), 16));
    return arrayOfByte;
  }

  public static String ByteToStr(byte[] bArr) {

    int i = 0;

    char[] toCharArray = "0123456789abcdef".toCharArray();
    char[] cArr = new char[(bArr.length * 2)];
    while (i < bArr.length) {
      int i2 = bArr[i] & 255;
      int i3 = i * 2;
      cArr[i3] = toCharArray[i2 >>> 4];
      cArr[i3 + 1] = toCharArray[i2 & 15];
      i++;
    }
    return new String(cArr);
  }

  public static String getXGon(String url, String stub, String ck, String sessionid){
    StringBuilder sb=new StringBuilder();
    if (TextUtils.isEmpty(url)){
      sb.append(NULL_MD5_STRING);
    }else {
      sb.append(encryption(url).toLowerCase());
    }

    if (TextUtils.isEmpty(stub)){
      sb.append(NULL_MD5_STRING);
    }else {
      sb.append(stub);
    }

    if (TextUtils.isEmpty(ck)){
      sb.append(NULL_MD5_STRING);
    }else {
      sb.append(encryption(ck).toLowerCase());
    }

    if (TextUtils.isEmpty(sessionid)){
      sb.append(NULL_MD5_STRING);
    }else {
      sb.append(encryption(sessionid).toLowerCase());
    }
    return sb.toString();
  }

  public static String encryption(String str) {
    String re_md5=null;
    try {
      MessageDigest md = MessageDigest.getInstance("MD5");
      md.update(str.getBytes());
      byte b[] = md.digest();

      int i;

      StringBuffer buf = new StringBuffer("");
      for (int offset = 0; offset < b.length; offset++) {
        i = b[offset];
        if (i < 0)
          i += 256;
        if (i < 16)
          buf.append("0");
        buf.append(Integer.toHexString(i));
      }

      re_md5 = buf.toString();

    } catch (NoSuchAlgorithmException e) {
      e.printStackTrace();
    }
    return re_md5.toUpperCase();
  }

  public static byte[] StrToByte(String str) {
    String str2 = str;
    Object[] objArr = new Object[1];
    int i = 0;
    objArr[0] = str2;

    int length = str.length();
    byte[] bArr = new byte[(length / 2)];
    while (i < length) {
      bArr[i / 2] = (byte) ((Character.digit(str2.charAt(i), 16) << 4) + Character
          .digit(str2.charAt(i + 1), 16));
      i += 2;
    }
    return bArr;
  }
}

免責聲明

  1. 請勿使用本服務於商用
  2. 請勿使用本服務大量抓取
  3. 若因使用本服務與抖音官方造成不必要的糾紛,本人蓋不負責
  4. 本人純粹技術愛好,若侵犯抖音貴公司的權益,請告知
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章