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无法捕获的问题,那就没法解决了,这一点要注意。