package lab.galaxy.yahfa;
import android.app.Application;
import android.util.Log;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import dalvik.system.DexClassLoader;
/**
* Created by liuruikai756 on 28/03/2017.
*/
public class HookMain {
private static final String TAG = "YAHFA";
static {
System.loadLibrary("yahfa");
}
public HookMain() {
init(android.os.Build.VERSION.SDK_INT);
}
public void doHookDefault(ClassLoader patchClassLoader, ClassLoader originClassLoader) {
try {
Class<?> hookInfoClass = Class.forName("lab.galaxy.yahfa.HookInfo", true, patchClassLoader);
String[] hookItemNames = (String[])hookInfoClass.getField("hookItemNames").get(null);
for(String hookItemName : hookItemNames) {
doHookItemDefault(patchClassLoader, hookItemName, originClassLoader);
}
}
catch (Exception e) {
e.printStackTrace();
}
}
public void doHookItemDefault(ClassLoader patchClassLoader, String hookItemName, ClassLoader originClassLoader) {
try {
Log.i(TAG, "Start hooking with item "+hookItemName);
Class<?> hookItem = Class.forName(hookItemName, true, patchClassLoader);
String className = (String)hookItem.getField("className").get(null);
String methodName = (String)hookItem.getField("methodName").get(null);
String methodSig = (String)hookItem.getField("methodSig").get(null);
if(className == null || className.equals("")) {
Log.w(TAG, "No target class. Skipping...");
return;
}
Class<?> clazz = Class.forName(className, true, originClassLoader);
if(Modifier.isAbstract(clazz.getModifiers())) {
Log.w(TAG, "Hook may fail for abstract class: "+className);
}
Method hook = null;
Method backup = null;
for (Method method : hookItem.getDeclaredMethods()) {
if (method.getName().equals("hook")) {
hook = method;
} else if (method.getName().equals("origin")) {
backup = method;
}
}
if (hook == null) {
Log.e(TAG, "Cannot find hook for "+methodName);
return;
}
findAndBackupAndHook(clazz, methodName, methodSig, hook, backup);
}
catch (Exception e) {
e.printStackTrace();
}
}
public native void findAndBackupAndHook(Class targetClass, String methodName, String methodSig,
Method hook, Method backup);
private native void init(int SDK_version);
}