Skip to content

Commit d8806c9

Browse files
committed
v2.4 - fix Android >=7 problems and some others bugs
1 parent a8744cd commit d8806c9

28 files changed

+261
-175
lines changed

.idea/codeStyles/Project.xml

Lines changed: 29 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

.idea/gradle.xml

Lines changed: 1 addition & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

.idea/misc.xml

Lines changed: 1 addition & 14 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

app/build.gradle

Lines changed: 15 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,14 @@
11
apply plugin: 'com.android.application'
22

33
android {
4-
compileSdkVersion 23
5-
buildToolsVersion '25.0.0'
6-
4+
compileSdkVersion 26
5+
buildToolsVersion '28.0.2'
76
defaultConfig {
87
applicationId "mobi.acpm.inspeckage"
9-
minSdkVersion 18
10-
targetSdkVersion 23
11-
versionCode 9
12-
versionName "2.3"
8+
minSdkVersion 21
9+
targetSdkVersion 26
10+
versionCode 10
11+
versionName "2.4"
1312
}
1413

1514
buildTypes {
@@ -24,13 +23,13 @@ android {
2423

2524

2625
dependencies {
27-
compile fileTree(dir: 'libs', include: ['*.jar'])
28-
provided 'de.robv.android.xposed:api:5+'
29-
compile 'com.google.code.gson:gson:2+'
30-
compile group: 'org.nanohttpd', name: 'nanohttpd', version: '2.3.1'
31-
compile 'com.android.support:appcompat-v7:22.2.1'
32-
compile 'com.android.support:design:22.2.1'
33-
compile 'com.android.support:support-v4:22.2.1'
34-
compile 'org.java-websocket:Java-WebSocket:1.3.0'
35-
compile 'com.google.android.gms:play-services:6.5.87'
26+
implementation fileTree(dir: 'libs', include: ['*.jar'])
27+
compileOnly 'de.robv.android.xposed:api:5+'
28+
implementation 'com.google.code.gson:gson:2+'
29+
implementation group: 'org.nanohttpd', name: 'nanohttpd', version: '2.3.1'
30+
implementation 'com.android.support:appcompat-v7:26.1.0'
31+
implementation 'com.android.support:design:26.1.0'
32+
implementation 'com.android.support:support-v4:26.1.0'
33+
implementation 'org.java-websocket:Java-WebSocket:1.3.0'
34+
implementation 'com.google.android.gms:play-services:12.0.1'
3635
}

app/src/main/AndroidManifest.xml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,12 @@
5252
<meta-data android:name="com.google.android.gms.version"
5353
android:value="@integer/google_play_services_version" />
5454

55+
<receiver android:name=".receivers.InspeckageWebReceiver" android:exported="false">
56+
<intent-filter>
57+
<action android:name="mobi.acpm.inspeckage.INSPECKAGE_FILTER"/>
58+
</intent-filter>
59+
</receiver>
60+
5561
</application>
5662

5763
</manifest>

app/src/main/java/mobi/acpm/inspeckage/Module.java

Lines changed: 29 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,23 @@
11
package mobi.acpm.inspeckage;
22

3+
import android.app.AndroidAppHelper;
4+
import android.content.Context;
5+
import android.os.Handler;
6+
import android.os.Looper;
7+
8+
import java.io.File;
9+
310
import de.robv.android.xposed.IXposedHookLoadPackage;
411
import de.robv.android.xposed.IXposedHookZygoteInit;
512
import de.robv.android.xposed.XC_MethodHook;
613
import de.robv.android.xposed.XC_MethodReplacement;
714
import de.robv.android.xposed.XSharedPreferences;
815
import de.robv.android.xposed.XposedBridge;
916
import de.robv.android.xposed.callbacks.XC_LoadPackage;
10-
import mobi.acpm.inspeckage.hooks.FingerprintHook;
1117
import mobi.acpm.inspeckage.hooks.ClipboardHook;
1218
import mobi.acpm.inspeckage.hooks.CryptoHook;
1319
import mobi.acpm.inspeckage.hooks.FileSystemHook;
20+
import mobi.acpm.inspeckage.hooks.FingerprintHook;
1421
import mobi.acpm.inspeckage.hooks.FlagSecureHook;
1522
import mobi.acpm.inspeckage.hooks.HashHook;
1623
import mobi.acpm.inspeckage.hooks.HttpHook;
@@ -26,7 +33,6 @@
2633
import mobi.acpm.inspeckage.hooks.WebViewHook;
2734
import mobi.acpm.inspeckage.hooks.entities.LocationHook;
2835
import mobi.acpm.inspeckage.util.Config;
29-
import mobi.acpm.inspeckage.util.DexUtil;
3036
import mobi.acpm.inspeckage.util.FileType;
3137
import mobi.acpm.inspeckage.util.FileUtil;
3238

@@ -54,12 +60,25 @@ public void handleLoadPackage(XC_LoadPackage.LoadPackageParam loadPackageParam)
5460

5561
sPrefs.reload();
5662

57-
//estes hooks tem que ocorrer na inicialização
58-
//ProcessHook.initAllHooks(loadPackageParam);
59-
6063
//check if this module is enable
6164
if (loadPackageParam.packageName.equals("mobi.acpm.inspeckage")) {
6265
findAndHookMethod("mobi.acpm.inspeckage.webserver.WebServer", loadPackageParam.classLoader, "isModuleEnabled", XC_MethodReplacement.returnConstant(true));
66+
67+
//workaround to bypass MODE_PRIVATE of shared_prefs
68+
findAndHookMethod("android.app.SharedPreferencesImpl.EditorImpl", loadPackageParam.classLoader, "notifyListeners",
69+
"android.app.SharedPreferencesImpl.MemoryCommitResult", new XC_MethodHook() {
70+
71+
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
72+
//workaround to bypass the concurrency (io)
73+
Handler handler = new Handler(Looper.getMainLooper());
74+
handler.postDelayed(new Runnable() {
75+
public void run() {
76+
Context context = (Context) AndroidAppHelper.currentApplication();
77+
FileUtil.fixSharedPreference(context);
78+
}
79+
}, 1000);
80+
}
81+
});
6382
}
6483

6584
if (loadPackageParam.packageName.equals("mobi.acpm.inspeckage"))
@@ -68,6 +87,10 @@ public void handleLoadPackage(XC_LoadPackage.LoadPackageParam loadPackageParam)
6887
if (!loadPackageParam.packageName.equals(sPrefs.getString("package", "")))
6988
return;
7089

90+
//inspeckage needs access to the files
91+
File folder = new File(sPrefs.getString(Config.SP_DATA_DIR, null));
92+
folder.setExecutable(true, false);
93+
7194
findAndHookMethod("android.util.Log", loadPackageParam.classLoader, "i",
7295
String.class, String.class, new XC_MethodHook() {
7396

@@ -153,7 +176,7 @@ protected void afterHookedMethod(MethodHookParam param) throws Throwable {
153176
}
154177
FingerprintHook.initAllHooks(loadPackageParam);
155178

156-
DexUtil.saveClassesWithMethodsJson(loadPackageParam, sPrefs);
179+
//DexUtil.saveClassesWithMethodsJson(loadPackageParam, sPrefs);
157180
}
158181

159182
public static void logError(Error e){

app/src/main/java/mobi/acpm/inspeckage/hooks/FileSystemHook.java

Lines changed: 22 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -35,15 +35,13 @@ protected void afterHookedMethod(MethodHookParam param) throws Throwable {
3535

3636
String m;
3737
switch (mode) {
38+
3839
case android.content.Context.MODE_PRIVATE:
3940
m = "MODE_PRIVATE";
4041
break;
41-
case android.content.Context.MODE_WORLD_READABLE:
42-
m = "MODE_WORLD_READABLE";
43-
break;
44-
case android.content.Context.MODE_WORLD_WRITEABLE:
45-
m = "MODE_WORLD_WRITEABLE";
46-
break;
42+
//case android.content.Context.MODE_WORLD_WRITEABLE:
43+
// m = "MODE_WORLD_WRITEABLE";
44+
//break;
4745
case android.content.Context.MODE_APPEND:
4846
m = "MODE_APPEND";
4947
break;
@@ -76,10 +74,12 @@ protected void afterHookedMethod(MethodHookParam param) throws Throwable {
7674

7775
String dir = (String) param.args[0];
7876
String fileName = (String) param.args[1];
79-
if (dir.contains("Inspeckage") || fileName.contains("Inspeckage")) {
80-
XposedBridge.invokeOriginalMethod(param.method, param.thisObject, param.args);
81-
} else {
82-
XposedBridge.log(TAG + "R/W Dir: " + dir + " File: " + fileName);
77+
if(dir != null) {
78+
if (dir.contains("Inspeckage") || fileName.contains("Inspeckage")) {
79+
XposedBridge.invokeOriginalMethod(param.method, param.thisObject, param.args);
80+
} else {
81+
XposedBridge.log(TAG + "R/W Dir: " + dir + " File: " + fileName);
82+
}
8383
}
8484
}
8585
});
@@ -91,10 +91,12 @@ protected void afterHookedMethod(MethodHookParam param) throws Throwable {
9191

9292
File fileDir = (File) param.args[0];
9393
String fileName = (String) param.args[1];
94-
if (fileDir.getAbsolutePath().contains("Inspeckage") || fileName.contains("Inspeckage")) {
95-
XposedBridge.invokeOriginalMethod(param.method, param.thisObject, param.args);
96-
} else {
97-
XposedBridge.log(TAG + "R/W Dir: " + fileDir.getAbsolutePath() + " File: " + fileName);
94+
if(fileDir != null) {
95+
if (fileDir.getAbsolutePath().contains("Inspeckage") || fileName.contains("Inspeckage")) {
96+
XposedBridge.invokeOriginalMethod(param.method, param.thisObject, param.args);
97+
} else {
98+
XposedBridge.log(TAG + "R/W Dir: " + fileDir.getAbsolutePath() + " File: " + fileName);
99+
}
98100
}
99101
}
100102
});
@@ -104,10 +106,12 @@ protected void afterHookedMethod(MethodHookParam param) throws Throwable {
104106
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
105107

106108
URI uri = (URI) param.args[0];
107-
if (uri.toString().contains("Inspeckage")) {
108-
XposedBridge.invokeOriginalMethod(param.method, param.thisObject, param.args);
109-
} else {
110-
XposedBridge.log(TAG + "R/W [new File(URI)]: " + uri.toString());
109+
if(uri!=null) {
110+
if (uri.toString().contains("Inspeckage")) {
111+
XposedBridge.invokeOriginalMethod(param.method, param.thisObject, param.args);
112+
} else {
113+
XposedBridge.log(TAG + "R/W [new File(URI)]: " + uri.toString());
114+
}
111115
}
112116
}
113117
});

0 commit comments

Comments
 (0)