From 6120bee5129913d74de4d81706d3c0333f75a698 Mon Sep 17 00:00:00 2001 From: wlt233 <1486185683@qq.com> Date: Fri, 1 Sep 2023 10:44:39 +0800 Subject: [PATCH] add pmmtool switch --- .../java/moe/tqlwsl/aicemu/SettingActivity.kt | 16 +++- app/src/main/java/moe/tqlwsl/aicemu/xp.java | 76 +++++++++++-------- app/src/main/res/layout/activity_setting.xml | 33 ++++++++ app/src/main/res/values-zh/strings.xml | 2 + app/src/main/res/values/strings.xml | 4 + 5 files changed, 97 insertions(+), 34 deletions(-) diff --git a/app/src/main/java/moe/tqlwsl/aicemu/SettingActivity.kt b/app/src/main/java/moe/tqlwsl/aicemu/SettingActivity.kt index 7ec73de..04b09df 100644 --- a/app/src/main/java/moe/tqlwsl/aicemu/SettingActivity.kt +++ b/app/src/main/java/moe/tqlwsl/aicemu/SettingActivity.kt @@ -1,6 +1,9 @@ package moe.tqlwsl.aicemu + import android.annotation.SuppressLint +import android.content.Context +import android.content.SharedPreferences import android.content.pm.PackageManager import android.graphics.Color import android.os.Build @@ -8,9 +11,11 @@ import android.os.Bundle import android.util.Log import android.widget.TextView import androidx.appcompat.app.AppCompatActivity +import androidx.appcompat.widget.SwitchCompat import org.lsposed.hiddenapibypass.HiddenApiBypass import java.lang.reflect.Method + class SettingActivity : AppCompatActivity() { private var isHCEFSupported: Boolean = false private var isHCEFUnlocked: Boolean = false @@ -34,8 +39,8 @@ class SettingActivity : AppCompatActivity() { textHCEF.setTextColor(Color.RED) } + val textUnlocker = findViewById(R.id.unlocker_work_text) if (isHCEFSupported) { - val textUnlocker = findViewById(R.id.unlocker_work_text) try { val globalVar = this.applicationContext as GlobalVar isHCEFUnlocked = globalVar.isHCEFUnlocked @@ -67,6 +72,15 @@ class SettingActivity : AppCompatActivity() { // textPmmtool.setTextColor(Color.GREEN) // } + val pmmtoolSwitch = findViewById(R.id.pmmtool_switch) + pmmtoolSwitch.setOnCheckedChangeListener { _, isChecked -> + var prefs: SharedPreferences = + applicationContext.getSharedPreferences("AICEmu", Context.MODE_WORLD_READABLE) + val editor = prefs.edit() + editor.putBoolean("loadPmmtool", isChecked) + editor.apply() + Runtime.getRuntime().exec(arrayOf("su", "-c", "kill -9 $(su -c pidof com.android.nfc)")) + } } } diff --git a/app/src/main/java/moe/tqlwsl/aicemu/xp.java b/app/src/main/java/moe/tqlwsl/aicemu/xp.java index c76c69f..be1a47f 100644 --- a/app/src/main/java/moe/tqlwsl/aicemu/xp.java +++ b/app/src/main/java/moe/tqlwsl/aicemu/xp.java @@ -1,9 +1,14 @@ package moe.tqlwsl.aicemu; +import android.annotation.SuppressLint; +import android.app.Activity; +import android.app.ActivityManager; import android.app.Application; import android.content.Context; +import android.content.SharedPreferences; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; +import android.os.Bundle; import android.util.Log; import java.util.List; @@ -11,6 +16,7 @@ import java.util.List; import de.robv.android.xposed.IXposedHookLoadPackage; import de.robv.android.xposed.XC_MethodHook; import de.robv.android.xposed.XC_MethodReplacement; +import de.robv.android.xposed.XSharedPreferences; import de.robv.android.xposed.XposedBridge; import de.robv.android.xposed.XposedHelpers; import de.robv.android.xposed.callbacks.XC_LoadPackage; @@ -24,7 +30,6 @@ public class xp implements IXposedHookLoadPackage { public void handleLoadPackage(XC_LoadPackage.LoadPackageParam lpparam) throws Throwable { XposedBridge.log("In " + lpparam.packageName); - if (lpparam.packageName.equals("com.android.nfc")) { XposedHelpers.findAndHookMethod("android.nfc.cardemulation.NfcFCardEmulation", lpparam.classLoader, @@ -36,45 +41,47 @@ public class xp implements IXposedHookLoadPackage { }); -// XposedHelpers.findAndHookMethod("com.android.nfc.NfcApplication", -// lpparam.classLoader, "onCreate", new XC_MethodHook() { -// @Override -// protected void beforeHookedMethod(XC_MethodHook.MethodHookParam param) throws Throwable { -// XposedBridge.log("Inside com.android.nfc.NfcApplication#onCreate"); -// super.beforeHookedMethod(param); -// Application application = (Application) param.thisObject; -// mcontext = application.getApplicationContext(); -// XposedBridge.log("Got context"); -// } -// }); + XposedHelpers.findAndHookMethod("com.android.nfc.NfcApplication", + lpparam.classLoader, "onCreate", new XC_MethodHook() { + @Override + protected void beforeHookedMethod(XC_MethodHook.MethodHookParam param) throws Throwable { + XposedBridge.log("Inside com.android.nfc.NfcApplication#onCreate"); + super.beforeHookedMethod(param); + Application application = (Application) param.thisObject; + mcontext = application.getApplicationContext(); + XposedBridge.log("Got context"); + } + }); XposedHelpers.findAndHookMethod("android.nfc.cardemulation.NfcFCardEmulation", lpparam.classLoader, "isValidSystemCode", String.class, new XC_MethodHook() { @Override protected void afterHookedMethod(XC_MethodHook.MethodHookParam param) throws Throwable { - super.afterHookedMethod(param); XposedBridge.log("Inside android.nfc.cardemulation.NfcFCardEmulation#isValidSystemCode"); -// mclassloader = mcontext.getClassLoader(); -// XposedBridge.log("Got classloader"); -// String path = getSoPath(); -// XposedBridge.log("So path = " + path); -// int version = android.os.Build.VERSION.SDK_INT; -// try { -// if (!path.equals("")) { -// XposedBridge.log("Start injecting libpmm.so"); -// if (version >= 28) { -// XposedHelpers.callMethod(Runtime.getRuntime(), "nativeLoad", path, mclassloader); -// } else { -// XposedHelpers.callMethod(Runtime.getRuntime(), "doLoad", path, mclassloader); -// } -// XposedBridge.log("Injected libpmm.so"); -// } -// } catch (Exception e) { -// XposedBridge.log(e); -// e.printStackTrace(); -// } + mclassloader = mcontext.getClassLoader(); + XposedBridge.log("Got classloader"); + String path = getSoPath(); + XposedBridge.log("So path = " + path); + try { + Boolean needLoadPmmtool = false; + XSharedPreferences pref = getPref(); + if (pref != null) { + needLoadPmmtool = pref.getBoolean("loadPmmtool", false); + } else { + XposedBridge.log("Cannot load pref for AICEmu properly"); + } + XposedBridge.log("loadPmmtool: " + needLoadPmmtool.toString()); + if (needLoadPmmtool && !path.equals("")) { + XposedBridge.log("Start injecting libpmm.so"); + XposedHelpers.callMethod(Runtime.getRuntime(), "nativeLoad", path, mclassloader); + XposedBridge.log("Injected libpmm.so"); + } + } catch (Exception e) { + XposedBridge.log(e); + e.printStackTrace(); + } // Unlocker param.setResult(true); @@ -84,7 +91,10 @@ public class xp implements IXposedHookLoadPackage { XposedBridge.log("Hook succeeded!!!"); } } - + private static XSharedPreferences getPref() { + XSharedPreferences pref = new XSharedPreferences("moe.tqlwsl.aicemu", "AICEmu"); + return pref.getFile().canRead() ? pref : null; + } private String getSoPath() { try { String text = ""; diff --git a/app/src/main/res/layout/activity_setting.xml b/app/src/main/res/layout/activity_setting.xml index 3b87071..c44defa 100644 --- a/app/src/main/res/layout/activity_setting.xml +++ b/app/src/main/res/layout/activity_setting.xml @@ -40,5 +40,38 @@ app:layout_constraintTop_toBottomOf="@+id/unlocker_work_text" android:visibility="gone"/> + + + + + \ No newline at end of file diff --git a/app/src/main/res/values-zh/strings.xml b/app/src/main/res/values-zh/strings.xml index 61ae023..d53b3f6 100644 --- a/app/src/main/res/values-zh/strings.xml +++ b/app/src/main/res/values-zh/strings.xml @@ -25,4 +25,6 @@ 兼容模式 正常模式 添加测试卡 + 模拟AIC卡 + 用 Pmmtool 修改 PMm \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 70667c3..7bfc706 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -31,4 +31,8 @@ Common Compatible Add test card + Emulate AIC Card + Change PMm with Pmmtool + made by wlt233 with ❤\ntqlwsl.moe | 2709684396 + 1.0-Beta4 (2023.09.01) \ No newline at end of file