From d2820848c39aae518fe9380b360faf9e18d19fbe Mon Sep 17 00:00:00 2001 From: lliioollcn Date: Thu, 8 Sep 2022 18:49:55 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=8E=BB=E8=AF=AD=E9=9F=B3?= =?UTF-8?q?=E6=88=BF=20&=20=E6=B7=BB=E5=8A=A0appcenter=E7=BB=9F=E8=AE=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 8 ++- app/src/main/AndroidManifest.xml | 2 + .../pphelper/activity/SettingsActivity.kt | 16 ++--- .../lliiooll/pphelper/app/PPHelperImpl.java | 4 -- .../cn/lliiooll/pphelper/hook/AccountHook.kt | 32 +++++++++ .../java/cn/lliiooll/pphelper/hook/Hooks.java | 7 ++ .../pphelper/hook/RemoveVoiceRoomHook.kt | 28 +++++--- .../cn/lliiooll/pphelper/hook/ShowHideHook.kt | 67 +++++++++++++++++++ .../cn/lliiooll/pphelper/hook/TestHook.kt | 13 ++++ .../lliiooll/pphelper/startup/HookEntry.java | 6 +- .../cn/lliiooll/pphelper/utils/CliOper.java | 38 +++++++++++ .../cn/lliiooll/pphelper/utils/DexKit.java | 8 ++- .../java/cn/lliiooll/pphelper/utils/PLog.java | 21 +++++- .../java/cn/lliiooll/pphelper/utils/Utils.kt | 7 ++ .../main/res/xml/appcenter_backup_rule.xml | 7 ++ .../main/res/xml/appcenter_backup_rule_h.xml | 16 +++++ 16 files changed, 248 insertions(+), 32 deletions(-) create mode 100644 app/src/main/java/cn/lliiooll/pphelper/hook/AccountHook.kt create mode 100644 app/src/main/java/cn/lliiooll/pphelper/hook/ShowHideHook.kt create mode 100644 app/src/main/java/cn/lliiooll/pphelper/utils/CliOper.java create mode 100644 app/src/main/res/xml/appcenter_backup_rule.xml create mode 100644 app/src/main/res/xml/appcenter_backup_rule_h.xml diff --git a/app/build.gradle b/app/build.gradle index 3e57aba..5ac1edb 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -13,7 +13,8 @@ android { applicationId "cn.lliiooll.pphelper" minSdk 26 targetSdk 32 - versionCode Common.getTimeStamp()//Common.getBuildVersionCode(rootProject) + versionCode Common.getBuildVersionCode(rootProject) + //versionCode Common.getTimeStamp() versionName "1.0.0.${versionCode}${Common.getGitHeadRefsSuffix(rootProject)}" vectorDrawables.useSupportLibrary = true multiDexEnabled = false @@ -86,4 +87,9 @@ dependencies { compileOnly fileTree('lib') compileOnly 'de.robv.android.xposed:api:82' + + def appCenterSdkVersion = '4.3.1' + implementation "com.microsoft.appcenter:appcenter-analytics:${appCenterSdkVersion}" + implementation "com.microsoft.appcenter:appcenter-crashes:${appCenterSdkVersion}" + } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 8657b81..7f15509 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -16,6 +16,8 @@ android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:requestLegacyExternalStorage="true" + android:dataExtractionRules="@xml/appcenter_backup_rule_h" + android:fullBackupContent="@xml/appcenter_backup_rule" android:theme="@style/Theme.PPHelper"> (R.id.switch_noad) val switch_nomark = findViewById(R.id.switch_nomark) diff --git a/app/src/main/java/cn/lliiooll/pphelper/app/PPHelperImpl.java b/app/src/main/java/cn/lliiooll/pphelper/app/PPHelperImpl.java index 5e2f421..3defa6e 100644 --- a/app/src/main/java/cn/lliiooll/pphelper/app/PPHelperImpl.java +++ b/app/src/main/java/cn/lliiooll/pphelper/app/PPHelperImpl.java @@ -1,10 +1,6 @@ package cn.lliiooll.pphelper.app; import android.app.Application; -import cn.lliiooll.pphelper.config.ConfigManager; -import com.tencent.mmkv.MMKV; - -import java.io.File; public class PPHelperImpl extends Application { diff --git a/app/src/main/java/cn/lliiooll/pphelper/hook/AccountHook.kt b/app/src/main/java/cn/lliiooll/pphelper/hook/AccountHook.kt new file mode 100644 index 0000000..357416c --- /dev/null +++ b/app/src/main/java/cn/lliiooll/pphelper/hook/AccountHook.kt @@ -0,0 +1,32 @@ +package cn.lliiooll.pphelper.hook + +import cn.lliiooll.pphelper.utils.DexKit +import cn.lliiooll.pphelper.utils.PLog +import cn.lliiooll.pphelper.utils.hook +import de.robv.android.xposed.XC_MethodHook +import java.util.* + +object AccountHook : BaseHook("account", "账号hook") { + override fun init(): Boolean { + this.desc = "账号hook" + val clazz = DexKit.load(DexKit.OBF_ACCOUNT_SERVICE_MANAGER) + for (m in clazz?.declaredMethods!!) { + m.hook(object : XC_MethodHook() { + override fun afterHookedMethod(param: MethodHookParam?) { + PLog.log("\n========================================") + PLog.log( + "\n来自{}的方法被调用;" + "\n方法名称: {}" + "\n参数数量: {}" + "\n参数类型: {}" + "\n参数内容: {}\n当前堆栈: ", + param?.thisObject?.javaClass?.simpleName, + m.name, + m.parameterTypes.size, + Arrays.toString(m.parameterTypes), + Arrays.toString(param?.args) + ) + PLog.printStacks() + PLog.log("========================================\n") + } + }) + } + return true + } +} \ No newline at end of file diff --git a/app/src/main/java/cn/lliiooll/pphelper/hook/Hooks.java b/app/src/main/java/cn/lliiooll/pphelper/hook/Hooks.java index 612ef2e..fe5d950 100644 --- a/app/src/main/java/cn/lliiooll/pphelper/hook/Hooks.java +++ b/app/src/main/java/cn/lliiooll/pphelper/hook/Hooks.java @@ -18,7 +18,10 @@ public class Hooks { CustomVoiceHook.INSTANCE, AriaInitHook.INSTANCE, RemoveLiveHook.INSTANCE, + RemoveVoiceRoomHook.INSTANCE, TestHook.INSTANCE, + AccountHook.INSTANCE, + ShowHideHook.INSTANCE, }; /** @@ -38,6 +41,10 @@ public static void init(Object instance) { add("http://alfile.ippzone.com/img/mp4/id/"); add("videocomment"); }}); + put(DexKit.OBF_ACCOUNT_SERVICE_MANAGER,new HashSet(){{ + add("avatar"); + add("third_force_bind_phone"); + }}); }}); PLog.log("查找结果: " + result); DexKit.cache(result); diff --git a/app/src/main/java/cn/lliiooll/pphelper/hook/RemoveVoiceRoomHook.kt b/app/src/main/java/cn/lliiooll/pphelper/hook/RemoveVoiceRoomHook.kt index f7a4f11..a38607f 100644 --- a/app/src/main/java/cn/lliiooll/pphelper/hook/RemoveVoiceRoomHook.kt +++ b/app/src/main/java/cn/lliiooll/pphelper/hook/RemoveVoiceRoomHook.kt @@ -1,24 +1,32 @@ package cn.lliiooll.pphelper.hook +import android.content.Context import android.os.Bundle -import cn.lliiooll.pphelper.utils.Utils -import cn.lliiooll.pphelper.utils.loadClass +import cn.lliiooll.pphelper.utils.* import de.robv.android.xposed.XC_MethodHook import de.robv.android.xposed.XC_MethodReplacement import de.robv.android.xposed.XposedHelpers +import java.util.* object RemoveVoiceRoomHook : BaseHook("removeVoiceRoom", "移除语音房") { override fun init(): Boolean { this.desc = "移除语音房" - XposedHelpers.findAndHookMethod( - "cn.xiaochuankeji.chat.gui.base.ChatBaseActivity".loadClass(), - "onCreate", - Bundle::class.java, - object : XC_MethodHook() { - override fun afterHookedMethod(param: MethodHookParam?) { - Utils.showShort("") + val clazz1 = "com.youyisia.voices.sdk.api.HYVoiceRoomSdk".loadClass() + for (m in clazz1?.declaredMethods!!) { + m.hookAfter { + if (m.name == "isInited") { + it?.result = true } - }) + PLog.log( + "\n来自{}的方法被调用;" + "\n方法名称: {}" + "\n参数数量: {}" + "\n参数类型: {}" + "\n参数内容: {}\n当前堆栈: ", + clazz1.name, + m.name, + m.parameterTypes.size, + Arrays.toString(m.parameterTypes), + Arrays.toString(it?.args) + ) + } + } return true } } \ No newline at end of file diff --git a/app/src/main/java/cn/lliiooll/pphelper/hook/ShowHideHook.kt b/app/src/main/java/cn/lliiooll/pphelper/hook/ShowHideHook.kt new file mode 100644 index 0000000..aae2141 --- /dev/null +++ b/app/src/main/java/cn/lliiooll/pphelper/hook/ShowHideHook.kt @@ -0,0 +1,67 @@ +package cn.lliiooll.pphelper.hook + +import android.os.Bundle +import cn.hutool.json.JSONUtil +import cn.lliiooll.pphelper.utils.PLog +import cn.lliiooll.pphelper.utils.loadClass +import cn.xiaochuankeji.zuiyouLite.ui.postdetail.comment.CommentDetailActivity +import cn.xiaochuankeji.zuiyouLite.ui.slide.ActivitySlideDetail +import de.robv.android.xposed.XC_MethodHook +import de.robv.android.xposed.XposedHelpers + +object ShowHideHook : BaseHook("comment_show_hide", "评论区显示隐藏评论") { + override fun init(): Boolean { + this.desc = "评论区显示隐藏评论" + XposedHelpers.findAndHookMethod( + CommentDetailActivity::class.java, + "onCreate", + Bundle::class.java, + object : XC_MethodHook() { + override fun afterHookedMethod(param: MethodHookParam?) { + val commentBeanClazz = "cn.xiaochuankeji.zuiyouLite.data.CommentBean".loadClass() + val objClazz = param?.thisObject?.javaClass + for (field in objClazz?.declaredFields!!) { + if (field.type == commentBeanClazz) { + val commentBean = XposedHelpers.getObjectField(param.thisObject, field.name) + val replays = XposedHelpers.getObjectField(commentBean, "replyReviews") as List<*> + XposedHelpers.setIntField(commentBean, "isHide", 0) + for (replay in replays) { + XposedHelpers.setIntField(replay, "isHide", 0) + } + //PLog.log(JSONUtil.toJsonStr(commentBean)) + } + } + } + }) + XposedHelpers.findAndHookMethod( + ActivitySlideDetail::class.java, + "onCreate", + Bundle::class.java, + object : XC_MethodHook() { + override fun afterHookedMethod(param: MethodHookParam?) { + //val commentBeanClazz = "cn.xiaochuankeji.zuiyouLite.data.CommentBean".loadClass() + val postDataBeanClazz = "cn.xiaochuankeji.zuiyouLite.data.post.PostDataBean".loadClass() + val objClazz = param?.thisObject?.javaClass + for (field in objClazz?.declaredFields!!) { + if (field.type == postDataBeanClazz) { + val postDataBean = XposedHelpers.getObjectField(param.thisObject, field.name) + val godReviews = XposedHelpers.getObjectField(postDataBean, field.name) as List<*> + val myReviews = XposedHelpers.getObjectField(postDataBean, field.name) as List<*> + val reviewList = XposedHelpers.getObjectField(postDataBean, field.name) as List<*> + for (replay in godReviews) { + XposedHelpers.setIntField(replay, "isHide", 0) + } + for (replay in myReviews) { + XposedHelpers.setIntField(replay, "isHide", 0) + } + for (replay in reviewList) { + XposedHelpers.setIntField(replay, "isHide", 0) + } + //PLog.log(JSONUtil.toJsonStr(commentBean)) + } + } + } + }) + return true + } +} \ No newline at end of file diff --git a/app/src/main/java/cn/lliiooll/pphelper/hook/TestHook.kt b/app/src/main/java/cn/lliiooll/pphelper/hook/TestHook.kt index df90c11..fa00bad 100644 --- a/app/src/main/java/cn/lliiooll/pphelper/hook/TestHook.kt +++ b/app/src/main/java/cn/lliiooll/pphelper/hook/TestHook.kt @@ -1,7 +1,10 @@ package cn.lliiooll.pphelper.hook +import android.app.Application import android.os.Bundle +import cn.lliiooll.pphelper.utils.CliOper import cn.lliiooll.pphelper.utils.Utils +import cn.lliiooll.pphelper.utils.loadClass import cn.xiaochuankeji.zuiyouLite.ui.main.MainActivity import de.robv.android.xposed.XC_MethodHook import de.robv.android.xposed.XposedHelpers @@ -9,6 +12,16 @@ import de.robv.android.xposed.XposedHelpers object TestHook : BaseHook("test", "测试hook") { override fun init(): Boolean { this.desc = "测试hook" + XposedHelpers.findAndHookMethod( + "com.tencent.bugly.crashreport.CrashReport".loadClass(), + "setUserId", + String::class.java, + object : XC_MethodHook() { + override fun afterHookedMethod(param: MethodHookParam) { + //Utils.showShort("用户id: " + param.args[0]) + CliOper.init(Utils.getApplication(), param.args[0] as String?) + } + }) XposedHelpers.findAndHookMethod( MainActivity::class.java, "onCreate", diff --git a/app/src/main/java/cn/lliiooll/pphelper/startup/HookEntry.java b/app/src/main/java/cn/lliiooll/pphelper/startup/HookEntry.java index 89be9e5..5f6f187 100644 --- a/app/src/main/java/cn/lliiooll/pphelper/startup/HookEntry.java +++ b/app/src/main/java/cn/lliiooll/pphelper/startup/HookEntry.java @@ -1,7 +1,11 @@ package cn.lliiooll.pphelper.startup; +import android.app.Application; +import android.content.Context; import cn.lliiooll.pphelper.R; +import cn.lliiooll.pphelper.utils.CliOper; import cn.lliiooll.pphelper.utils.PLog; +import cn.lliiooll.pphelper.utils.Utils; import cn.lliiooll.pphelper.utils.hookstatus.HookStatusInit; import cn.xiaochuankeji.zuiyouLite.app.AppController; import de.robv.android.xposed.IXposedHookLoadPackage; @@ -38,7 +42,7 @@ public void handleLoadPackage(XC_LoadPackage.LoadPackageParam lpparam) throws Th XposedHelpers.findAndHookMethod("cn.xiaochuankeji.zuiyouLite.app.AppController", lpparam.classLoader, "onCreate", new XC_MethodHook() { @Override protected void afterHookedMethod(MethodHookParam param) throws Throwable { - PLog.log("开始初始化"); + PLog.log("开始初始化, app版本: "+ Utils.getVersion((Application) param.thisObject)); StartupHook.init(param.thisObject, lpparam.classLoader); } }); diff --git a/app/src/main/java/cn/lliiooll/pphelper/utils/CliOper.java b/app/src/main/java/cn/lliiooll/pphelper/utils/CliOper.java new file mode 100644 index 0000000..22b11c8 --- /dev/null +++ b/app/src/main/java/cn/lliiooll/pphelper/utils/CliOper.java @@ -0,0 +1,38 @@ +package cn.lliiooll.pphelper.utils; + +import android.app.Application; +import android.os.Build; +import cn.lliiooll.pphelper.BuildConfig; +import com.microsoft.appcenter.AppCenter; +import com.microsoft.appcenter.analytics.Analytics; +import com.microsoft.appcenter.crashes.Crashes; + +import java.util.HashMap; +import java.util.Map; + + +public class CliOper { + public static void init(Application app, String account) { + PLog.log("开始初始化统计..."); + if (!BuildConfig.DEBUG){ + if (!AppCenter.isConfigured()) { + AppCenter.start(app, getSecert(), Analytics.class, Crashes.class); + } + Map data = new HashMap() {{ + put("os_version", Build.VERSION.RELEASE); + put("os_brand", Build.BRAND); + put("os_model", Build.MODEL); + put("app_version", BuildConfig.VERSION_NAME); + put("app_type", BuildConfig.BUILD_TYPE); + put("app_code", BuildConfig.VERSION_CODE + ""); + put("account", account); + }}; + Analytics.trackEvent("onLoad", data); + PLog.log("上报数据: " + data); + } + } + + private static String getSecert() { + return "d107307f-0e8f-4e99-aaf6-1eb3060d1d22"; + } +} diff --git a/app/src/main/java/cn/lliiooll/pphelper/utils/DexKit.java b/app/src/main/java/cn/lliiooll/pphelper/utils/DexKit.java index 716fa34..ad1c058 100644 --- a/app/src/main/java/cn/lliiooll/pphelper/utils/DexKit.java +++ b/app/src/main/java/cn/lliiooll/pphelper/utils/DexKit.java @@ -10,6 +10,7 @@ public class DexKit { public static String OBF_COMMENT_VIDEO = "Lcn/xiaochuankeji/zuiyouLite/common/CommentVideo;"; + public static String OBF_ACCOUNT_SERVICE_MANAGER = "Lcn/xiaochuankeji/zuiyouLite/api/account/AccountServiceManager"; private static native String find(ClassLoader loader, String input); @@ -46,17 +47,18 @@ public static void cache(String result) { List results = new ArrayList<>(Arrays.asList(result.split("\n"))); results.forEach(r -> { List tokens = new ArrayList<>(Arrays.asList(r.split("\t"))); - if (tokens.size() > 2 && Utils.isNotBlank(tokens.get(0))) { + if (tokens.size() > 1 && Utils.isNotBlank(tokens.get(0))) { String filter = doFilter(tokens.get(0), tokens.subList(1, tokens.size())); if (Utils.isNotBlank(filter)) { caches.put(tokens.get(0), filter); PLog.log("找到类: " + tokens.get(0) + " -> " + filter); } else { - PLog.log("未找到合适的类: \n" + Arrays.toString(tokens.toArray())); + PLog.log("未找到合适的类(NoFilter): " + Arrays.toString(tokens.toArray())); } } else { - PLog.log("未找到合适的类: \n" + Arrays.toString(tokens.toArray())); + PLog.log("未找到合适的类: " + Arrays.toString(tokens.toArray())); } + }); } diff --git a/app/src/main/java/cn/lliiooll/pphelper/utils/PLog.java b/app/src/main/java/cn/lliiooll/pphelper/utils/PLog.java index 6ac510f..a5b835c 100644 --- a/app/src/main/java/cn/lliiooll/pphelper/utils/PLog.java +++ b/app/src/main/java/cn/lliiooll/pphelper/utils/PLog.java @@ -1,6 +1,7 @@ package cn.lliiooll.pphelper.utils; import android.util.Log; +import cn.hutool.core.util.StrUtil; import cn.lliiooll.pphelper.BuildConfig; import de.robv.android.xposed.XposedBridge; import org.jetbrains.annotations.NotNull; @@ -17,9 +18,23 @@ public static void log(String str, Object... replaces) { for (Object replace : replaces) { s = s.replaceFirst("\\{\\}", replace == null ? "null" : replace.toString()); } - s = "[PPHelper] >> " + s; - //XposedBridge.log(s); - Log.d("PPHelper", s); + int limit = 500; + if (s.length() >= limit) { + String q = s; + int c = 0; + for (int i = 0; i < s.length(); i += limit) { + + if (i != 0 && q.length() > limit) { + q = q.substring(limit); + } + Log.d("PPHelper", "[PPHelper] @" + c + " >> " + q); + c++; + } + } else { + s = "[PPHelper] >> " + s; + //XposedBridge.log(s); + Log.d("PPHelper", s); + } } } diff --git a/app/src/main/java/cn/lliiooll/pphelper/utils/Utils.kt b/app/src/main/java/cn/lliiooll/pphelper/utils/Utils.kt index ecc017f..a0d5e99 100644 --- a/app/src/main/java/cn/lliiooll/pphelper/utils/Utils.kt +++ b/app/src/main/java/cn/lliiooll/pphelper/utils/Utils.kt @@ -50,6 +50,13 @@ object Utils { ) as Application } + @JvmStatic + fun getVersion(ctx:Context): String { + val pkgMgr = ctx.packageManager + val info = pkgMgr.getPackageInfo(ctx.packageName, 0) + return info.versionName + } + @JvmStatic fun loadClass(name: String): Class<*>? { return XposedHelpers.findClass(name, HybridClassLoader.clLoader) diff --git a/app/src/main/res/xml/appcenter_backup_rule.xml b/app/src/main/res/xml/appcenter_backup_rule.xml new file mode 100644 index 0000000..428c31f --- /dev/null +++ b/app/src/main/res/xml/appcenter_backup_rule.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/app/src/main/res/xml/appcenter_backup_rule_h.xml b/app/src/main/res/xml/appcenter_backup_rule_h.xml new file mode 100644 index 0000000..1a7e366 --- /dev/null +++ b/app/src/main/res/xml/appcenter_backup_rule_h.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + +