关于java:unidbg调用so文件

90次阅读

共计 2973 个字符,预计需要花费 8 分钟才能阅读完成。

unidbg 是一个基于 unicorn 的逆向工具,能够在 pc 端间接调用 Android 和 iOS 中的 so 文件

1. unidbg 下载地址:https://github.com/zhkl0228/u…

unidbg 我的项目用 Java 编写,并且下面下载的是一个规范的 maven 我的项目,要确保电脑装置好 JDK、maven

2. 我的项目导入 IDEA

 先将 zip 文件解压, 应用 IDEA2021 版本不知如何导入,这里应用为 IDEA2018 版本 

 接下来一路 next 即可第一次导入此我的项目会主动下载一些 jar 包,和网速、maven 服务器无关,急躁期待吧 

3.unidbg 测试

 我的项目中的 unidbg-android\src\test\java\com\bytedance\frameworks\core\encrypt 门路中有一个 TTEncrypt 测试用例,间接执行其中的 main 办法 

 控制台打印相干调用信息,阐明我的项目导入胜利 

4. 运行本人的 so 文件

下边为集体简略的批改的一个案例,大部分都做有正文,可参考一下

package com.DU_APP;         // 以后文件的门路

import com.github.unidbg.AndroidEmulator;
import com.github.unidbg.Module;
import com.github.unidbg.linux.android.AndroidEmulatorBuilder;
import com.github.unidbg.linux.android.AndroidResolver;
import com.github.unidbg.linux.android.dvm.DalvikModule;
import com.github.unidbg.linux.android.dvm.DvmClass;
import com.github.unidbg.linux.android.dvm.StringObject;
import com.github.unidbg.linux.android.dvm.VM;
import com.github.unidbg.linux.android.dvm.array.ByteArray;
import com.github.unidbg.memory.Memory;
import java.io.File;
import java.io.IOException;


public class DU_sign {       // 类名要与文件名统一

    private final AndroidEmulator emulator;
    private final VM vm;
    private final Module module;
    private final DvmClass TTEncryptUtils;
    private final boolean logging;

    public DU_sign(boolean logging) {
        this.logging = logging;
        emulator = AndroidEmulatorBuilder.for32Bit().setProcessName("com.shizhuang.duapp").build(); // 创立模拟器实例,要模仿 32 位或者 64 位,在这里辨别,包名可写、可不写、可随便写
        final Memory memory = emulator.getMemory(); // 模拟器的内存操作接口
        memory.setLibraryResolver(new AndroidResolver(23)); // 设置零碎类库解
        vm = emulator.createDalvikVM(); // 创立 Android 虚拟机
        vm.setVerbose(logging); // 设置是否打印 Jni 调用细节
        String so_path = "";   // 要调用的 so 文件门路
        DalvikModule dm = vm.loadLibrary(new File(so_path), false); // 加载 libttEncrypt.so 到 unicorn 虚拟内存,加载胜利当前会默认调用 init_array 等函数
        dm.callJNI_OnLoad(emulator); // 手动执行 JNI_OnLoad 函数
        module = dm.getModule(); // 加载好的 libttEncrypt.so 对应为一个模块
        TTEncryptUtils = vm.resolveClass("com/duapp/aesjni/AESEncrypt");    // 将要调用的 so 文件在 java 层的哪一个类中被调用,类的门路
    }

    // 敞开模拟器
    void destroy() throws IOException {emulator.close();
        if (logging) {System.out.println("destroy");
        }
    }

    public static void main(String[] args) throws Exception {DU_sign test = new DU_sign(false);     // 实例化以后类

    //        要进行加密的字符串
        String str1 = "abTest[{\"name\":\"search_equlheight_spu_strategy\",\"value\":\"0\"}]catId0hideAddProduct0limit20loginTokenoriginSearchfalsepage0platformandroidproductDetailVersionFlag1showHot1sortMode0sortType0timestamp1625715089920title 手表 typeId0uuidd812da2917d75f8ev4.71.0";

        System.out.println(test.encodeByte(str1));

        test.destroy();     // 敞开模拟器}

    public String encodeByte(String str1) {
        // 须要加密的第二个字符串,不变
        String byteString = "010110100010001010010010000011000111001011101010101000101110111010011010101101101010001000101100010110100010001010011010110011001111001011100010101000100100110010110010100010101011110010111100";
        // 定义参数的类型,传参(emulator, 要调用的办法的 smail 写法, 传参 (留神参数类型,有几个参数传几个参数))Object ret = TTEncryptUtils.callStaticJniMethodObject(emulator, "encodeByte([BLjava/lang/String;)Ljava/lang/String;",
                // 传参,这里须要两个字符串,所以就传入两个参数
                new ByteArray(vm, str1.getBytes()),
                vm.addLocalObject(new StringObject(vm, byteString)));

        return ret.toString();}

}


正文完
 0