diff --git a/app/src/main/java/moe/fuqiuluo/shamrock/ui/app/ShamrockConfig.kt b/app/src/main/java/moe/fuqiuluo/shamrock/ui/app/ShamrockConfig.kt index 1f9f772..2623b05 100644 --- a/app/src/main/java/moe/fuqiuluo/shamrock/ui/app/ShamrockConfig.kt +++ b/app/src/main/java/moe/fuqiuluo/shamrock/ui/app/ShamrockConfig.kt @@ -224,6 +224,16 @@ object ShamrockConfig { preferences.edit().putBoolean("debug", v).apply() } + fun isAntiTrace(ctx: Context): Boolean { + val preferences = ctx.getSharedPreferences("config", 0) + return preferences.getBoolean("anti_qq_trace", true) + } + + fun setAntiTrace(ctx: Context, v: Boolean) { + val preferences = ctx.getSharedPreferences("config", 0) + preferences.edit().putBoolean("anti_qq_trace", v).apply() + } + fun isInjectPacket(ctx: Context): Boolean { val preferences = ctx.getSharedPreferences("config", 0) return preferences.getBoolean("inject_packet", false) @@ -293,6 +303,7 @@ object ShamrockConfig { "ssl_pwd" to preferences.getString("ssl_pwd", ""), "inject_packet" to preferences.getBoolean("inject_packet", false), "debug" to preferences.getBoolean("debug", false), + "anti_qq_trace" to preferences.getBoolean("anti_qq_trace", true), "auto_clear" to preferences.getBoolean("auto_clear", false), "ssl_private_pwd" to preferences.getString("ssl_private_pwd", ""), "key_store" to preferences.getString("key_store", ""), diff --git a/app/src/main/java/moe/fuqiuluo/shamrock/ui/fragment/LabFragment.kt b/app/src/main/java/moe/fuqiuluo/shamrock/ui/fragment/LabFragment.kt index fbc3570..7f12f7d 100644 --- a/app/src/main/java/moe/fuqiuluo/shamrock/ui/fragment/LabFragment.kt +++ b/app/src/main/java/moe/fuqiuluo/shamrock/ui/fragment/LabFragment.kt @@ -1,7 +1,6 @@ package moe.fuqiuluo.shamrock.ui.fragment import android.content.Context -import android.widget.Toast import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.absolutePadding import androidx.compose.foundation.layout.fillMaxSize @@ -85,6 +84,17 @@ fun LabFragment() { ShamrockConfig.pushUpdate(ctx) return@Function true } + + Function( + title = "防止调用栈检测", + desc = "防止QQ进行堆栈跟踪检测,需要重新启动QQ。", + descColor = it, + isSwitch = ShamrockConfig.isAntiTrace(ctx) + ) { + ShamrockConfig.setAntiTrace(ctx, it) + ShamrockConfig.pushUpdate(ctx) + return@Function true + } } } diff --git a/qqinterface/src/main/java/com/tencent/mmkv/MMKV.java b/qqinterface/src/main/java/com/tencent/mmkv/MMKV.java index 7a29717..cd43b87 100644 --- a/qqinterface/src/main/java/com/tencent/mmkv/MMKV.java +++ b/qqinterface/src/main/java/com/tencent/mmkv/MMKV.java @@ -33,7 +33,7 @@ public class MMKV implements SharedPreferences, SharedPreferences.Editor { return null; } - public SharedPreferences.Editor putBoolean(String str, boolean z) { + public SharedPreferences.Editor putBoolean(String s, boolean z) { return this; } diff --git a/xposed/build.gradle.kts b/xposed/build.gradle.kts index 6819f6b..31a4a68 100644 --- a/xposed/build.gradle.kts +++ b/xposed/build.gradle.kts @@ -96,5 +96,11 @@ dependencies { //ksp("androidx.room:room-compiler:$roomVersion") // optional - Kotlin Extensions and Coroutines support for Room implementation("androidx.room:room-ktx:$roomVersion") + + testImplementation("junit:junit:4.13.2") + androidTestImplementation("androidx.test.ext:junit:1.1.5") + androidTestImplementation("androidx.test.espresso:espresso-core:3.5.1") + androidTestImplementation(platform("androidx.compose:compose-bom:2023.06.01")) + androidTestImplementation("androidx.compose.ui:ui-test-junit4") } diff --git a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/service/WebSocketClientService.kt b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/service/WebSocketClientService.kt index 75239fe..5412e27 100644 --- a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/service/WebSocketClientService.kt +++ b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/service/WebSocketClientService.kt @@ -7,7 +7,6 @@ import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.Job import kotlinx.coroutines.launch import moe.fuqiuluo.shamrock.remote.service.api.WebSocketClientServlet -import moe.fuqiuluo.shamrock.remote.service.data.push.* import moe.fuqiuluo.shamrock.helper.Level import moe.fuqiuluo.shamrock.helper.LogCenter import moe.fuqiuluo.shamrock.remote.service.api.GlobalEventTransmitter @@ -35,7 +34,7 @@ internal class WebSocketClientService( } }) submitFlowJob(GlobalScope.launch { - GlobalEventTransmitter.onRequestEvent() { event -> + GlobalEventTransmitter.onRequestEvent { event -> pushTo(event) } }) diff --git a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/service/config/ShamrockConfig.kt b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/service/config/ShamrockConfig.kt index 78dd0bd..264ce60 100644 --- a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/service/config/ShamrockConfig.kt +++ b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/service/config/ShamrockConfig.kt @@ -33,16 +33,17 @@ internal object ShamrockConfig { val mmkv = MMKVFetcher.mmkvWithId("shamrock_config") mmkv.apply { putBoolean( "tablet", intent.getBooleanExtra("tablet", false)) // 强制平板模式 - putInt( "port", intent.getIntExtra("port", 5700)) // 主动HTTP端口 + putInt( "port", intent.getIntExtra("port", 5700)) // 主动HTTP端口 putBoolean( "ws", intent.getBooleanExtra("ws", false)) // 主动WS开关 putBoolean( "http", intent.getBooleanExtra("http", false)) // HTTP回调开关 - putString( "http_addr", intent.getStringExtra("http_addr")) // WebHook回调地址 + putString( "http_addr", intent.getStringExtra("http_addr")) // WebHook回调地址 putBoolean( "ws_client", intent.getBooleanExtra("ws_client", false)) // 被动WS开关 putBoolean( "use_cqcode", intent.getBooleanExtra("use_cqcode", false)) // 使用CQ码 putBoolean( "inject_packet", intent.getBooleanExtra("inject_packet", false)) // 拦截无用包 - putBoolean( "debug", intent.getBooleanExtra("debug", false)) // 调试模式 + putBoolean( "debug", intent.getBooleanExtra("debug", false)) // 调试模式 Config.defaultToken = intent.getStringExtra("token") + Config.antiTrace = intent.getBooleanExtra("anti_qq_trace", true) val wsPort = intent.getIntExtra("ws_port", 5800) Config.activeWebSocket = if (Config.activeWebSocket == null) ConnectionConfig( @@ -58,16 +59,16 @@ internal object ShamrockConfig { ConnectionConfig(address = it) }?.toMutableList() - putString( "key_store", intent.getStringExtra("key_store")) // 证书路径 - putString( "ssl_pwd", intent.getStringExtra("ssl_pwd")) // 证书密码 - putString( "ssl_private_pwd", intent.getStringExtra("ssl_private_pwd")) // 证书私钥密码 - putString( "ssl_alias", intent.getStringExtra("ssl_alias")) // 证书别名 - putInt( "ssl_port", intent.getIntExtra("ssl_port", 5701)) // 主动HTTP端口 + putString( "key_store", intent.getStringExtra("key_store")) // 证书路径 + putString( "ssl_pwd", intent.getStringExtra("ssl_pwd")) // 证书密码 + putString( "ssl_private_pwd", intent.getStringExtra("ssl_private_pwd")) // 证书私钥密码 + putString( "ssl_alias", intent.getStringExtra("ssl_alias")) // 证书别名 + putInt( "ssl_port", intent.getIntExtra("ssl_port", 5701)) // 主动HTTP端口 - putBoolean("auto_clear", intent.getBooleanExtra("auto_clear", false)) // 自动清理 + putBoolean("auto_clear", intent.getBooleanExtra("auto_clear", false)) // 自动清理 - putBoolean("enable_self_msg", intent.getBooleanExtra("enable_self_msg", false)) // 推送自己发的消息 - putBoolean("shell", intent.getBooleanExtra("shell", false)) // 开启Shell接口 + putBoolean("enable_self_msg", intent.getBooleanExtra("enable_self_msg", false)) // 推送自己发的消息 + putBoolean("shell", intent.getBooleanExtra("shell", false)) // 开启Shell接口 putBoolean("isInit", true) } diff --git a/xposed/src/main/java/moe/fuqiuluo/shamrock/xposed/actions/AntiDetection.kt b/xposed/src/main/java/moe/fuqiuluo/shamrock/xposed/actions/AntiDetection.kt index f0bbc8e..6944aee 100644 --- a/xposed/src/main/java/moe/fuqiuluo/shamrock/xposed/actions/AntiDetection.kt +++ b/xposed/src/main/java/moe/fuqiuluo/shamrock/xposed/actions/AntiDetection.kt @@ -5,16 +5,13 @@ import android.content.Context import android.content.pm.PackageManager import android.content.pm.VersionedPackage import android.os.Build -import de.robv.android.xposed.XC_MethodHook import de.robv.android.xposed.XC_MethodReplacement -import de.robv.android.xposed.XposedBridge import de.robv.android.xposed.XposedHelpers import moe.fuqiuluo.shamrock.helper.Level import moe.fuqiuluo.shamrock.helper.LogCenter import moe.fuqiuluo.shamrock.remote.service.config.ShamrockConfig import moe.fuqiuluo.shamrock.tools.hookMethod import moe.fuqiuluo.shamrock.xposed.loader.LuoClassloader -import mqq.app.MobileQQ /** * 反检测