当前位置: 首页 > 工具软件 > Epic-Android > 使用案例 >

Android中的hook框架:epic简介

古起运
2023-12-01

epic是Android中的一个开源的hook框架,目前最新版本是:0.11.2,项目地址:https://github.com/tiann/epic。

epic框架的优点有:
1.可以hook普通方法、构造方法、系统方法。
2.手机系统无需root。

集成方式如下:
1.在项目主module的build.gradle中添加依赖:
implementation 'com.github.tiann:epic:0.11.2'
2.如果需要在app启动时就开始hook,请在Application的onCreate方法中调用如下逻辑:

import de.robv.android.xposed.DexposedBridge;
import de.robv.android.xposed.XC_MethodHook;

private void startHook() {
    XC_MethodHook hook = new XC_MethodHook() {
        @Override
        protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
            super.beforeHookedMethod(param);
            Object hookObj = param.thisObject;
            String clsName = "unknownClass";
            if (hookObj != null) {
                clsName = hookObj.getClass().getName();
            }
            String mdName = "unknownMethod";
            if (param.method != null) {
                mdName = param.method.getName();
            }
            Log.d(TAG, "beforeHookedMethod: " + clsName + "-" + mdName);
        }

        @Override
        protected void afterHookedMethod(MethodHookParam param) throws Throwable {
            super.beforeHookedMethod(param);
            Object hookObj = param.thisObject;
            String clsName = "unknownClass";
            if (hookObj != null) {
                clsName = hookObj.getClass().getName();
            }
            String mdName = "unknownMethod";
            if (param.method != null) {
                mdName = param.method.getName();
            }
            Log.d(TAG, "afterHookedMethod: " + clsName + "-" + mdName);
        }
    };
    try {
        // hook系统方法
        DexposedBridge.hookAllMethods(BluetoothLeScanner.class, "startScan", hook);
        // hook系统方法
        DexposedBridge.hookAllMethods(Thread.class, "run", hook);
        // hook构造方法
        DexposedBridge.hookAllConstructors(Thread.class, hook);
    } catch (Throwable t) {
        t.printStackTrace();
    }
}

注:
1.要使用epic的hook功能,需要依赖libepic.so库文件。但此库文件不支持默认cpu架构:armeabi。如果app仅支持armeabi架构的话,需要在编译时将armeabi-v7a架构的库文件打包入app中。否则app运行会因为找不到库文件而崩溃。
2.在hook方法时,尤其是hook系统方法时,非常有必要加try、catch Throwable异常捕获。因为可能会遇到在hook时由于访问权限等问题而导致抛出异常,进而崩溃。而即使加上异常捕获,有时也会遇到直接在native层出现异常,try、catch无法捕获的问题,那就没法解决了,这一点要注意。

 类似资料: