Skip to content

Commit 8a79301

Browse files
author
Monkeylord
committed
在Xposed中,使用共享内存传递要hook的应用
For xposed, implement shared memory to select hook target
1 parent fefe97d commit 8a79301

2 files changed

Lines changed: 57 additions & 0 deletions

File tree

app/src/main/java/monkeylord/XServer/MainActivity.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import android.content.pm.PackageInfo;
99
import android.graphics.Color;
1010
import android.os.Bundle;
11+
import android.os.MemoryFile;
1112
import android.util.Log;
1213
import android.view.View;
1314
import android.view.ViewGroup;
@@ -18,9 +19,17 @@
1819
import android.widget.ImageView;
1920
import android.widget.LinearLayout;
2021
import android.widget.TextView;
22+
23+
import java.io.BufferedOutputStream;
24+
import java.io.BufferedWriter;
2125
import java.io.File;
26+
import java.io.IOException;
27+
import java.io.OutputStream;
28+
import java.io.OutputStreamWriter;
2229
import java.util.List;
2330

31+
import monkeylord.XServer.handler.MemoryHandler;
32+
2433
public class MainActivity extends Activity {
2534
SharedPreferences sp;
2635
String hookee;
@@ -32,6 +41,7 @@ public class MainActivity extends Activity {
3241
private static boolean isModuleActive() {
3342
return false;
3443
}
44+
private static long getSharedMem() {return 0;}
3545

3646
public void makeWorldReadable(){
3747
new File("/data/data/" + XServer.class.getPackage().getName().toLowerCase()).setExecutable(true, false);
@@ -122,6 +132,12 @@ public void update() {
122132
editor.commit();
123133
info.setText("Target App:\r\n" + hookee);
124134
appname.setText(hookee);
135+
try {
136+
long sharedMem = getSharedMem();
137+
if(sharedMem!=0)MemoryHandler.writeMemory(sharedMem,(hookee+"\0").getBytes());
138+
} catch (Exception e) {
139+
e.printStackTrace();
140+
}
125141
//regEx.setChecked(isReg);
126142
}
127143

app/src/main/java/monkeylord/XServer/XposedEntry.java

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,29 @@
11
package monkeylord.XServer;
22

3+
import android.annotation.SuppressLint;
34
import android.content.pm.ApplicationInfo;
45
import android.content.res.XModuleResources;
56
import android.os.Build;
7+
import android.os.MemoryFile;
68
import android.os.Process;
9+
import android.system.Os;
10+
import android.system.OsConstants;
11+
import android.util.Log;
712

13+
import java.io.BufferedInputStream;
14+
import java.io.BufferedReader;
15+
import java.io.File;
16+
import java.io.FileDescriptor;
17+
import java.io.FileInputStream;
18+
import java.io.FileOutputStream;
19+
import java.io.IOException;
20+
import java.io.InputStreamReader;
21+
import java.io.OutputStream;
22+
import java.io.RandomAccessFile;
23+
import java.lang.reflect.Constructor;
24+
import java.lang.reflect.InvocationTargetException;
825
import java.lang.reflect.Member;
26+
import java.lang.reflect.Method;
927
import java.util.HashMap;
1028

1129
import de.robv.android.xposed.IXposedHookLoadPackage;
@@ -20,6 +38,7 @@
2038
import monkeylord.XServer.handler.Hook.XServer_MethodHook;
2139
import monkeylord.XServer.handler.Hook.XServer_Param;
2240
import monkeylord.XServer.handler.HookHandler;
41+
import monkeylord.XServer.handler.MemoryHandler;
2342

2443
/*
2544
某些Android 4版本,需要修改依赖库的配置才能兼容,否则会报pre-verifed错误。
@@ -38,12 +57,32 @@ public class XposedEntry implements IXposedHookLoadPackage, IXposedHookZygoteIni
3857
Boolean isFirstApplication;
3958
String processName;
4059
ApplicationInfo appInfo;
60+
long smAddr;
4161

4262
@Override
4363
public void initZygote(StartupParam startupParam) throws Throwable {
4464
res = XModuleResources.createInstance(startupParam.modulePath, null);
4565
sPrefs = new XSharedPreferences(this.getClass().getPackage().getName().toLowerCase(), "XServer");
4666
sPrefs.makeWorldReadable();
67+
try{
68+
String targetApp = sPrefs.getString("targetApp", "MadMode");
69+
File file = new File("/dev/zero");
70+
RandomAccessFile randomAccessFile = new RandomAccessFile(file,"rw");
71+
FileDescriptor fd = randomAccessFile.getFD();
72+
if(!fd.valid())smAddr = 0;
73+
else{
74+
try {
75+
smAddr = MemoryHandler.mmap(0, 1024, OsConstants.PROT_READ | OsConstants.PROT_WRITE, OsConstants.MAP_SHARED, fd, 0);
76+
MemoryHandler.writeMemory(smAddr,(targetApp+"\0").getBytes());
77+
}catch (InvocationTargetException e){
78+
throw e.getTargetException();
79+
}finally {
80+
randomAccessFile.close();
81+
}
82+
}
83+
}catch (Exception e){
84+
Log.e("[XServer Experiment]", e.getMessage()+e.toString());
85+
}
4786
}
4887

4988
@Override
@@ -52,12 +91,14 @@ public void handleLoadPackage(XC_LoadPackage.LoadPackageParam loadPackageParam)
5291
//告知界面模块已启动,同时解除Android N以上对MODE_WORLD_READABLE的限制
5392
if (loadPackageParam.packageName.equals("monkeylord.xserver")) {
5493
XposedHelpers.findAndHookMethod("monkeylord.XServer.MainActivity", loadPackageParam.classLoader, "isModuleActive", XC_MethodReplacement.returnConstant(true));
94+
XposedHelpers.findAndHookMethod("monkeylord.XServer.MainActivity", loadPackageParam.classLoader, "getSharedMem", XC_MethodReplacement.returnConstant(smAddr));
5595
if (Build.VERSION.SDK_INT >= 24)XposedHelpers.findAndHookMethod("android.app.ContextImpl", loadPackageParam.classLoader, "checkMode",int.class, XC_MethodReplacement.returnConstant(null));
5696
XposedBridge.log("XServer handleLoadPackage: "+ Build.VERSION.SDK_INT);
5797
}
5898
//获取目标包名
5999
sPrefs.reload();
60100
String targetApp = sPrefs.getString("targetApp", "MadMode");
101+
if (targetApp.equals("MadMode")&&smAddr!=0)targetApp = new String(MemoryHandler.readMemory(smAddr,1024)).split("\0")[0];
61102
//if(targetApp.equals("MadMode"))XposedBridge.log("XServer Cannot Figure Out TargetApp...Hooking Everyone Now!!");
62103
if (!targetApp.equals("MadMode")&&!loadPackageParam.packageName.equals(targetApp)) return;
63104
gatherInfo(loadPackageParam);

0 commit comments

Comments
 (0)