ZHookLib
A java hook library for android, it contains a so and a jar file.
And the part of the code copy from xposed
It is compatible with android 2.3-4.4.
The art mode support will come soon!
API:
com.morgoo.hook.zhook.ZHook
class:
Hook method:
public static MethodHook.Unhook hookMethod(Member hookMethod, MethodHook callback)
public static Set<MethodHook.Unhook> hookAllMethods(Class<?> hookClass,
String methodName, MethodHook callback)
public static MethodHook.Unhook findAndHookMethod(Class<?> clazz,
String methodName, Object... parameterTypesAndCallback)
public static MethodHook.Unhook findAndHookMethod(String className,
ClassLoader classLoader, String methodName,
Object... parameterTypesAndCallback)
Hook constructor:
public static Set<MethodHook.Unhook> hookAllConstructors(
Class<?> hookClass, MethodHook callback)
Check method has been or not hooked:
public static boolean isMethodHooked(Member method)
unhook:
public static void unhookMethod(Member hookMethod, MethodHook callback)
invoke original method:
public static Object invokeOriginalMethod(Member method, Object thisObject,
Object[] args)
sample:
Define a class in HookTest.java
:
public class HookTest{
private static final String TAG = HookTest.class.getSimpleName();
public HookTest() {
Log.e(TAG,"Create");
}
private int test(int i) {
Log.e(TAG, "i am in test(int i) re=" + i);
return i;
}
private int test(int i, String t) {
Log.e(TAG, "i am in test(int i, String t) re=" + i + ",t=" + t);
return i;
}
private String test(String t) {
Log.e(TAG, "i am in test(String t) t=" + t);
return t;
}
private void test(String t, int i) {
Log.e(TAG, "i am in test(String t, int i) t=" + t);
}
}
and write a main method for test:
public static void main() {
MethodHook callback = new MethodHook() {
@Override
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
super.beforeHookedMethod(param);
Log.e("HookTest", "beforeHookedMethod " + param.method);
}
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
super.afterHookedMethod(param);
Object result = param.getResult();
if (result instanceof String) {
param.setResult("MyResult");
Log.e("HookTest",
"afterHookedMethod " + param.method + ",getThrowable="
+ param.getThrowable() + " we fake result as MyResult");
} else if ((result instanceof Integer)) {
param.setResult(1986);
Log.e("HookTest",
"afterHookedMethod " + param.method + ",getThrowable="
+ param.getThrowable() + " we fake result as 1986");
} else {
Log.e("HookTest",
"afterHookedMethod " + param.method + ",getResultOrThrowable="
+ param.getResultOrThrowable());
}
}
};
Set<Unhook> unhooks1 = ZHook.hookAllConstructors(HookTest.class, callback);
Set<Unhook> unhooks2 = ZHook.hookAllMethods(HookTest.class, "test", callback);
HookTest hookTest = new HookTest();
String msg1 = "i am run on hook: test(1) result=" + hookTest.test(1);
Log.e("HookTest", msg1);
String msg2 = "i am run on hook: test(1,fdfdf) result=" + hookTest.test(1, "fdfdf");
Log.e("HookTest", msg2);
String msg3 = "i am run on hook: test(1,fdfdf) result=" +
hookTest.test("fdfdf");
Log.e("HookTest", msg3);
hookTest.test("fdfdf", 1);
String msg4 = "i am run on hook: test(fdfdf,1) result=void";
Log.e("HookTest", msg4);
for (Unhook unhook : unhooks1) {
unhook.unhook();
}
for (Unhook unhook : unhooks2) {
unhook.unhook();
}
Log.e("HookTest", "i am run after unhook: test1(1) re=" + hookTest.test(1));
Log.e("HookTest", "i am run after unhook: test1(1,fdfdf) re=" + hookTest.test(1, "fdfdf"));
Log.e("HookTest", "i am run after unhook: test1(1,fdfdf) re=" + hookTest.test("fdfdf"));
}