抖音協議算法生成,調用so文件生成xgorgon

目前不少 App 的加密簽名算法都在so文件中,強行逆向so的話可能會消耗大量時間和資源。<br>以前用 xposed 採用 hook 的方法從程序計算簽名,可是須要模擬器或者真機運行這個應用,使用效率不高。<br>也用過 jtype 啓動JVM,而後經過 native 對so文件進行調用,由於每次都須要啓動JVM,因此效率也不高。<br>unidbg 他不須要運行 app,也無需逆向 so 文件,經過在 app 中找到對應的 JNI 接口,而後用 unicorn 引擎直接調用 so 文件,因此效率相對要高很多。java


unidbg特色

  • 模擬JNI調用API,能夠調用JNI_OnLoad
  • 支持JavaVM,JNIEnv
  • 模擬系統調用
  • 支持ARM32和ARM64
  • 內聯鉤子(Inline Hook)
  • Android import hook
  • iOS 的一些hook工具 fishhook and substrate and whale hook
  • 支持簡單的控制檯調試器,gdb存根,實驗性IDA android調試器服務器,指令跟蹤,內存讀/寫跟蹤
  • 支持iOS objc和Swift

unidbg環境配置

unidbg下載連接: https://github.com/zhkl0228/unidbg<br>IntelliJ IDEA可用於編輯unidbg源<br>image.png<br>下載完成以後示導入到 IDEA 中,固然你須要準備好java環境(jdk、maven)<br>image.png<br>選擇Maven<br>image.png<br>等待加載完成以後,運行src/…/encrypt 中的TTEncrypt測試用例<br>image.png<br>若是控制檯打印相關調用信息,說明已經導入成功。<br>image.pngpython


加載libcms.so

<br>下面準備調用libcms.so文件中的 leviathan 函數<br>首先在 src/test/resources 目錄下新建文件夾dylib,放入libcms.so文件<br>libcms.so 下載地址: https://download.csdn.net/download/weixin_43582101/12713664<br>image.png<br>而後我在 /unidbg/unidbg-android/src/test/java/com/sun/jna/ 目錄下新建了 JniDispatch128.java文件<br>image.png<br>JniDispatch128.java文件內容以下:linux

備註
「com/ss/sys/ces/a」 須要調用函數所在的Java類完整路徑,好比 a/b/c/d 等等,注意須要用/代替.
「leviathan(II[B)[B」 須要調用的函數名,名字是smali語法,可經過jadx等工具查看
「vm.loadLibrary(new File)」 so文件的路徑,須要自行修改,最好爲絕對路徑
package com.sun.jna;

import com.github.unidbg.*;
import com.github.unidbg.linux.android.AndroidARMEmulator;
import com.github.unidbg.linux.android.AndroidResolver;
import com.github.unidbg.linux.android.dvm.*;
import com.github.unidbg.memory.Memory;
import com.github.unidbg.memory.MemoryBlock;
import com.github.unidbg.linux.android.dvm.array.ByteArray;



import java.io.File;
import java.io.IOException;

public class JniDispatch128 extends AbstractJni {

    private static LibraryResolver createLibraryResolver() {
        return new AndroidResolver(23);
    }

    private static AndroidEmulator createARMEmulator() {
        return new AndroidARMEmulator("com.sun.jna");
    }

    private final AndroidEmulator emulator;
    private final Module module;
    private final VM vm;

    private final DvmClass Native;

    private JniDispatch128() {
        emulator = createARMEmulator();
        final Memory memory = emulator.getMemory();
        memory.setLibraryResolver(createLibraryResolver());

        vm = emulator.createDalvikVM(null);
        vm.setJni(this);
        vm.setVerbose(true);

		// 自行修改文件路徑
        DalvikModule dm = vm.loadLibrary(new File("/Users/Desktop/unidbg/unidbg-android/src/test/resources/dylib/libcms.so"), false);
        dm.callJNI_OnLoad(emulator);
        module = dm.getModule();

        Native = vm.resolveClass("com/ss/sys/ces/a");
   }

    private void destroy() throws IOException {
        emulator.close();
        System.out.println("destroy");
    }

    public static void main(String[] args) throws Exception {

        JniDispatch128 test = new JniDispatch128();

        test.test();

        test.destroy();
    }

    public static String xuzi1(byte[] bArr) {
        if (bArr == null) {
            return null;
        }
        char[] charArray = "0123456789abcdef".toCharArray();
        char[] cArr = new char[(bArr.length * 2)];
        for (int i = 0; i < bArr.length; i++) {
            int b2 = bArr[i] & 255;
            int i2 = i * 2;
            cArr[i2] = charArray[b2 >>> 4];
            cArr[i2 + 1] = charArray[b2 & 15];
        }
        return new String(cArr);
    }


    private void test() {
        String methodSign = "leviathan(II[B)[B";


        byte[] data = "暫時隨便寫的,這裏是url通過處理後的data".getBytes();
        int time = (int) (System.currentTimeMillis() / 1000);

        Native.callStaticJniMethod(emulator, methodSign, -1,time,new ByteArray(vm,data));

        Object ret = Native.callStaticJniMethodObject(emulator, methodSign, -1,time,new ByteArray(vm,data));

        System.out.println("callObject執行結果:"+((DvmObject) ret).getValue());

        byte[] tt = (byte[]) ((DvmObject) ret).getValue();
        System.out.println(new String(tt));
        String s = xuzi1(tt);
        System.out.println(s);
    }
}

運行main方法便可查看生成出來的xgorgon了<br>image.png<br> <br>android

TiToData:專業的短視頻、直播數據接口服務平臺git

更多信息請聯繫: TiToDatagithub

覆蓋主流平臺:抖音,快手,小紅書,TikTok,YouTube算法

相關文章
相關標籤/搜索