From 4a9cc7e163503fac4e48dc5038104a70acd1f9c1 Mon Sep 17 00:00:00 2001 From: Monkeylord Date: Fri, 29 Mar 2019 15:55:19 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8F=82=E8=80=83=E4=BA=86Inspeckage=E7=9A=84?= =?UTF-8?q?=E5=AE=9E=E7=8E=B0=EF=BC=8C=E4=BD=86=E6=98=AF=E5=81=9A=E5=BE=97?= =?UTF-8?q?=E6=AF=94=E5=AE=83=E6=9B=B4=E4=BC=98=E9=9B=85=E3=80=82=20?= =?UTF-8?q?=E5=B0=8F=E7=B1=B3Max=EF=BC=8CAndroid=207=E6=B5=8B=E8=AF=95?= =?UTF-8?q?=E6=88=90=E5=8A=9F=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/misc.xml | 8 +- .idea/modules.xml | 2 +- app/build.gradle | 2 +- app/src/main/AndroidManifest.xml | 5 - app/src/main/assets/pages/methodview.html | 2 +- app/src/main/assets/pages/tracer.html | 2 +- .../java/monkeylord/XServer/MainActivity.java | 48 ++------ .../java/monkeylord/XServer/XposedEntry.java | 105 +++--------------- .../XServer/utils/TargetService.java | 38 ------- gradle/wrapper/gradle-wrapper.properties | 2 +- 10 files changed, 35 insertions(+), 179 deletions(-) delete mode 100644 app/src/main/java/monkeylord/XServer/utils/TargetService.java diff --git a/.idea/misc.xml b/.idea/misc.xml index 99202cc..e0d5b93 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -5,22 +5,26 @@ diff --git a/.idea/modules.xml b/.idea/modules.xml index d48b1a0..bfe84a9 100644 --- a/.idea/modules.xml +++ b/.idea/modules.xml @@ -2,7 +2,7 @@ - + diff --git a/app/build.gradle b/app/build.gradle index c61cde2..b198384 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -8,7 +8,7 @@ android { minSdkVersion 19 targetSdkVersion 26 versionCode 1 - versionName "0.4.7" + versionName "0.5.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" } buildTypes { diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 398d052..0dff999 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -27,11 +27,6 @@ android:name="xposeddescription" android:value="Dynamic trace/invoke via http-server" /> - \ No newline at end of file diff --git a/app/src/main/assets/pages/methodview.html b/app/src/main/assets/pages/methodview.html index 2a3480e..e824f3a 100644 --- a/app/src/main/assets/pages/methodview.html +++ b/app/src/main/assets/pages/methodview.html @@ -52,7 +52,7 @@

Monitor

var messages=""; //判断当前浏览器是否支持WebSocket if ('WebSocket' in window) { - websocket = new WebSocket(document.origin.replace("http","ws")+"/methodview?class=${class}&method=${method}&javaname=${javaName}"); + websocket = new WebSocket(document.location.origin.replace("http","ws")+"/methodview?class=${class}&method=${method}&javaname=${javaName}"); } else { alert('当前浏览器 Not support websocket') diff --git a/app/src/main/assets/pages/tracer.html b/app/src/main/assets/pages/tracer.html index 51991ef..b1e9ff3 100644 --- a/app/src/main/assets/pages/tracer.html +++ b/app/src/main/assets/pages/tracer.html @@ -26,7 +26,7 @@ var messages=""; var timer; if ('WebSocket' in window) { - websocket = new WebSocket(document.origin.replace("http","ws")); + websocket = new WebSocket(document.location.origin.replace("http","ws")); } else { alert('Current Browser Not support websocket') diff --git a/app/src/main/java/monkeylord/XServer/MainActivity.java b/app/src/main/java/monkeylord/XServer/MainActivity.java index 44cc744..b19ba49 100644 --- a/app/src/main/java/monkeylord/XServer/MainActivity.java +++ b/app/src/main/java/monkeylord/XServer/MainActivity.java @@ -4,13 +4,10 @@ import android.app.AlertDialog; import android.content.Context; import android.content.DialogInterface; -import android.content.Intent; import android.content.SharedPreferences; import android.content.pm.PackageInfo; import android.graphics.Color; import android.os.Bundle; -import android.os.MemoryFile; -import android.util.Log; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; @@ -19,31 +16,25 @@ import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; - -import java.io.BufferedWriter; import java.io.File; -import java.io.FileWriter; -import java.io.IOException; -import java.io.OutputStreamWriter; import java.util.List; -import monkeylord.XServer.utils.TargetService; -import monkeylord.XServer.utils.netUtil; - public class MainActivity extends Activity { SharedPreferences sp; String hookee; boolean isReg; TextView info; EditText appname; - File sharedFile=null; - MemoryFile memFile=null; //CheckBox regEx; private static boolean isModuleActive() { return false; } - private File getFile(){ return null; } + + public void makeWorldReadable(){ + new File("/data/data/" + XServer.class.getPackage().getName().toLowerCase()).setExecutable(true, false); + new File("/data/data/" + XServer.class.getPackage().getName().toLowerCase() + "/shared_prefs/XServer.xml").setReadable(true, false); + } @Override protected void onCreate(Bundle savedInstanceState) { @@ -54,18 +45,9 @@ protected void onCreate(Bundle savedInstanceState) { ViewGroup.LayoutParams.WRAP_CONTENT); layout.setOrientation(LinearLayout.VERTICAL); super.setContentView(layout, param); - sp = getSharedPreferences("XServer", MODE_PRIVATE); - sharedFile=getFile(); + sp = getSharedPreferences("XServer", isModuleActive()?MODE_WORLD_READABLE:MODE_PRIVATE); + makeWorldReadable(); hookee = sp.getString("targetApp", "com."); - /* - try { - if(memFile!=null)hookee = new BufferedReader(new InputStreamReader(memFile.getInputStream())).readLine(); - else if(sharedFile!=null)hookee = new BufferedReader(new FileReader(sharedFile)).readLine(); - else hookee = sp.getString("targetApp", "com."); - } catch (Exception e) { - hookee = sp.getString("targetApp", "com."); - } - */ //isReg = sp.getBoolean("isReg", false); final AppAdapter appAdapter = new AppAdapter(this); final AlertDialog selector = new AlertDialog.Builder(this) @@ -129,8 +111,6 @@ public void onClick(View view) { layout.addView(selectApp); layout.addView(tips); update(); - //启动目标指示服务 - startService(new Intent(this,TargetService.class)); } public void update() { @@ -138,20 +118,6 @@ public void update() { editor.putString("targetApp", hookee); //editor.putBoolean("isReg", isReg); editor.commit(); - if(memFile!=null)try{ - BufferedWriter writer=new BufferedWriter(new OutputStreamWriter(memFile.getOutputStream())); - writer.write(hookee.trim()); - writer.newLine(); - writer.flush(); - }catch (IOException e){ - e.printStackTrace(); - }else if(sharedFile!=null) try { - BufferedWriter writer=new BufferedWriter(new FileWriter(sharedFile)); - writer.write(hookee); - writer.flush(); - } catch (IOException e) { - e.printStackTrace(); - } info.setText("Target App:\r\n" + hookee); appname.setText(hookee); //regEx.setChecked(isReg); diff --git a/app/src/main/java/monkeylord/XServer/XposedEntry.java b/app/src/main/java/monkeylord/XServer/XposedEntry.java index 6d38b86..f80eaa1 100644 --- a/app/src/main/java/monkeylord/XServer/XposedEntry.java +++ b/app/src/main/java/monkeylord/XServer/XposedEntry.java @@ -1,29 +1,9 @@ package monkeylord.XServer; -import android.content.BroadcastReceiver; +import android.app.AndroidAppHelper; import android.content.pm.ApplicationInfo; import android.content.res.XModuleResources; -import android.os.MemoryFile; import android.os.Process; - -import java.io.BufferedInputStream; -import java.io.BufferedReader; -import java.io.BufferedWriter; -import java.io.File; -import java.io.FileDescriptor; -import java.io.FileInputStream; -import java.io.FileReader; -import java.io.FileWriter; -import java.io.IOException; -import java.io.InputStreamReader; -import java.io.OutputStream; -import java.io.OutputStreamWriter; -import java.io.Writer; -import java.net.InetAddress; -import java.net.ServerSocket; -import java.net.Socket; -import java.util.HashMap; - import de.robv.android.xposed.IXposedHookLoadPackage; import de.robv.android.xposed.IXposedHookZygoteInit; import de.robv.android.xposed.XC_MethodReplacement; @@ -31,9 +11,6 @@ import de.robv.android.xposed.XposedBridge; import de.robv.android.xposed.XposedHelpers; import de.robv.android.xposed.callbacks.XC_LoadPackage; -import monkeylord.XServer.utils.NanoHTTPD; -import monkeylord.XServer.utils.netUtil; - /* 某些Android 4版本,需要修改依赖库的配置才能兼容,否则会报pre-verifed错误。 @@ -47,49 +24,37 @@ public class XposedEntry implements IXposedHookLoadPackage, IXposedHookZygoteIni public static boolean debug=true; public static ClassLoader classLoader; public static XModuleResources res; - static File sharedFile; - static MemoryFile memFile; - String targetApp = new XSharedPreferences(this.getClass().getPackage().getName().toLowerCase(), "XServer").getString("targetApp", "MadMode"); + public static XSharedPreferences sPrefs; String packageName; Boolean isFirstApplication; String processName; ApplicationInfo appInfo; + @Override + public void initZygote(StartupParam startupParam) throws Throwable { + res = XModuleResources.createInstance(startupParam.modulePath, null); + sPrefs = new XSharedPreferences(this.getClass().getPackage().getName().toLowerCase(), "XServer"); + sPrefs.makeWorldReadable(); + } + @Override public void handleLoadPackage(XC_LoadPackage.LoadPackageParam loadPackageParam) throws Throwable { - //告知界面模块已启动 + //告知界面模块已启动,同时解除Android N以上对MODE_WORLD_READABLE的限制 if (loadPackageParam.packageName.equals("monkeylord.xserver")) { XposedHelpers.findAndHookMethod("monkeylord.XServer.MainActivity", loadPackageParam.classLoader, "isModuleActive", XC_MethodReplacement.returnConstant(true)); - XposedHelpers.findAndHookMethod("monkeylord.XServer.MainActivity", loadPackageParam.classLoader, "getFile", XC_MethodReplacement.returnConstant(sharedFile)); - } - //System Server方法(这次应该兼容MIUI了) - if(loadPackageParam.packageName.equals("android")){ - //systemServer(); - return; - }else { - String App=new netUtil("http://127.0.0.1:7999/","",null).getRet(); - if(App.length()>0)targetApp=App; + XposedHelpers.findAndHookMethod("android.app.ContextImpl", loadPackageParam.classLoader, "checkMode",int.class, XC_MethodReplacement.returnConstant(null)); } - XposedBridge.log("[XServer Debug]:ThisApp->"+loadPackageParam.packageName); - XposedBridge.log("[XServer Debug]:TargetApp->"+targetApp); - //刷新目标APP名称 - //从共享文件中刷新目标APP名称(For Android 7.0, MIUI not compatible, sad...) - /* - String memApp=new BufferedReader(new InputStreamReader(memFile.getInputStream())).readLine().trim(); - if(memApp.length()!=0)targetApp=memApp; - else memFile.writeBytes(targetApp.getBytes(),0,0,targetApp.length()); - */ - //从共享文件中刷新目标APP名称(For Android 7.0) - //targetApp=new BufferedReader(new FileReader(sharedFile)).readLine(); - //从XPreferences中刷新目标APP名称(Unavailable in Android 7.0) - //targetApp = new XSharedPreferences(this.getClass().getPackage().getName().toLowerCase(), "XServer").getString("targetApp", "monkeylord.demoapp"); + //获取目标包名 + sPrefs.reload(); + String targetApp = sPrefs.getString("targetApp", "MadMode"); + //if(targetApp.equals("MadMode"))XposedBridge.log("XServer Cannot Figure Out TargetApp...Hooking Everyone Now!!"); if (!targetApp.equals("MadMode")&&!loadPackageParam.packageName.equals(targetApp)) return; gatherInfo(loadPackageParam); //启动XServer - new XServer(8000); + if(!targetApp.equals("MadMode"))new XServer(8000); new XServer(Process.myPid()); - XposedBridge.log("XServer Listening..."); + XposedBridge.log("XServer Listening... @"+loadPackageParam.packageName); } private void gatherInfo(XC_LoadPackage.LoadPackageParam loadPackageParam) { @@ -99,40 +64,4 @@ private void gatherInfo(XC_LoadPackage.LoadPackageParam loadPackageParam) { processName = loadPackageParam.processName; appInfo = loadPackageParam.appInfo; } - - @Override - public void initZygote(StartupParam startupParam) throws Throwable { - res = XModuleResources.createInstance(startupParam.modulePath, null); - //内存文件 - /* - try { - memFile=new MemoryFile("xserver",512); - memFile.allowPurging(false); - targetApp=targetApp+"\r\n"; - memFile.writeBytes(targetApp.getBytes(), 0, 0, targetApp.length()); - }catch (IOException e){ - XposedBridge.log("MemoryFile 写入异常"); - } - */ - //临时文件 - /* - BufferedWriter writer; - String filePath="/data/data/"+this.getClass().getPackage().getName().toLowerCase()+"/XServer.conf"; - XposedBridge.log(filePath); - - sharedFile=new File(filePath); - if (!sharedFile.exists()){ - sharedFile.createNewFile(); - Runtime.getRuntime().exec("chmod 777 "+filePath); - } - //targetApp=new BufferedReader(new FileReader(sharedFile)).readLine(); - //if(targetApp==null)targetApp="com.example"; - //sharedFile.setReadable(true); - //sharedFile.setWritable(true); - //sharedfd=new FileInputStream(sharedFile).getFD(); - writer=new BufferedWriter(new FileWriter(sharedFile)); - writer.write(targetApp); - writer.flush(); - */ - } } diff --git a/app/src/main/java/monkeylord/XServer/utils/TargetService.java b/app/src/main/java/monkeylord/XServer/utils/TargetService.java deleted file mode 100644 index 1116c11..0000000 --- a/app/src/main/java/monkeylord/XServer/utils/TargetService.java +++ /dev/null @@ -1,38 +0,0 @@ -package monkeylord.XServer.utils; - -import android.app.Service; -import android.content.Intent; -import android.content.SharedPreferences; -import android.os.Binder; -import android.os.IBinder; -import android.support.annotation.Nullable; -import android.util.Log; - -import java.util.HashMap; - -import de.robv.android.xposed.XposedBridge; -import monkeylord.XServer.MainActivity; - -public class TargetService extends Service { - public TargetService() { - try { - new NanoHTTPD(7999){ - @Override - public Response serve(IHTTPSession session) { - SharedPreferences sp = getSharedPreferences("XServer", MODE_PRIVATE); - String targetApp = sp.getString("targetApp", "com."); - return newFixedLengthResponse(targetApp); - } - }.start(); - Log.d("XServer", "XServer SystemServer Started"); - }catch (Exception e){ - Log.d("XServer", "XServer SystemServer Fail"); - } - } - - @Nullable - @Override - public IBinder onBind(Intent intent) { - return null; - } -} diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 3df69a7..598da9e 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.4-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-4.6-all.zip