diff --git a/app/src/main/java/moe/qwq/miko/ActionManager.kt b/app/src/main/java/moe/qwq/miko/ActionManager.kt index f5fcfcd..944e18d 100644 --- a/app/src/main/java/moe/qwq/miko/ActionManager.kt +++ b/app/src/main/java/moe/qwq/miko/ActionManager.kt @@ -2,18 +2,28 @@ package moe.qwq.miko import android.content.Context import moe.qwq.miko.actions.ActionProcess -import moe.qwq.miko.internals.hooks.BrowserAccessRestrictions +import moe.qwq.miko.hooks.BrowserAccessRestrictions import moe.qwq.miko.actions.FetchService import moe.qwq.miko.actions.* -import moe.qwq.miko.internals.hooks.* +import moe.qwq.miko.hooks.AllowGroupFlashPic +import moe.qwq.miko.hooks.DefaultPacketHijacker +import moe.qwq.miko.hooks.DisableFlashPictures +import moe.qwq.miko.hooks.ForceTabletMode +import moe.qwq.miko.hooks.HotUpdateSoPatch +import moe.qwq.miko.hooks.MessageEncrypt +import moe.qwq.miko.hooks.MessageTail +import moe.qwq.miko.hooks.OneClickLike +import moe.qwq.miko.hooks.QQCrashHook +import moe.qwq.miko.hooks.RepeatMessage +import moe.qwq.miko.hooks.SimplifyHomepageSidebar object ActionManager { // TODO(ksp实现全自动添加action) private val FIRST_ACTION = arrayOf( WebJsBridge::class.java, // ALWAYS RUN FetchService::class.java, // ALWAYS RUN - PacketHijacker::class.java, // ALWAYS RUN PatchMsfCore::class.java, // ALWAYS RUN + HookCodec::class.java, // ALWAYS RUN OneClickLike::class.java, ForceTabletMode::class.java, @@ -24,7 +34,8 @@ object ActionManager { HotUpdateSoPatch::class.java, RepeatMessage::class.java, - MessageHook::class.java, + MessageTail::class.java, + MessageEncrypt::class.java, DisableFlashPictures::class.java, AllowGroupFlashPic::class.java, QQCrashHook::class.java, diff --git a/app/src/main/java/moe/qwq/miko/actions/HookCodec.kt b/app/src/main/java/moe/qwq/miko/actions/HookCodec.kt new file mode 100644 index 0000000..83bb462 --- /dev/null +++ b/app/src/main/java/moe/qwq/miko/actions/HookCodec.kt @@ -0,0 +1,23 @@ +@file:Suppress("LocalVariableName", "SpellCheckingInspection") +package moe.qwq.miko.actions + +import android.content.Context +import de.robv.android.xposed.XposedBridge +import moe.fuqiuluo.processor.HookAction +import moe.fuqiuluo.xposed.loader.LuoClassloader +import moe.qwq.miko.ext.beforeHook +import moe.qwq.miko.ext.hookMethod + +@HookAction(desc = "HookWrapperCodec实现捕获抓包") +class HookCodec: AlwaysRunAction() { + override fun onRun(ctx: Context) { + val CodecWarpper = LuoClassloader.load("com.tencent.qphone.base.util.CodecWarpper") + if (CodecWarpper == null) { + XposedBridge.log("[QwQ] 无法注入CodecWarpper!") + return + } + CodecWarpper.hookMethod("nativeEncodeRequest", beforeHook { + + }) + } +} \ No newline at end of file diff --git a/app/src/main/java/moe/qwq/miko/actions/PacketHijacker.kt b/app/src/main/java/moe/qwq/miko/actions/PacketHijacker.kt deleted file mode 100644 index 8c2a10f..0000000 --- a/app/src/main/java/moe/qwq/miko/actions/PacketHijacker.kt +++ /dev/null @@ -1,91 +0,0 @@ -package moe.qwq.miko.actions - -import android.content.Context -import com.tencent.msf.service.protocol.pb.SSOLoginMerge -import com.tencent.qphone.base.remote.FromServiceMsg -import com.tencent.qphone.base.util.CodecWarpper -import de.robv.android.xposed.XposedBridge -import moe.fuqiuluo.entries.ClassEnum.CodecWarpperImpl -import moe.fuqiuluo.processor.HookAction -import moe.qwq.miko.ext.EMPTY_BYTE_ARRAY -import moe.qwq.miko.ext.hookMethod -import moe.qwq.miko.ext.slice -import moe.qwq.miko.internals.locators.DvmLocator -import moe.qwq.miko.internals.hijackers.IHijacker -import moe.qwq.miko.utils.PlatformTools -import java.util.concurrent.atomic.AtomicBoolean - -@HookAction("包拦截工具") -class PacketHijacker: AlwaysRunAction() { - override fun onRun(ctx: Context) { - if (!PlatformTools.isMsfProcess()) return - try { - DvmLocator.findClass(CodecWarpperImpl)?.let { - hookReceive(it) - return - } - val isInit = AtomicBoolean(false) - CodecWarpper::class.java.hookMethod("init").after { - if (isInit.get()) return@after - hookReceive(it.thisObject.javaClass) - isInit.lazySet(true) - } - CodecWarpper::class.java.hookMethod("nativeOnReceData").before { - if (isInit.get()) return@before - hookReceive(it.thisObject.javaClass) - isInit.lazySet(true) - } - } catch (e: Throwable) { - XposedBridge.log(e) - } - } - - private fun hookReceive(tzClass: Class<*>) { - //val onResponse = tzClass.getDeclaredMethod("onResponse", Integer.TYPE, Any::class.java, Integer.TYPE) - DvmLocator.locateClass(CodecWarpperImpl, tzClass) - tzClass.hookMethod("onResponse").before { - val from = it.args[1] as FromServiceMsg - try { - if ("SSO.LoginMerge" == from.serviceCmd) { - val merge = SSOLoginMerge.BusiBuffData() - .mergeFrom(from.wupBuffer.slice(4)) - val busiBufVec = merge.BusiBuffVec.get() - busiBufVec.forEach { item -> - val cmd = item.ServiceCmd.get() - if (packetHijackers.containsKey(cmd)) { - if(packetHijackers[cmd]!!.onHandle(FromServiceMsg().apply { - this.requestSsoSeq = item.SeqNo.get() - this.serviceCmd = cmd - putWupBuffer(item.BusiBuff.get().toByteArray()) - })) { - busiBufVec.remove(item) - } - } - } - merge.BusiBuffVec.set(busiBufVec) - from.putWupBuffer(merge.toByteArray()) - } else { - val cmd = from.serviceCmd - if (packetHijackers.containsKey(cmd)) { - if(packetHijackers[cmd]!!.onHandle(from)) { - //from.serviceCmd = "Injected_${from.serviceCmd}" - // Adjust the interception plan to allow him to receive the packet, - // but need to prompt for failure - from.setBusinessFail(1) - from.putWupBuffer(EMPTY_BYTE_ARRAY) - } - } - } - } finally { - it.args[1] = from - } - } - } - - override val process: ActionProcess - get() = ActionProcess.MSF - - companion object { - private val packetHijackers = hashMapOf() - } -} \ No newline at end of file diff --git a/app/src/main/java/moe/qwq/miko/actions/PatchMsfCore.kt b/app/src/main/java/moe/qwq/miko/actions/PatchMsfCore.kt index e483c92..cf6035c 100644 --- a/app/src/main/java/moe/qwq/miko/actions/PatchMsfCore.kt +++ b/app/src/main/java/moe/qwq/miko/actions/PatchMsfCore.kt @@ -1,37 +1,65 @@ +@file:Suppress("LocalVariableName") package moe.qwq.miko.actions import android.content.Context import com.tencent.mobileqq.msf.sdk.MsfMessagePair +import com.tencent.qphone.base.remote.ToServiceMsg import de.robv.android.xposed.XposedBridge import moe.qwq.miko.internals.msf.MSFHandler.onPush import moe.qwq.miko.internals.msf.MSFHandler.onResp import moe.fuqiuluo.processor.HookAction import moe.fuqiuluo.xposed.loader.LuoClassloader +import moe.qwq.miko.ext.beforeHook import moe.qwq.miko.ext.hookMethod +import moe.qwq.miko.internals.hijackers.IHijacker @HookAction("注入MSF收包任务") class PatchMsfCore: AlwaysRunAction() { override fun onRun(ctx: Context) { - runCatching { - val MSFRespHandleTask = LuoClassloader.load("mqq.app.msghandle.MSFRespHandleTask") - if (MSFRespHandleTask == null) { - XposedBridge.log("[QwQ] 无法注入MSFRespHandleTask!") - } else { - val msfPair = MSFRespHandleTask.declaredFields.first { - it.type == MsfMessagePair::class.java - } - msfPair.isAccessible = true - MSFRespHandleTask.hookMethod("run").before { - val pair = msfPair.get(it.thisObject) as MsfMessagePair - if (pair.toServiceMsg == null) { - onPush(pair.fromServiceMsg) - } else { - onResp(pair.toServiceMsg, pair.fromServiceMsg) - } + val MSFRespHandleTask = LuoClassloader.load("mqq.app.msghandle.MSFRespHandleTask") + if (MSFRespHandleTask == null) { + XposedBridge.log("[QwQ] 无法注入MSFRespHandleTask!") + } else { + val msfPair = MSFRespHandleTask.declaredFields.first { + it.type == MsfMessagePair::class.java + } + msfPair.isAccessible = true + MSFRespHandleTask.hookMethod("run").before { + val pair = msfPair.get(it.thisObject) as MsfMessagePair + if (pair.toServiceMsg == null) { + onPush(pair.fromServiceMsg) + } else { + onResp(pair.toServiceMsg, pair.fromServiceMsg) } } - }.onFailure { - XposedBridge.log(it) } + +/* val MobileQQServiceBase = LuoClassloader.load("com.tencent.mobileqq.service.MobileQQServiceBase") + if (MobileQQServiceBase == null) { + XposedBridge.log("[QwQ] 无法注入MobileQQServiceBase!部分服务可能不可用!") + } else { + val realHandleRequest = kotlin.runCatching { MobileQQServiceBase.getMethod("realHandleRequest", ToServiceMsg::class.java, Class::class.java) } + .getOrElse { + MobileQQServiceBase.methods.firstOrNull { it.returnType == Void.TYPE && it.parameterTypes.size == 2 && it.parameterTypes[0] == ToServiceMsg::class.java && it.parameterTypes[1] == Class::class.java } + } + if (realHandleRequest == null) { + XposedBridge.log("[QwQ] 无法注入MobileQQServiceBase.realHandleRequest!部分服务可能不可用!") + } else { + XposedBridge.hookMethod(realHandleRequest, beforeHook { + val toServiceMsg = it.args[0] as ToServiceMsg + val isPb = toServiceMsg.getAttribute("req_pb_protocol_flag", false) + val cmd = toServiceMsg.serviceCmd + if(hijackerList.firstOrNull { + it.command == cmd + }?.onHandle(toServiceMsg, isPb) == true) { + it.result = Unit + } + }) + } + }*/ } + +/* companion object { + val hijackerList = arrayListOf() + }*/ } \ No newline at end of file diff --git a/app/src/main/java/moe/qwq/miko/internals/hooks/AllowGroupFlashPic.kt b/app/src/main/java/moe/qwq/miko/hooks/AllowGroupFlashPic.kt similarity index 98% rename from app/src/main/java/moe/qwq/miko/internals/hooks/AllowGroupFlashPic.kt rename to app/src/main/java/moe/qwq/miko/hooks/AllowGroupFlashPic.kt index c0ba3ea..121d0ff 100644 --- a/app/src/main/java/moe/qwq/miko/internals/hooks/AllowGroupFlashPic.kt +++ b/app/src/main/java/moe/qwq/miko/hooks/AllowGroupFlashPic.kt @@ -1,4 +1,4 @@ -package moe.qwq.miko.internals.hooks +package moe.qwq.miko.hooks import android.content.Context import android.view.View diff --git a/app/src/main/java/moe/qwq/miko/internals/hooks/BrowserAccessRestrictions.kt b/app/src/main/java/moe/qwq/miko/hooks/BrowserAccessRestrictions.kt similarity index 96% rename from app/src/main/java/moe/qwq/miko/internals/hooks/BrowserAccessRestrictions.kt rename to app/src/main/java/moe/qwq/miko/hooks/BrowserAccessRestrictions.kt index 1314760..000ccb5 100644 --- a/app/src/main/java/moe/qwq/miko/internals/hooks/BrowserAccessRestrictions.kt +++ b/app/src/main/java/moe/qwq/miko/hooks/BrowserAccessRestrictions.kt @@ -1,4 +1,5 @@ -package moe.qwq.miko.internals.hooks +@file:Suppress("LocalVariableName") +package moe.qwq.miko.hooks import android.content.Context import android.os.Bundle diff --git a/app/src/main/java/moe/qwq/miko/internals/hooks/DefaultPacketHijacker.kt b/app/src/main/java/moe/qwq/miko/hooks/DefaultPacketHijacker.kt similarity index 98% rename from app/src/main/java/moe/qwq/miko/internals/hooks/DefaultPacketHijacker.kt rename to app/src/main/java/moe/qwq/miko/hooks/DefaultPacketHijacker.kt index 9ac7a7a..9dbae44 100644 --- a/app/src/main/java/moe/qwq/miko/internals/hooks/DefaultPacketHijacker.kt +++ b/app/src/main/java/moe/qwq/miko/hooks/DefaultPacketHijacker.kt @@ -1,4 +1,4 @@ -package moe.qwq.miko.internals.hooks +package moe.qwq.miko.hooks import android.content.Context import com.tencent.qphone.base.util.CodecWarpper diff --git a/app/src/main/java/moe/qwq/miko/internals/hooks/DisableFlashPictures.kt b/app/src/main/java/moe/qwq/miko/hooks/DisableFlashPictures.kt similarity index 98% rename from app/src/main/java/moe/qwq/miko/internals/hooks/DisableFlashPictures.kt rename to app/src/main/java/moe/qwq/miko/hooks/DisableFlashPictures.kt index 9d659ce..2a180e9 100644 --- a/app/src/main/java/moe/qwq/miko/internals/hooks/DisableFlashPictures.kt +++ b/app/src/main/java/moe/qwq/miko/hooks/DisableFlashPictures.kt @@ -1,4 +1,4 @@ -package moe.qwq.miko.internals.hooks +package moe.qwq.miko.hooks import android.content.Context import com.tencent.mobileqq.aio.msglist.AIOMsgItemFactoryProvider diff --git a/app/src/main/java/moe/qwq/miko/internals/hooks/ForceTabletMode.kt b/app/src/main/java/moe/qwq/miko/hooks/ForceTabletMode.kt similarity index 98% rename from app/src/main/java/moe/qwq/miko/internals/hooks/ForceTabletMode.kt rename to app/src/main/java/moe/qwq/miko/hooks/ForceTabletMode.kt index d0e1b5c..c6d6fbd 100644 --- a/app/src/main/java/moe/qwq/miko/internals/hooks/ForceTabletMode.kt +++ b/app/src/main/java/moe/qwq/miko/hooks/ForceTabletMode.kt @@ -1,6 +1,6 @@ @file:Suppress("LocalVariableName") -package moe.qwq.miko.internals.hooks +package moe.qwq.miko.hooks import android.content.Context import com.tencent.common.config.pad.DeviceType diff --git a/app/src/main/java/moe/qwq/miko/internals/hooks/HotUpdateSoPatch.kt b/app/src/main/java/moe/qwq/miko/hooks/HotUpdateSoPatch.kt similarity index 95% rename from app/src/main/java/moe/qwq/miko/internals/hooks/HotUpdateSoPatch.kt rename to app/src/main/java/moe/qwq/miko/hooks/HotUpdateSoPatch.kt index 94f6f00..3532eac 100644 --- a/app/src/main/java/moe/qwq/miko/internals/hooks/HotUpdateSoPatch.kt +++ b/app/src/main/java/moe/qwq/miko/hooks/HotUpdateSoPatch.kt @@ -1,4 +1,4 @@ -package moe.qwq.miko.internals.hooks +package moe.qwq.miko.hooks import android.content.Context import com.tencent.mobileqq.earlydownload.xmldata.XmlData diff --git a/app/src/main/java/moe/qwq/miko/hooks/MessageEncrypt.kt b/app/src/main/java/moe/qwq/miko/hooks/MessageEncrypt.kt new file mode 100644 index 0000000..3f15eaf --- /dev/null +++ b/app/src/main/java/moe/qwq/miko/hooks/MessageEncrypt.kt @@ -0,0 +1,28 @@ +package moe.qwq.miko.hooks + +import android.content.Context +import com.tencent.qphone.base.remote.ToServiceMsg +import de.robv.android.xposed.XposedBridge +import moe.fuqiuluo.processor.HookAction +import moe.qwq.miko.actions.ActionProcess +import moe.qwq.miko.actions.IAction +import moe.qwq.miko.actions.PatchMsfCore +import moe.qwq.miko.internals.hijackers.IHijacker +import moe.qwq.miko.internals.setting.QwQSetting + +@HookAction(desc = "消息加密抄送") +class MessageEncrypt: IAction { + override fun onRun(ctx: Context) { + val encryptKey = QwQSetting.getSetting(name).getValue(null, null) + + } + + override fun canRun(): Boolean { + val setting = QwQSetting.getSetting(name) + return setting.getValue(null, null).isNotBlank() + } + + //override val process: ActionProcess = ActionProcess.MAIN + + override val name: String = QwQSetting.MESSAGE_ENCRYPT +} \ No newline at end of file diff --git a/app/src/main/java/moe/qwq/miko/internals/hooks/MessageHook.kt b/app/src/main/java/moe/qwq/miko/hooks/MessageTail.kt similarity index 89% rename from app/src/main/java/moe/qwq/miko/internals/hooks/MessageHook.kt rename to app/src/main/java/moe/qwq/miko/hooks/MessageTail.kt index 9761d36..8caa1d5 100644 --- a/app/src/main/java/moe/qwq/miko/internals/hooks/MessageHook.kt +++ b/app/src/main/java/moe/qwq/miko/hooks/MessageTail.kt @@ -1,4 +1,4 @@ -package moe.qwq.miko.internals.hooks +package moe.qwq.miko.hooks import android.content.Context import com.tencent.qqnt.kernel.nativeinterface.MsgConstant @@ -11,18 +11,14 @@ import moe.qwq.miko.actions.ActionProcess import moe.qwq.miko.actions.IAction import moe.qwq.miko.internals.setting.QwQSetting -@HookAction("发送消息预劫持") -class MessageHook: IAction { +@HookAction("消息小尾巴") +class MessageTail: IAction { private fun handleMessageBody(msgs: ArrayList) { if (msgs.isActionMsg()) return val tail by QwQSetting.getSetting(name) - val encrypt by QwQSetting.getSetting(QwQSetting.MESSAGE_ENCRYPT) if (tail.isNotBlank()) { handleMessageTail(msgs, tail) } - if (encrypt.isNotBlank()) { - handleMessageEncrypt(msgs, encrypt) - } } private fun handleMessageTail(msgs: ArrayList, tail: String) { // 给消息添加小尾巴 @@ -33,9 +29,6 @@ class MessageHook: IAction { }) } - private fun handleMessageEncrypt(msgs: ArrayList, encryptKey: String) { - } - override fun onRun(ctx: Context) { /* val msgService = QRoute.api(IMsgService::class.java) msgService.javaClass.methods.forEach { @@ -90,8 +83,7 @@ class MessageHook: IAction { override fun canRun(): Boolean { val tail by QwQSetting.getSetting(name) - val encrypt by QwQSetting.getSetting(QwQSetting.MESSAGE_ENCRYPT) - return tail.isNotEmpty() || encrypt.isNotEmpty() + return tail.isNotEmpty() } override val name: String = QwQSetting.MESSAGE_TAIL diff --git a/app/src/main/java/moe/qwq/miko/internals/hooks/OneClickLike.kt b/app/src/main/java/moe/qwq/miko/hooks/OneClickLike.kt similarity index 98% rename from app/src/main/java/moe/qwq/miko/internals/hooks/OneClickLike.kt rename to app/src/main/java/moe/qwq/miko/hooks/OneClickLike.kt index 77e7c61..132f303 100644 --- a/app/src/main/java/moe/qwq/miko/internals/hooks/OneClickLike.kt +++ b/app/src/main/java/moe/qwq/miko/hooks/OneClickLike.kt @@ -1,4 +1,4 @@ -package moe.qwq.miko.internals.hooks +package moe.qwq.miko.hooks import android.content.Context import android.view.View diff --git a/app/src/main/java/moe/qwq/miko/internals/hooks/QQCrashHook.kt b/app/src/main/java/moe/qwq/miko/hooks/QQCrashHook.kt similarity index 97% rename from app/src/main/java/moe/qwq/miko/internals/hooks/QQCrashHook.kt rename to app/src/main/java/moe/qwq/miko/hooks/QQCrashHook.kt index f08e737..18b4b23 100644 --- a/app/src/main/java/moe/qwq/miko/internals/hooks/QQCrashHook.kt +++ b/app/src/main/java/moe/qwq/miko/hooks/QQCrashHook.kt @@ -1,5 +1,5 @@ @file:Suppress("LocalVariableName") -package moe.qwq.miko.internals.hooks +package moe.qwq.miko.hooks import android.content.Context import de.robv.android.xposed.XposedBridge diff --git a/app/src/main/java/moe/qwq/miko/internals/hooks/RepeatMessage.kt b/app/src/main/java/moe/qwq/miko/hooks/RepeatMessage.kt similarity index 99% rename from app/src/main/java/moe/qwq/miko/internals/hooks/RepeatMessage.kt rename to app/src/main/java/moe/qwq/miko/hooks/RepeatMessage.kt index 5cfc467..e085c59 100644 --- a/app/src/main/java/moe/qwq/miko/internals/hooks/RepeatMessage.kt +++ b/app/src/main/java/moe/qwq/miko/hooks/RepeatMessage.kt @@ -1,5 +1,5 @@ @file:Suppress("LocalVariableName", "UNCHECKED_CAST") -package moe.qwq.miko.internals.hooks +package moe.qwq.miko.hooks import android.content.Context import android.view.View diff --git a/app/src/main/java/moe/qwq/miko/internals/hooks/SimplifyHomepageSidebar.kt b/app/src/main/java/moe/qwq/miko/hooks/SimplifyHomepageSidebar.kt similarity index 97% rename from app/src/main/java/moe/qwq/miko/internals/hooks/SimplifyHomepageSidebar.kt rename to app/src/main/java/moe/qwq/miko/hooks/SimplifyHomepageSidebar.kt index 3ca4537..29789e7 100644 --- a/app/src/main/java/moe/qwq/miko/internals/hooks/SimplifyHomepageSidebar.kt +++ b/app/src/main/java/moe/qwq/miko/hooks/SimplifyHomepageSidebar.kt @@ -1,5 +1,5 @@ @file:Suppress("UNUSED_VARIABLE", "LocalVariableName", "UNCHECKED_CAST") -package moe.qwq.miko.internals.hooks +package moe.qwq.miko.hooks import android.content.Context import com.tencent.mobileqq.activity.qqsettingme.config.QQSettingMeBizBean @@ -25,7 +25,7 @@ class SimplifyHomepageSidebar: IAction { private lateinit var FieldQQSettingMeItemName: Field private fun findItemNameField(bean: QQSettingMeBizBean) { - if(!::FieldQQSettingMeItemName.isInitialized) { + if(!Companion::FieldQQSettingMeItemName.isInitialized) { DvmLocator.findField(QQSettingMeItemName)?.let { FieldQQSettingMeItemName = it return diff --git a/app/src/main/java/moe/qwq/miko/internals/AioListener.kt b/app/src/main/java/moe/qwq/miko/internals/AioListener.kt index 1d0d73f..6e6c89b 100644 --- a/app/src/main/java/moe/qwq/miko/internals/AioListener.kt +++ b/app/src/main/java/moe/qwq/miko/internals/AioListener.kt @@ -147,10 +147,10 @@ override fun onRecvMsg(recordLisrt: ArrayList) { val interceptRecall = QwQSetting.getSetting(QwQSetting.INTERCEPT_RECALL) .getValue(null, null) if (!interceptRecall) return false - GlobalScope.launch { + GlobalScope.launch { runCatching { val reader = ByteReadPacket(richMsg) val buffer = try { - if (reader.readUInt() == message.msgHead.peerId) { + if (richMsg.size >= 7 && reader.readUInt() == message.msgHead.peerId) { reader.discardExact(1) reader.readBytes(reader.readShort().toInt()) } else richMsg @@ -188,12 +188,12 @@ override fun onRecvMsg(recordLisrt: ArrayList) { } -/* var operatorNick = GroupHelper.getTroopMemberNickByUin(groupCode, operator.toLong())?.let { - it.troopNick - .ifNullOrEmpty(it.friendNick) - .ifNullOrEmpty(it.showName) - .ifNullOrEmpty(it.autoRemark) - }*/ + /* var operatorNick = GroupHelper.getTroopMemberNickByUin(groupCode, operator.toLong())?.let { + it.troopNick + .ifNullOrEmpty(it.friendNick) + .ifNullOrEmpty(it.showName) + .ifNullOrEmpty(it.autoRemark) + }*/ var operatorNick: String? = null @@ -220,7 +220,7 @@ override fun onRecvMsg(recordLisrt: ArrayList) { text("的") msgRef("消息", msgSeq) } - } + } } return true } } \ No newline at end of file diff --git a/app/src/main/java/moe/qwq/miko/internals/helper/NTServiceFetcher.kt b/app/src/main/java/moe/qwq/miko/internals/helper/NTServiceFetcher.kt index d08a805..2658bbe 100644 --- a/app/src/main/java/moe/qwq/miko/internals/helper/NTServiceFetcher.kt +++ b/app/src/main/java/moe/qwq/miko/internals/helper/NTServiceFetcher.kt @@ -6,21 +6,14 @@ package moe.qwq.miko.internals.helper import com.google.protobuf.UnknownFieldSet import com.tencent.qqnt.kernel.api.IKernelService import com.tencent.qqnt.kernel.api.impl.MsgService -import com.tencent.qqnt.kernel.nativeinterface.MsgRecord import de.robv.android.xposed.XposedBridge import kotlinx.coroutines.DelicateCoroutinesApi -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.GlobalScope -import kotlinx.coroutines.launch import kotlinx.serialization.ExperimentalSerializationApi import kotlinx.serialization.decodeFromByteArray import kotlinx.serialization.protobuf.ProtoBuf import moe.fuqiuluo.entries.MessagePush -import moe.qwq.miko.ext.beforeHook import moe.qwq.miko.ext.hookMethod import moe.qwq.miko.internals.AioListener -import moe.qwq.miko.internals.hooks.MessageHook -import java.lang.reflect.Method internal object NTServiceFetcher { private lateinit var iKernelService: IKernelService diff --git a/app/src/main/java/moe/qwq/miko/internals/hijackers/IHijacker.kt b/app/src/main/java/moe/qwq/miko/internals/hijackers/IHijacker.kt index f9e0b28..cc7f5d5 100644 --- a/app/src/main/java/moe/qwq/miko/internals/hijackers/IHijacker.kt +++ b/app/src/main/java/moe/qwq/miko/internals/hijackers/IHijacker.kt @@ -1,16 +1,12 @@ package moe.qwq.miko.internals.hijackers -import com.tencent.qphone.base.remote.FromServiceMsg +import com.tencent.qphone.base.remote.ToServiceMsg interface IHijacker { - - /** - * @return true If QQ is blocked from receiving this packet - */ - fun onHandle(fromServiceMsg: FromServiceMsg): Boolean + fun onHandle(toServiceMsg: ToServiceMsg, isPb: Boolean): Boolean /** * @return the cmd of the packet */ - fun getCmd(): String + val command: String } \ No newline at end of file