From 9373508fdaecc930f5e8d871744aa458e713faff Mon Sep 17 00:00:00 2001 From: 327135569 Date: Wed, 28 Apr 2021 20:24:47 +0800 Subject: [PATCH] minor fix --- .../lspatch/loader/LSPApplication.java | 30 ++++++++++++------- .../lspatch/appstub/LSPApplicationStub.java | 22 ++++++++++---- mmp | 2 +- .../main/java/org/lsposed/patch/LSPatch.java | 4 ++- 4 files changed, 40 insertions(+), 18 deletions(-) diff --git a/app/src/main/java/org/lsposed/lspatch/loader/LSPApplication.java b/app/src/main/java/org/lsposed/lspatch/loader/LSPApplication.java index a342eafc..be2bdc28 100644 --- a/app/src/main/java/org/lsposed/lspatch/loader/LSPApplication.java +++ b/app/src/main/java/org/lsposed/lspatch/loader/LSPApplication.java @@ -19,7 +19,10 @@ import org.lsposed.lspd.nativebridge.SigBypass; import org.lsposed.lspd.yahfa.hooker.YahfaHooker; +import java.io.File; +import java.io.FileOutputStream; import java.io.IOException; +import java.io.InputStream; import java.lang.reflect.Field; import java.lang.reflect.Modifier; import java.util.ArrayList; @@ -33,7 +36,7 @@ * Created by Windysha */ @SuppressLint("UnsafeDynamicallyLoadedCode") -public class LSPApplication extends Application { +public class LSPApplication { private static final String ORIGINAL_APPLICATION_NAME_ASSET_PATH = "original_application_name.ini"; private static final String ORIGINAL_SIGNATURE_ASSET_PATH = "original_signature_info.ini"; private static final String TAG = LSPApplication.class.getSimpleName(); @@ -207,7 +210,7 @@ protected void afterHookedMethod(MethodHookParam param) throws Throwable { }); } - private static void doHook() throws IllegalAccessException, ClassNotFoundException { + private static void doHook() throws IllegalAccessException, ClassNotFoundException, IOException { hookContextImplSetOuterContext(); hookInstallContentProviders(); hookActivityAttach(); @@ -216,7 +219,20 @@ private static void doHook() throws IllegalAccessException, ClassNotFoundExcepti byPassSignature(); } if (fetchSigbypassLv() >= Constants.SIGBYPASS_LV_PM_OPENAT) { - SigBypass.enableOpenatHook(); + File apk = new File(context.getCacheDir(), "lspatchapk.so"); + if (!apk.exists()) { + try (InputStream inputStream = context.getAssets().open("origin_apk.bin"); + FileOutputStream buffer = new FileOutputStream(apk)) { + + int nRead; + byte[] data = new byte[16384]; + + while ((nRead = inputStream.read(data, 0, data.length)) != -1) { + buffer.write(data, 0, nRead); + } + } + } + SigBypass.enableOpenatHook(context.getApplicationInfo().packageName); } } @@ -227,8 +243,7 @@ private static int fetchSigbypassLv() { return cacheSigbypassLv; } for (int i = Constants.SIGBYPASS_LV_DISABLE; i < Constants.SIGBYPASS_LV_MAX; i++) { - try { - context.getAssets().open(Constants.CONFIG_NAME_SIGBYPASSLV + i); + try (InputStream inputStream = context.getAssets().open(Constants.CONFIG_NAME_SIGBYPASSLV + i)) { cacheSigbypassLv = i; return i; } @@ -299,7 +314,6 @@ private static Object getActivityThread() { return activityThread; } - @Override protected void attachBaseContext(Context base) { // 将applicationInfo中保存的applcation class name还原为真实的application class name @@ -307,8 +321,6 @@ protected void attachBaseContext(Context base) { modifyApplicationInfoClassName(); } - super.attachBaseContext(base); - if (isApplicationProxied()) { attachOrignalBaseContext(base); setLoadedApkField(base); @@ -339,11 +351,9 @@ private void setLoadedApkField(Context base) { } } - @Override public void onCreate() { // setLoadedApkField(sOriginalApplication); // XposedHelpers.setObjectField(sOriginalApplication, "mLoadedApk", XposedHelpers.getObjectField(this, "mLoadedApk")); - super.onCreate(); if (isApplicationProxied()) { // replaceApplication(); diff --git a/appstub/src/main/java/org/lsposed/lspatch/appstub/LSPApplicationStub.java b/appstub/src/main/java/org/lsposed/lspatch/appstub/LSPApplicationStub.java index 143d9b40..e573020d 100644 --- a/appstub/src/main/java/org/lsposed/lspatch/appstub/LSPApplicationStub.java +++ b/appstub/src/main/java/org/lsposed/lspatch/appstub/LSPApplicationStub.java @@ -26,9 +26,8 @@ public class LSPApplicationStub extends Application { Log.e(TAG, "create context err"); } else { - try { - InputStream inputStream = context.getAssets().open("lsploader.dex"); - ByteArrayOutputStream buffer = new ByteArrayOutputStream(); + try (InputStream inputStream = context.getAssets().open("lsploader.dex"); + ByteArrayOutputStream buffer = new ByteArrayOutputStream()) { int nRead; byte[] data = new byte[16384]; @@ -37,9 +36,6 @@ public class LSPApplicationStub extends Application { buffer.write(data, 0, nRead); } - buffer.flush(); - buffer.close(); - // loader can load it's own so from app native library dir String libraryDir = context.getApplicationInfo().nativeLibraryDir; @@ -57,6 +53,20 @@ public class LSPApplicationStub extends Application { } } + @Override + public void onCreate() { + super.onCreate(); + + if (realLSPApplication != null) { + try { + realLSPApplication.getClass().getDeclaredMethod("onCreate").invoke(realLSPApplication); + } + catch (Exception e) { + throw new IllegalStateException("wtf", e); + } + } + } + @Override protected void attachBaseContext(Context base) { super.attachBaseContext(base); diff --git a/mmp b/mmp index efe7306f..41668cd0 160000 --- a/mmp +++ b/mmp @@ -1 +1 @@ -Subproject commit efe7306fed1bcf5bde7ff8d45f2316ddc81e4e4b +Subproject commit 41668cd0ad080e18b527ad70db4b8828059e3257 diff --git a/patch/src/main/java/org/lsposed/patch/LSPatch.java b/patch/src/main/java/org/lsposed/patch/LSPatch.java index b8c1abbc..187f2eff 100644 --- a/patch/src/main/java/org/lsposed/patch/LSPatch.java +++ b/patch/src/main/java/org/lsposed/patch/LSPatch.java @@ -19,6 +19,7 @@ import java.io.File; import java.io.IOException; +import java.nio.charset.Charset; import java.text.SimpleDateFormat; import java.util.Date; import java.util.regex.Pattern; @@ -184,7 +185,8 @@ protected void doCommandLine() throws IOException { } // save lspatch config to asset.. - fuckIfFail(new File(unzipApkFilePath, "assets/" + Constants.CONFIG_NAME_SIGBYPASSLV + sigbypassLevel).createNewFile()); + org.apache.commons.io.FileUtils.write(new File(unzipApkFilePath, "assets" + File.separator + Constants.CONFIG_NAME_SIGBYPASSLV + sigbypassLevel), "lspatch", + Charset.defaultCharset()); // compress all files into an apk and then sign it. new BuildAndSignApkTask(true, unzipApkFilePath, outputPath).run();