以下是使用unidbg调用tes.so中的sign方法的示例代码:

import com.github.unidbg.AndroidEmulator;
import com.github.unidbg.LibraryResolver;
import com.github.unidbg.Module;
import com.github.unidbg.arm.ARMEmulatorBuilder;
import com.github.unidbg.file.FileSystem;
import com.github.unidbg.file.FileSystemBuilder;
import com.github.unidbg.linux.android.AndroidResolver;
import com.github.unidbg.linux.android.dvm.*;
import com.github.unidbg.memory.Memory;

import java.io.File;

public class TesSoDemo {

    private final AndroidEmulator emulator;
    private final VM vm;

    private final DvmClass testSoClass;

    private TesSoDemo() {
        emulator = new ARMEmulatorBuilder().build();
        final Memory memory = emulator.getMemory();
        final FileSystem fileSystem = FileSystemBuilder.createFileSystem(emulator, new File("src/test/resources/app.apk"));
        final LibraryResolver resolver = new AndroidResolver(23);
        emulator.getSyscallHandler().addIOResolver(resolver);
        memory.setLibraryResolver(resolver);

        vm = emulator.createDalvikVM(fileSystem.getFile("classes.dex"));
        vm.setVerbose(true);
        vm.setJni(new ProxyJni());
        DalvikModule dm = vm.loadLibrary("tes", false);
        dm.callJNI_OnLoad(emulator);
        testSoClass = vm.resolveClass("com/tencent/smtt/utils/Tes");
    }

    private void test() {
        DvmObject<?> context = VMStack.getCallingContextObject(vm);
        String param1 = "test1";
        String param2 = "test2";
        String param3 = "test3";
        String param4 = "test4";
        String param5 = "test5";
        String param6 = "test6";
        DvmObject<?>[] args = new DvmObject<?>[]{
                context,
                new StringObject(vm, param1),
                new StringObject(vm, param2),
                new StringObject(vm, param3),
                new StringObject(vm, param4),
                new StringObject(vm, param5),
                new StringObject(vm, param6)
        };

        DvmObject<?> result = testSoClass.callStaticJniMethodObject(emulator, "sign", "([Ljava/lang/Object;)Ljava/lang/Object;", args);
        System.out.println(result.getValue());
    }

    public static void main(String[] args) {
        TesSoDemo demo = new TesSoDemo();
        demo.test();
    }

}

说明:

  1. 创建一个AndroidEmulator实例,设置文件系统和库解析器。
  2. 创建一个DalvikVM实例,加载classes.dex。
  3. 加载tes.so库,并调用JNI_OnLoad()方法。
  4. 通过DalvikVM实例获取Tes类的DvmClass对象。
  5. 调用Tes类的静态方法sign,传入6个参数,其中第一个参数为当前应用程序的Context对象,其余5个参数为String类型。
  6. 获取方法返回值并输出。

注意:需要将app.apk和tes.so放在同一目录下,并在代码中指定app.apk的路径。


原文地址: http://www.cveoy.top/t/topic/bnff 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录