Skip to content

Commit

Permalink
修复了一些Bug
Browse files Browse the repository at this point in the history
美化了JSON格式
  • Loading branch information
Monkeylord committed Apr 4, 2019
1 parent 148cb58 commit edfe73e
Show file tree
Hide file tree
Showing 5 changed files with 78 additions and 19 deletions.
4 changes: 4 additions & 0 deletions app/src/main/java/monkeylord/XServer/XServer.java
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
import monkeylord.XServer.handler.ObjectHandler;
import monkeylord.XServer.objectparser.ByteArrayParser;
import monkeylord.XServer.objectparser.IntParser;
import monkeylord.XServer.objectparser.StoredObjectParser;
import monkeylord.XServer.objectparser.StringParser;
import monkeylord.XServer.utils.DexHelper;
import monkeylord.XServer.utils.NanoWSD;
Expand All @@ -38,12 +39,15 @@ public XServer(int port) {
public XServer(int port, Hashtable<String, Operation> route) {
super(port);
//注册对象序列化/反序列化处理器
parsers.put("general", new StoredObjectParser());
parsers.put("string", new StringParser());
parsers.put("int", new IntParser());
parsers.put("Ljava.lang.Integer;", new IntParser());
parsers.put("byte", new ByteArrayParser());
parsers.put("Ljava.lang.String;", new StringParser());
parsers.put("I", new IntParser());
parsers.put("[B", new ByteArrayParser());

//注册WebSocket路由
wsroute.put("/", new wsTracer());
wsroute.put("/methodview", new wsMethodView());
Expand Down
5 changes: 4 additions & 1 deletion app/src/main/java/monkeylord/XServer/XposedEntry.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@
import android.content.res.XModuleResources;
import android.os.Build;
import android.os.Process;
import android.util.Log;

import de.robv.android.xposed.IXposedHookLoadPackage;
import de.robv.android.xposed.IXposedHookZygoteInit;
import de.robv.android.xposed.XC_MethodReplacement;
Expand Down Expand Up @@ -44,7 +46,8 @@ public void handleLoadPackage(XC_LoadPackage.LoadPackageParam loadPackageParam)
//告知界面模块已启动,同时解除Android N以上对MODE_WORLD_READABLE的限制
if (loadPackageParam.packageName.equals("monkeylord.xserver")) {
XposedHelpers.findAndHookMethod("monkeylord.XServer.MainActivity", loadPackageParam.classLoader, "isModuleActive", XC_MethodReplacement.returnConstant(true));
if (Build.VERSION.SDK_INT >= 26)XposedHelpers.findAndHookMethod("android.app.ContextImpl", loadPackageParam.classLoader, "checkMode",int.class, XC_MethodReplacement.returnConstant(null));
if (Build.VERSION.SDK_INT >= 24)XposedHelpers.findAndHookMethod("android.app.ContextImpl", loadPackageParam.classLoader, "checkMode",int.class, XC_MethodReplacement.returnConstant(null));
XposedBridge.log("XServer handleLoadPackage: "+ Build.VERSION.SDK_INT);
}
//获取目标包名
sPrefs.reload();
Expand Down
4 changes: 2 additions & 2 deletions app/src/main/java/monkeylord/XServer/api/wsMethodView.java
Original file line number Diff line number Diff line change
Expand Up @@ -176,7 +176,7 @@ protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
json.put("method", Utils.getJavaName(myws.m));
if(thisObject!=null)json.put("this",ObjectHandler.saveObject(thisObject));
ArrayList params=new ArrayList();
for (Object arg:args) {
if(args!=null)for (Object arg:args) {
params.add(ObjectHandler.saveObject(arg));
}
json.put("params",params.toArray());
Expand All @@ -187,7 +187,7 @@ protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
json.put("stack",stacks);
param.setResult(
ObjectHandler.parseObject(
new netUtil(myws.server + "/invoke2", new JSONObject(json).toString()).getRet()
new netUtil(myws.server + "/invoke2", new JSONObject(json).toString(2)).getRet()
)
);
}
Expand Down
21 changes: 7 additions & 14 deletions app/src/main/java/monkeylord/XServer/handler/ObjectHandler.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import java.util.Random;
import java.util.regex.Pattern;

import monkeylord.XServer.XServer;
import monkeylord.XServer.objectparser.GenericParser;
import monkeylord.XServer.objectparser.StoredObjectParser;
import monkeylord.XServer.utils.Utils;
Expand All @@ -22,18 +23,9 @@ public static Object storeObject(Object obj, String name) {

public static String saveObject(Object obj){
if(obj==null)return "Null";
if(parsers.get(Utils.getTypeSignature(obj.getClass()))!=null){
return Utils.getTypeSignature(obj.getClass())+"#"+parsers.get(Utils.getTypeSignature(obj.getClass())).generate(obj);
}else{
String objname;
try{
objname=""+obj.hashCode();
}catch (Exception e){
objname= ""+new Random().nextLong();
}
storeObject(obj,""+objname);
return Utils.getTypeSignature(obj.getClass())+"#"+objname;
}
XServer.ObjectParser parser = parsers.get(Utils.getTypeSignature(obj.getClass()));
if(parser==null)parser=parsers.get("general");
return Utils.getTypeSignature(obj.getClass())+"#"+parser.generate(obj);
}

public static Object getObject(String name) {
Expand All @@ -46,8 +38,9 @@ public static Object parseObject(String Object){
if(Object.indexOf("#")<0)return null;
String type=Object.substring(0,Object.indexOf("#"));
String raw=Object.substring(Object.indexOf("#")+1);
if(parsers.get(type)!=null)return parsers.get(type).parse(raw);
else return new StoredObjectParser().parse(raw);
XServer.ObjectParser parser = parsers.get(type);
if(parser==null)parser=parsers.get("general");
return parser.parse(raw);
}

public static Object[] getObjects(String name, String type) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,16 +1,75 @@
package monkeylord.XServer.objectparser;

import android.util.Log;

import com.alibaba.fastjson.JSON;

import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;

import monkeylord.XServer.XServer;
import monkeylord.XServer.handler.ObjectHandler;
import monkeylord.XServer.utils.Utils;

import static monkeylord.XServer.XServer.parsers;

public class StoredObjectParser implements XServer.ObjectParser {
public static HashMap<String, Object> objects = new HashMap<String, Object>();
@Override
public Object parse(String data) {
return ObjectHandler.objects.get(data);
String objname=data.substring(0,data.indexOf("=>"));
String fieldmapStr=data.substring(data.indexOf("=>")+2);
Object obj = objects.get(objname);
if(obj==null)obj = ObjectHandler.objects.get(objname);
if(obj==null)return null;
HashMap<String, String> fieldmap = (HashMap)JSON.parseObject(fieldmapStr,HashMap.class);
if(!fieldmap.isEmpty()){
try {
Class objClass = obj.getClass();
for (Map.Entry<String, String> entry : fieldmap.entrySet()) {
Field field = objClass.getDeclaredField(entry.getKey());
field.setAccessible(true);
field.set(obj,ObjectHandler.parseObject(entry.getValue()));
}
}catch (Exception e){
Log.e("XServer", "SOParser: " + e.getLocalizedMessage() );
}
}
return obj;
}

@Override
public String generate(Object obj) {
return null;
String objname;
try{
objname=""+obj.hashCode();
}catch (Exception e){
objname= ""+new Random().nextLong();
}
HashMap<String, String> fieldmap = new HashMap<String, String>();
try{
Field fields[] = obj.getClass().getDeclaredFields();
for (Field field:fields) {
// 只处理public属性
// Handle public field only
//if(field.isAccessible()){
field.setAccessible(true);
Object fieldObj = field.get(obj);
Log.e("XServer", "SOParser Field: " + field.getName() + "@" + Utils.getTypeSignature(fieldObj.getClass()));
// 只处理原始类型,避免循环引用
// Handle primitive type only, avoid cell.
if(fieldObj.getClass().isPrimitive()||parsers.get(Utils.getTypeSignature(fieldObj.getClass()))!=null){
fieldmap.put(field.getName(),ObjectHandler.saveObject(fieldObj));
}
//}
}
}catch (Exception e){
Log.e("XServer", "SOParser: " + e.getLocalizedMessage() );
}
String fieldmapStr = JSON.toJSONString(fieldmap,true);
objects.put(""+objname,obj);
return objname+"=>"+fieldmapStr;
}
}

0 comments on commit edfe73e

Please sign in to comment.