在数字化转型中,选择合适的跨平台开发框架不仅能提高效率,还有助于确保数据安全与合规性。
2117
2022-10-30
FastHook——一种高效稳定、简洁易用的Android Hook框架
FastHook
一种高效稳定、简洁易用的Android Hook框架,实际项目验证,拥有远超其他同类框架的优异稳定性。 实现原理,请参考
FastHook——一种高效稳定、简洁易用的Android Hook框架FastHook——巧妙利用动态代理实现非侵入式AOP
使用
提供两种使用方式:配置方式、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,代表当前ClassLoadertargetClassLoader:Target方法所在的ClassLoader,如果为null,代表当前ClassLoaderhookClassLoader:Hook方法所在的ClassLoader,如果为null,代表当前ClassLoaderforwardClassLoader:Forward方法所在的ClassLoader,如果为null,代表当前ClassLoaderjitInline:是否内联,false,禁止内联;true,允许内联
调用
插件式Hook:需要提供插件的ClassLoader,建议在attachBaseContext方法里调用。
//插件式Hook,需要提供插件的ClassLoaderFastHookManger.doHook("hookInfoClassName",pluginsClassloader,null,pluginsClassloader,pluginsClassloader,false);
内置Hook:都位于当前ClassLoader建议在attachBaseContext方法里调用。
//内置Hook,都位于当前ClassLoaderFastHookManger.doHook("hookInfoClassName",null,null,null,null,false);
其他形式 Hook:需要体供插件的ClassLoader和apk的ClassLoader,建议在handleBindApplication方法里合适的地方调用,一般在加载apk后,调用attachBaseContext前。
//Root Hook,需要体供插件的ClassLoader和apk的ClassLoaderFastHookManger.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方法则为nullargs:方法参数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,代表当前ClassLoadermethodName:目标方法方法名methodSig:目标方法参数签名,不包括返回类型callback:hook回调方法mode:hook模式,FastHookManager.MODE_REWRITE和FastHookManager.MODE_REPLACEjitInline:是否内联,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)
支持架构
Thumb2Arm64
参考
VirtualFastHook:结合VirtualApp的免root Hook工具。Enhanced_dlfunctions:增强版本的dl函数,支持获取所有符号,包括.dynsym段和.symtab段
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~