占桩

hook 方法的处理有两种实现,一种是使用 stub 手动编写,一种是使用 DexMaker 生成。

假设我们写了一个 stub 方法:

	//stub of arg size 1, index 5
    public static int stub_hook_5(int a0) throws Throwable {
        return (int) hookBridge(getMethodId(1, 5), null , a0);
    }

这个方法就可以用来 hook 有0个或者1个参数的方法。

Hook实现

还是使用了 inline。

找到要Hook的方法,找到其对应的 ArtMethod。

尝试编译这个 ArtMehod 指令,编译成功后,就获取 entry_point_from_compiled_code_ 字段的值,这个地址就是方法指令储存的地方。entry_point_from_compiled_code_

在这个地方做 inline,inline 具体流程如下图:

image.png

图中的 Hook Method 就是上面我们写的 stub_hook_5。

备份方法

也可以采用占桩的方式:

public void stub0() {}

如果,不够用了,使用Proxy代理生成一个即可。

方法参数不重要,因为他的方法体入口会被设置为 Call Origin 的位置,相当于逻辑上不执行该方法体。