- 基于原生Unicorn API进行Hook时,不需要考虑是否 + 1,会自己转换
- Unicorn原生的Hook功能强大,而且不容易被检测
- Unicorn原生API进行inline hook

void callFunc() { emulator.getBackend().hook_add_new(new CodeHook() { @Override public void hook(Backend backend, long address, int size, Object user) { System.out.println("hook..."); RegisterContext context = emulator.getContext(); if (address == module.base + 0x1FF4){ emulator.getUnwinder().unwind(); Pointer md5Ctx = context.getPointerArg(0);//MD5Update第一个参数 Inspector.inspect(md5Ctx.getByteArray(0, 32), "md5Ctx"); Pointer plainText = context.getPointerArg(1);//MD5Update第二个参数 int length = context.getIntArg(2);//MD5Update第三个参数 Inspector.inspect(plainText.getByteArray(0, length), "plainText"); }else if (address == module.base + 0x2004){ Pointer cipherText = context.getPointerArg(1); Inspector.inspect(cipherText.getByteArray(0, 16), "cipherText");} } @Override public void onAttach(UnHook unHook) { } @Override public void detach() { } },module.base +0x1FE8,module.base +0x2004,"a123456"); StringObject md5Result = NativeHelper.callStaticJniMethodObject(emulator, "md5(Ljava/lang/String;)Ljava/lang/String;", new StringObject(vm, "xiaojianbang")); // 执行Jni方法 System.out.println("md5Result: " + md5Result.getValue()); }
- RegisterContext context = emulator.getContext(); 获取一个结构体
- MD5Update的参数如图所示,我们使用结构体下的getPointerArg方法获取对应的参数
- 打印调用栈 :emulator.getUnwinder().unwind()