FastHook——一种高效稳定、简洁易用的Android Hook框架

网友投稿 2105 2022-10-30

FastHook——一种高效稳定、简洁易用的Android Hook框架

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小时内删除侵权内容。

上一篇:计算包含+、-、*、/、(、)等几种运算符的表达式的值。
下一篇:怎么解决tomcat端口占用问题?
相关文章

 发表评论

暂时没有评论,来抢沙发吧~