package com.android.reverse.collecter;
import java.lang.reflect.Method;
import org.keplerproject.luajava.JavaFunction;
import org.keplerproject.luajava.LuaException;
import org.keplerproject.luajava.LuaState;
import org.keplerproject.luajava.LuaStateFactory;
import com.android.reverse.hook.HookHelperFacktory;
import com.android.reverse.hook.HookHelperInterface;
import com.android.reverse.hook.HookParam;
import com.android.reverse.hook.MethodHookCallBack;
import com.android.reverse.util.JsonWriter;
import com.android.reverse.util.Logger;
import com.android.reverse.util.RefInvoke;
public class LuaScriptInvoker{
private static LuaScriptInvoker luaInvoker;
private final static String LUAJAVA_LIB = "luajava";
private HookHelperInterface hookhelper = HookHelperFacktory.getHookHelper();
private LuaScriptInvoker(){
}
public static LuaScriptInvoker getInstance(){
if(luaInvoker == null)
luaInvoker = new LuaScriptInvoker();
return luaInvoker;
}
public void start(){
Method findLibraryMethod = RefInvoke.findMethodExact("dalvik.system.BaseDexClassLoader", ClassLoader.getSystemClassLoader(), "findLibrary",
String.class);
hookhelper.hookMethod(findLibraryMethod, new MethodHookCallBack() {
@Override
public void beforeHookedMethod(HookParam param) {
// TODO Auto-generated method stub
}
@Override
public void afterHookedMethod(HookParam param) {
Logger.log((String) param.args[0]);
if (LUAJAVA_LIB.equals(param.args[0]) && param.getResult() == null) {
param.setResult("/data/data/com.android.reverse/lib/libluajava.so");
}
}
});
}
private void initLuaContext(LuaState luaState){
try {
JavaFunction logfunction = new LogFunctionCallBack(luaState);
logfunction.register("log");
JavaFunction tostringfunction = new ToStringFunctionCallBack(luaState);
tostringfunction.register("tostring");
} catch (LuaException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void invokeScript(String script){
LuaState luaState = LuaStateFactory.newLuaState();
luaState.openLibs();
this.initLuaContext(luaState);
int error = luaState.LdoString(script);
if(error!=0){
Logger.log("Read/Parse lua error. Exit");
return;
}
luaState.close();
}
public void invokeFileScript(String scriptFilePath){
LuaState luaState = LuaStateFactory.newLuaState();
luaState.openLibs();
this.initLuaContext(luaState);
int error = luaState.LdoFile(scriptFilePath);
if(error!=0){
Logger.log("Read/Parse lua error. Exit");
return;
}
luaState.close();
}
public static class ToStringFunctionCallBack extends JavaFunction{
public ToStringFunctionCallBack(LuaState L) {
super(L);
}
@Override
public int execute() throws LuaException {
int param_size = this.L.getTop();
for(int i=2; i<=param_size; i++){
try {
String objDsrc = JsonWriter.parserInstanceToJson(this.getParam(i).getObject());
Logger.log(objDsrc);
} catch (Exception e) {
e.printStackTrace();
}
}
return 0;
}
}
public static class LogFunctionCallBack extends JavaFunction{
public LogFunctionCallBack(LuaState L) {
super(L);
}
@Override
public int execute() throws LuaException {
int param_size = this.L.getTop();
if(param_size ==2 ){
String message = this.L.getLuaObject(2).getString();
Logger.log(message);
}
return 0;
}
}
}