Home

Awesome

FastHook

一种高效稳定、简洁易用的Android Hook框架,实际项目验证,拥有远超其他同类框架的优异稳定性。 实现原理,请参考

使用

提供两种使用方式:配置方式Callback方式

配置方式

提供一个Hook信息类,可以是任意类,但是必须定义有static String[] HOOK_ITEMS;例如 HookInfo.java

private static String[] mHookItem = {
            "mode",
            "targetClassName","targetMethodName","targetParamSig",
            "hookClassName","hookMethodName","hookParamSig",
            "forwardClassName","forwardMethodName","forwardParamSig"
};
public static String[][] HOOK_ITEMS = {
            mHookItem
};

mode:提供两种hook模式:"1":Inline Hook(性能高效);"2":EntryPoint替换模式(弥补Inline Hook在一些情况下不能Hook的缺陷)

接口

/**
 *
 *@param hookInfoClassName HookInfo类名
 *@param hookInfoClassLoader HookInfo类所在的ClassLoader,如果为null,代表当前ClassLoader
 *@param targetClassLoader Target方法所在的ClassLoader,如果为null,代表当前ClassLoader
 *@param hookClassLoader Hook方法所在的ClassLoader,如果为null,代表当前ClassLoader
 *@param forwardClassLoader Forward方法所在的ClassLoader,如果为null,代表当前ClassLoader
 *@param jitInline 是否内联,false,禁止内联;true,允许内联
 *
 */
public static void doHook(String hookInfoClassName, ClassLoader hookInfoClassLoader, ClassLoader targetClassLoader, ClassLoader hookClassLoader, ClassLoader forwardClassLoader, boolean jitInline)

调用

//插件式Hook,需要提供插件的ClassLoader
FastHookManger.doHook("hookInfoClassName",pluginsClassloader,null,pluginsClassloader,pluginsClassloader,false);
//内置Hook,都位于当前ClassLoader
FastHookManger.doHook("hookInfoClassName",null,null,null,null,false);
//Root Hook,需要体供插件的ClassLoader和apk的ClassLoader
FastHookManger.doHook("hookInfoClassName",pluginsClassloader,apkClassLoader,pluginsClassloader,pluginsClassloader,false);

Callback方式

实现FastHookCallback接口

public interface FastHookCallback {
    void beforeHookedMethod(FastHookParam param);
    void afterHookedMethod(FastHookParam param);
}
public class FastHookParam {
    public Object receiver;
    public Object[] args;
    public Object result;
    public boolean replace;
}

接口

/**
 *
 *@param className 目标方法类名
 *@param classLoader 目标方法所在ClassLoader,如果为null,代表当前ClassLoader
 *@param methodName 目标方法方法名
 *@param methodSig 目标方法参数签名,不包括返回类型
 *@param callback hook回调方法
 *@param mode hook模式
 *@param jitInline 是否内联,false,禁止内联;true,允许内联
 *
 */
 FastHookManager.doHook(String className, ClassLoader classLoader, String methodName, String methodSig, FastHookCallback callback, int mode, boolean jitInline)

调用

FastHookManager.doHook(className,classLoader, methodName, methodSig, new FastHookCallback() {
            @Override
            public void beforeHookedMethod(FastHookParam param) {
                
            }

            @Override
            public void afterHookedMethod(FastHookParam param) {

            }
        },FastHookManager.MODE_REWRITE,false);

支持Android版本

支持架构

参考

  1. VirtualFastHook:结合VirtualApp的免root Hook工具。
  2. Enhanced_dlfunctions:增强版本的dl函数,支持获取所有符号,包括.dynsym段和.symtab段