package com.cuckoodroid.droidmon;
import com.cuckoodroid.droidmon.utils.Logger;
import com.cuckoodroid.droidmon.utils.MethodApiType;
import android.os.Process;
import de.robv.android.xposed.XC_MethodHook;
public class MethodHookImpl extends XC_MethodHook{
private String mClassName;
private String mMethodName;
private MethodApiType mType;
private boolean mThisObject=false;
public MethodHookImpl(String className, String methodName,boolean thisObject,MethodApiType type){
mClassName = className;
mMethodName = methodName;
mThisObject=thisObject;
mType=type;
}
public String getClassName(){
return mClassName;
}
public String getMethodName(){
return mMethodName;
}
@Override
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
}
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
if (!param.hasThrowable())
try {
if (Process.myUid() <= 0)
return;
if (InstrumentationManager.TRACE)
traceMethod(param);
else
monitorMethod(param);
} catch (Throwable ex) {
throw ex;
}
}
public void monitorMethod(MethodHookParam param)
{
try {
if(param.method.getName().contains("invoke"))
Logger.logReflectionMethod(param,mThisObject,mType);
else if(param.method.getName().contains("write"))
Logger.logProcessWriteMethod(param,mThisObject,mType);
else if(param.method.getName().contains("read"))
Logger.logProcessReadMethod(param,mThisObject,mType);
else if(param.method.getName().contains("openDexFile") || param.method.getName().equals("load"))
Logger.logAndDumpFile(param,mThisObject,mType);
else
Logger.logGenericMethod(param,mThisObject,mType);
} catch (Exception e) {
Logger.logError(param.method.getDeclaringClass().getName()+"->"+param.method.getName());
}
}
public void traceMethod(MethodHookParam param)
{
try {
if(param.method.getName().contains("invoke"))
Logger.logTraceReflectionMethod(param,mType);
else
Logger.logTraceMethod(param,mType);
} catch (Exception e) {
Logger.logError( param.method.getDeclaringClass().getName()+"->"+param.method.getName());
}
}
}