FastHook
Android ART Hook
Install / Use
/learn @turing-technician/FastHookREADME
FastHook
一种高效稳定、简洁易用的Android Hook框架,实际项目验证,拥有远超其他同类框架的优异稳定性。 实现原理,请参考
使用
提供两种使用方式:配置方式、Callback方式
- 配置方式:代码取master分支
- callback方式:代码取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)
- hookInfoClassName:HookInfo类名
- hookInfoClassLoader:HookInfo类所在的ClassLoader,如果为null,代表当前ClassLoader
- targetClassLoader:Target方法所在的ClassLoader,如果为null,代表当前ClassLoader
- hookClassLoader:Hook方法所在的ClassLoader,如果为null,代表当前ClassLoader
- forwardClassLoader:Forward方法所在的ClassLoader,如果为null,代表当前ClassLoader
- jitInline:是否内联,false,禁止内联;true,允许内联
调用
- 插件式Hook:需要提供插件的ClassLoader,建议在attachBaseContext方法里调用。
//插件式Hook,需要提供插件的ClassLoader
FastHookManger.doHook("hookInfoClassName",pluginsClassloader,null,pluginsClassloader,pluginsClassloader,false);
- 内置Hook:都位于当前ClassLoader建议在attachBaseContext方法里调用。
//内置Hook,都位于当前ClassLoader
FastHookManger.doHook("hookInfoClassName",null,null,null,null,false);
- 其他形式 Hook:需要体供插件的ClassLoader和apk的ClassLoader,建议在handleBindApplication方法里合适的地方调用,一般在加载apk后,调用attachBaseContext前。
//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);
}
- beforeHookedMethod:原方法调用前调用
- afterHookedMethod:原方法调用后调用
public class FastHookParam {
public Object receiver;
public Object[] args;
public Object result;
public boolean replace;
}
- receiver:this对象,static方法则为null
- args:方法参数
- result:方法返回值
- replace:是否替换方法,如果为true,则不会调用原方法,并以result返回
接口
/**
*
*@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)
- className:目标方法类名
- classLoader:目标方法所在ClassLoader,如果为null,代表当前ClassLoader
- methodName:目标方法方法名
- methodSig:目标方法参数签名,不包括返回类型
- callback:hook回调方法
- mode:hook模式,FastHookManager.MODE_REWRITE和FastHookManager.MODE_REPLACE
- jitInline:是否内联,false,禁止内联;true,允许内联
调用
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版本
- Android 9.0 (API 28)
- Android 8.1 (API 27)
- Android 8.0 (API 26)
- Android 7.1 (API 25)
- Android 7.0 (API 24)
- Android 6.0 (API 23)
- Android 5.1 (API 22)
- Android 5.0 (API 21)
支持架构
- Thumb2
- Arm64
参考
- VirtualFastHook:结合VirtualApp的免root Hook工具。
- Enhanced_dlfunctions:增强版本的dl函数,支持获取所有符号,包括.dynsym段和.symtab段
Related Skills
node-connect
343.1kDiagnose OpenClaw node connection and pairing failures for Android, iOS, and macOS companion apps
frontend-design
90.0kCreate distinctive, production-grade frontend interfaces with high design quality. Use this skill when the user asks to build web components, pages, or applications. Generates creative, polished code that avoids generic AI aesthetics.
openai-whisper-api
343.1kTranscribe audio via OpenAI Audio Transcriptions API (Whisper).
qqbot-media
343.1kQQBot 富媒体收发能力。使用 <qqmedia> 标签,系统根据文件扩展名自动识别类型(图片/语音/视频/文件)。
