Hook技术概述

百度搜索优化_百度优化_ppt优化

Hook技术能在程序运行期间对代码进行实时调整,嵌入自家的逻辑,从而改变既定的执行路径,这是其显著特点之一。该技术在多个领域得到应用,比如在APP开发过程中,开发者借助它来检测和调整程序的运行状态。举例来说,在安全类APP中,Hook技术被用来监控操作,以此确保用户数据的安全。

百度优化_百度搜索优化_ppt优化

改变程序初始路径,Hook技术给了开发者应对需求变动的多种选择。在游戏制作中运用它,可以简化测试流程,还能实现游戏的个性化定制,大大提高了开发的速度和适应性。

百度搜索优化_ppt优化_百度优化

Inline Hook原理

百度优化_百度搜索优化_ppt优化

Inline Hook通过调整函数运行的机器码指令来实施修复。这种技术直接对底层代码进行操作,对修改的精确性有很高的要求。在Android系统中,Inline - Hook是这一领域的典型框架。

百度搜索优化_ppt优化_百度优化

在实际操作中,若开发者需对某个函数的运行过程进行操控,Inline Hook便能发挥其作用。此技术能迅速找到目标函数的机器指令,并对其进行调整,使其遵循新的运行逻辑。比如,在反作弊系统中,这项技术可以用来监视游戏玩家的动作,以防止作弊行为的发生。

ppt优化_百度搜索优化_百度优化

xHook框架特点

ppt优化_百度优化_百度搜索优化

xHook框架采用PLT Hook技术,通过调整GOT表,使共享库中的函数调用转向特定代码。此方法使得Hook过程更加直接。

该框架将Java的原始方法转变为本地方法,执行时首先运行本地钩子方法,随后通过反射机制调用Java的原始方法。以开发工具类APP为例,利用此框架,开发者可以精确操控函数的调用,实现功能的强化或问题的修正。

现有Hook方案问题

目前情况下,若需同时具备Java和Native Hook功能,至少需整合两个不同的框架。这样做使得业务代码不得不局限于主包,进而导致包体量增大。举例来说,一些大型应用程序在集成多个Hook框架后,其安装包体积明显比之前更大。

ppt优化_百度优化_百度搜索优化

Hook框架引发的故障,因其缺乏灵活性和故障恢复功能,迫使我们必须重新推出应用并拓展分发途径,这对用户的使用感受造成了较大影响。当某社交软件遭遇此类问题时,众多用户表达了不满,其中一些用户甚至选择了卸载该应用。

public interface IHookEntity {    ......    /**     * Hook指定的方法     *     * @param hookedMethod 待Hook的方法Method对象     * @param hookCallback Hook回调{@link IHookCallback}     */    void hookMethod(Member hookedMethod, IHookCallback hookCallback);        ......}

优化方案内容

如果是Java Hook使用方只需要直接使用该接口的能力即可;如果是能力提供方,则需要将Java Hook能力注入到Thor抽象层的Java Hook接口实现中。


将稳定的开源框架适配为插件,抽象化其Hook功能,按需动态加载,确保Hook功能的全面性与轻量。如此一来,开发者能根据实际需求挑选恰当的Hook功能,降低资源的不必要消耗。

struct thor_abstract {    // 函数定义:PLT Hook实现框架的函数指针    // lib_name            被Hook的so库的名称    // symbol              被Hook的函数名    // hook_func           Hook方法    // backup_func         原方法备份(函数指针)    int (*thor_plt_hook)(const char *lib_name, const char *symbol, void *hook_func, void **backup_func);    // 函数定义:Inline Hook实现框架的函数指针    // target_func         原方法    // hook_func           Hook方法    // backup_func         原方法备份(函数指针)    int (*thor_inline_hook)(void *target_func, void *hook_func, void **backup_func);    // PLT Hook二期(新增接口,支持批量plt hook)    struct thor_plt_ext *plt_ext;};

若后续推出更优质或自主研发的框架,可无障碍接入,不影响现有业务代码与插件,确保了系统兼容。某电商平台在升级Hook框架时,顺利引入新框架,用户并未察觉到任何异常。

public abstract class ThorModule implements IThorModule {    /**     * 调度插件的加载生命周期     */    public abstract void handleLoadModule();
/** * 宿主通知和更新插件配置信息生命周期 */ public void onPluginFuncControl(PluginFuncInfo pluginFuncInfo) { }}

Thor框架应用

Thor框架使得业务模块的使用更加便捷。若业务模块需要运用Hook功能,只需在handleLoadModule子类中调用Thor的相应Hook即可,但这并非强制要求。Thor相当于一个容器,额外赋予了Hook功能。

调用hookMethod后,实际上会执行Java Hook框架的具体功能。以开发视频APP为例,开发者能够借助Thor框架与特定的Hook技术,对视频播放环节进行监督与改善。

ThorHook.findAndHookMethod(Handler.class, "dispatchMessage", new IHookCallback() {    @Override    public void beforeHookedMethod(IHookParam param) {        Message msg = (Message) param.getArguments()[0];        Log.d(TAG, ">>>>>>>>>>>dispatchMessage: " + msg);    }        @Override    public void afterHookedMethod(IHookParam param) {        Log.d(TAG, "<<<<<<<<<<<);    }}, Message.class);

在您的项目里,您更偏爱哪种钩子技术框架?别忘了点赞并转发这篇文章!

/**  * 寻找方法并将其Hook,最后一个参数必须是Hook方法的回调  *  * @param clazz          Hook方法所在类的类名称  * @param methodName     Hook方法名  * @param hookCallback   回调{@link IHookCallback}  * @param parameterTypes Hook方法的参数类型  */public static void findAndHookMethod(Class clazzString methodName,                                     IHookCallback hookCallbackClass... parameterTypes{    ......                                     Method methodExact = ThorHelpers.findMethodExact(clazz, methodName, parameterTypes);    hookMethod(methodExact, hookCallback);    ......}

/** * Hook指定的方法 * * @param hookedMethod 待Hook的方法Method对象 * @param hookCallback Hook回调{@link IHookCallback} */public static void hookMethod(Member hookedMethod, IHookCallback hookCallback) throws HookMethodException {    ......    CallbacksHandler callbacksHandler;    synchronized (sHookedMethodCallbacks) {        callbacksHandler = sHookedMethodCallbacks.get(hookedMethod);        if (callbacksHandler == null) { // 未Hook过的Method            callbacksHandler = new CallbacksHandler();            callbacksHandler.register(hookCallback);            sHookedMethodCallbacks.put(hookedMethod, callbacksHandler);        } else { // Hook过的Method,只需要注册回调即可            callbacksHandler.register(hookCallback);            return;        }    }        ThorManager.getInstance().getHookEntity().hookMethod(hookedMethod, callbacksHandler);}