Fix change hook entry inject function try fix some Non-Root Hook Framework not work, such as TaiChi

This commit is contained in:
2022-09-30 00:02:48 +08:00
parent a67faed81c
commit 08d7676478
3 changed files with 133 additions and 129 deletions

View File

@@ -24,15 +24,11 @@
package com.fankes.tsbattery.hook
import com.fankes.tsbattery.const.PackageName
import com.fankes.tsbattery.data.ConfigData
import com.fankes.tsbattery.hook.entity.QQTIMHooker
import com.fankes.tsbattery.hook.entity.WeChatHooker
import com.fankes.tsbattery.utils.factory.versionName
import com.highcapable.yukihookapi.annotation.xposed.InjectYukiHookWithXposed
import com.highcapable.yukihookapi.hook.factory.configs
import com.highcapable.yukihookapi.hook.factory.encase
import com.highcapable.yukihookapi.hook.factory.registerModuleAppActivities
import com.highcapable.yukihookapi.hook.param.PackageParam
import com.highcapable.yukihookapi.hook.xposed.proxy.IYukiHookXposedInit
@InjectYukiHookWithXposed(isUsingResourcesHook = false)
@@ -50,31 +46,9 @@ class HookEntry : IYukiHookXposedInit {
isEnableDataChannel = false
}
/**
* 装载对象是否为 QQ、TIM、微信
* @return [Boolean]
*/
private fun PackageParam.isCurrentScope() = packageName.let { it == PackageName.QQ || it == PackageName.TIM || it == PackageName.WECHAT }
override fun onHook() = encase {
loadApp {
if (isCurrentScope()) onAppLifecycle {
attachBaseContext { baseContext, hasCalledSuper ->
if (hasCalledSuper) return@attachBaseContext
ConfigData.init(baseContext)
when (baseContext.packageName) {
PackageName.QQ, PackageName.TIM -> loadHooker(QQTIMHooker.apply { appVersionName = baseContext.versionName })
PackageName.WECHAT -> loadHooker(WeChatHooker)
}
}
onCreate {
when (packageName) {
PackageName.QQ, PackageName.TIM ->
registerModuleAppActivities(proxy = "${PackageName.QQ}.activity.QQSettingSettingActivity")
PackageName.WECHAT -> registerModuleAppActivities(proxy = "${PackageName.WECHAT}.plugin.welab.ui.WelabMainUI")
}
}
}
}
loadApp(PackageName.QQ) { loadHooker(QQTIMHooker) }
loadApp(PackageName.TIM) { loadHooker(QQTIMHooker) }
loadApp(PackageName.WECHAT) { loadHooker(WeChatHooker) }
}
}

View File

@@ -35,13 +35,13 @@ import com.fankes.tsbattery.hook.factory.hookSystemWakeLock
import com.fankes.tsbattery.hook.factory.jumpToModuleSettings
import com.fankes.tsbattery.hook.factory.startModuleSettings
import com.fankes.tsbattery.utils.factory.dp
import com.fankes.tsbattery.utils.factory.versionName
import com.highcapable.yukihookapi.hook.bean.VariousClass
import com.highcapable.yukihookapi.hook.entity.YukiBaseHooker
import com.highcapable.yukihookapi.hook.factory.buildOf
import com.highcapable.yukihookapi.hook.factory.current
import com.highcapable.yukihookapi.hook.factory.field
import com.highcapable.yukihookapi.hook.factory.*
import com.highcapable.yukihookapi.hook.log.loggerD
import com.highcapable.yukihookapi.hook.log.loggerE
import com.highcapable.yukihookapi.hook.log.loggerI
import com.highcapable.yukihookapi.hook.type.android.*
import com.highcapable.yukihookapi.hook.type.java.*
@@ -79,7 +79,7 @@ object QQTIMHooker : YukiBaseHooker() {
private val isQQ get() = packageName == PackageName.QQ
/** 当前宿主的版本 */
var appVersionName = "<unknown>"
private var appVersionName = "<unknown>"
/**
* 这个类 QQ 的 BaseChatPie 是控制聊天界面的
@@ -500,6 +500,21 @@ object QQTIMHooker : YukiBaseHooker() {
}
override fun onHook() {
onAppLifecycle {
onCreate {
appVersionName = versionName
ConfigData.init(context = this)
registerModuleAppActivities(QQSettingSettingActivityClass)
if (ConfigData.isDisableAllHook) return@onCreate
hookSystemWakeLock()
hookQQBaseChatPie()
hookCoreService()
hookQQDisgusting()
loggerI(msg = "All processes are completed for \"${processName.takeIf { it != packageName } ?: packageName}\"")
}
}
/** 仅注入主进程 */
withProcess(mainProcessName) {
/** Hook 跳转事件 */
JumpActivityClass.hook {
injectMember {
@@ -553,14 +568,6 @@ object QQTIMHooker : YukiBaseHooker() {
}
}
}
if (ConfigData.isDisableAllHook) return
/** Hook 系统电源锁 */
hookSystemWakeLock()
/** Hook 聊天界面 */
hookQQBaseChatPie()
/** Hook CoreService */
hookCoreService()
/** Hook QQ 不省电的功能 */
hookQQDisgusting()
}
}
}

