执行callJNI_OnLoad 出现 Unidbg Illegal JNI version: 0xffffffff
初始执行代码如下:
private final AndroidEmulator emulator;
private final VM vm;
// 创建模拟器实例,进程名建议依照实际进程名填写,可以规避针对进程名的校验
emulator = AndroidEmulatorBuilder.for32Bit()
.setProcessName("包名")
.build();
// 获取模拟器的内存操作接口
final Memory memory = emulator.getMemory();
// 设置系统类库解析
memory.setLibraryResolver(new AndroidResolver(23));
// 创建Android虚拟机
vm = emulator.createDalvikVM();
// 注册libandroid.so虚拟模块
new AndroidModule(emulator, vm).register(memory);
// 加载目标SO
DalvikModule dm = vm.loadLibrary(new File("unidbg-android\\src\\test\\resources\\libkwsgmain.so"), true);
// 打印日志
vm.setVerbose(true);
// 调用JNI OnLoad
dm.callJNI_OnLoad(emulator);
}
执行Unidbg时报错 Illegal JNI version: 0xffffffff
解决方法是需要传入so所在APK创建Android虚拟机
vm = emulator.createDalvikVM(new File("unidbg-android\\src\\test\\resources\\xxxxxx.apk"));
同时加载目标so时也需要改一下格式,不能以new File() 的方式加载
so 名称, 要去掉 lib 和 .so
DalvikModule dm = vm.loadLibrary("kwsgmain", true);
完整代码如下:
private final AndroidEmulator emulator;
private final VM vm;
// 创建模拟器实例,进程名建议依照实际进程名填写,可以规避针对进程名的校验
emulator = AndroidEmulatorBuilder.for32Bit()
.setProcessName("包名")
.build();
// 获取模拟器的内存操作接口
final Memory memory = emulator.getMemory();
// 设置系统类库解析
memory.setLibraryResolver(new AndroidResolver(23));
// 创建Android虚拟机,传入APK,Unidbg可以替我们做部分签名校验的工作
vm = emulator.createDalvikVM(new File("unidbg-android\\src\\test\\resources\\xxxx.apk"));
// 注册libandroid.so虚拟模块
new AndroidModule(emulator, vm).register(memory);
// 加载目标SO
DalvikModule dm = vm.loadLibrary("kwsgmain", true);
// 打印日志
vm.setVerbose(true);
// 调用JNI OnLoad
dm.callJNI_OnLoad(emulator);
加载成功!!!