View File

@@ -36,10 +36,14 @@ import com.fankes.tsbattery.hook.factory.jumpToModuleSettings
import com.fankes.tsbattery.hook.factory.startModuleSettings
import com.fankes.tsbattery.utils.factory.absoluteStatusBarHeight
import com.fankes.tsbattery.utils.factory.dp
import com.fankes.tsbattery.utils.factory.versionCode
import com.fankes.tsbattery.utils.factory.versionName
import com.highcapable.yukihookapi.hook.entity.YukiBaseHooker
import com.highcapable.yukihookapi.hook.factory.current
import com.highcapable.yukihookapi.hook.factory.injectModuleAppResources
import com.highcapable.yukihookapi.hook.log.loggerD
import com.highcapable.yukihookapi.hook.factory.processName
import com.highcapable.yukihookapi.hook.factory.registerModuleAppActivities
import com.highcapable.yukihookapi.hook.log.loggerI
import com.highcapable.yukihookapi.hook.type.android.BundleClass
/**
@@ -52,10 +56,33 @@ object WeChatHooker : YukiBaseHooker() {
/** 微信存在的类 - 未测试每个版本是否都存在 */
const val LauncherUIClass = "${PackageName.WECHAT}.ui.LauncherUI"
/** 微信存在的类 - 未测试每个版本是否都存在 */
private const val EmptyActivityClass = "${PackageName.WECHAT}.ui.EmptyActivity"
/** 微信存在的类 - 未测试每个版本是否都存在 */
private const val WelabMainUIClass = "${PackageName.WECHAT}.plugin.welab.ui.WelabMainUI"
/** 微信存在的类 - 未测试每个版本是否都存在 */
private const val SettingsUIClass = "${PackageName.WECHAT}.plugin.setting.ui.setting.SettingsUI"
override fun onHook() {
onAppLifecycle {
onCreate {
ConfigData.init(context = this)
registerModuleAppActivities(
when {
EmptyActivityClass.hasClass() -> EmptyActivityClass
WelabMainUIClass.hasClass() -> WelabMainUIClass
else -> error("Inject WeChat Activity Proxy failed, unsupport version $versionName($versionCode)")
}
)
if (ConfigData.isDisableAllHook) return@onCreate
hookSystemWakeLock()
loggerI(msg = "All processes are completed for \"${processName.takeIf { it != packageName } ?: packageName}\"")
}
}
/** 仅注入主进程 */
withProcess(mainProcessName) {
/** Hook 跳转事件 */
LauncherUIClass.hook {
injectMember {
@@ -99,10 +126,6 @@ object WeChatHooker : YukiBaseHooker() {
}
}
}
if (ConfigData.isDisableAllHook) return
/** Hook 系统电源锁 */
hookSystemWakeLock()
/** 日志省电大法 */
loggerD(msg = "ウイチャット:それが機能するかどうかはわかりませんでした")
}
}
}