Skip to content

Commit

Permalink
[feat] 8.0.49适配。重要变更:
Browse files Browse the repository at this point in the history
(1)移除`主页搜索隐藏-强力模式`
(2)对搜索隐藏启用了数据库查询语句hook,修改了查询sql实现过滤掉指定用户
由于hook了sql,可能存在bug
  • Loading branch information
Mingyueyixi committed Jul 14, 2024
1 parent 974459b commit 609b4bb
Show file tree
Hide file tree
Showing 15 changed files with 569 additions and 106 deletions.
1 change: 1 addition & 0 deletions app/src/main/java/com/lu/wxmask/Constrant.kt
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@ class Constrant {
const val WX_CODE_8_0_45 = 2521
const val WX_CODE_8_0_46 = 2540
const val WX_CODE_8_0_47 = 2560
const val WX_CODE_8_0_49 = 2600

// Google Play Store
const val WX_CODE_PLAY_8_0_42 = 2429
Expand Down
215 changes: 213 additions & 2 deletions app/src/main/java/com/lu/wxmask/plugin/CommonPlugin.kt
Original file line number Diff line number Diff line change
@@ -1,7 +1,15 @@
package com.lu.wxmask.plugin

import android.content.Context
import android.database.Cursor
import com.lu.lposed.api2.XC_MethodHook2
import com.lu.lposed.api2.XC_MethodReplacement2
import com.lu.lposed.api2.XposedHelpers2
import com.lu.lposed.plugin.IPlugin
import com.lu.lposed.plugin.PluginProviders
import com.lu.magic.util.CursorUtil
import com.lu.magic.util.log.LogUtil
import com.lu.wxmask.ClazzN
import com.lu.wxmask.util.HookPointManager
import de.robv.android.xposed.callbacks.XC_LoadPackage

Expand Down Expand Up @@ -31,8 +39,211 @@ class CommonPlugin : IPlugin {
// }
// )

HookPointManager.INSTANCE.init(context, lpparam)
// HookPointManager.INSTANCE.init(context, lpparam)

// XposedHelpers2.findAndHookMethod(
// ClazzN.from("com.tencent.mm.sdk.platformtools.p2"),
// "getLogLevel",
// java.lang.Long.TYPE,
// object : XC_MethodHook2() {
// override fun afterHookedMethod(param: MethodHookParam) {
// param.result = 0
// XposedHelpers2.setStaticIntField(ClazzN.from("com.tencent.mm.sdk.platformtools.k2"), "a", 0)
// }
// })
//
// XposedHelpers2.findMethodsByExactPredicate(ClazzN.from("com.tencent.mm.sdk.platformtools.p2")) { m ->
// return@findMethodsByExactPredicate m.name.startsWith("log")
// }.forEach {
// XposedHelpers2.hookMethod(it, object : XC_MethodHook2() {
// override fun afterHookedMethod(param: MethodHookParam) {
// LogUtil.d("wxLog: ", param.args)
// }
// })
// }
//
// XposedHelpers2.findMethodsByExactPredicate(ClazzN.from("com.tencent.mars.xlog.Xlog")) { m ->
// return@findMethodsByExactPredicate m.name.startsWith("log") || m.name == "getLogLevel"
// }.forEach {
// if (it.name == "getLogLevel") {
// XposedHelpers2.hookMethod(it, object : XC_MethodHook2() {
// override fun afterHookedMethod(param: MethodHookParam) {
// param.result = 0
// }
// })
// } else {
// XposedHelpers2.hookMethod(it, object : XC_MethodHook2() {
// override fun afterHookedMethod(param: MethodHookParam) {
// LogUtil.d("wxLogXLog: ", param.args)
// }
// })
// }
// }


XposedHelpers2.findMethodsByExactPredicate(ClazzN.from("com.tencent.wcdb.database.SQLiteDatabase")) { m ->
if (m.name == "rawQueryWithFactory") {
LogUtil.d("rawQueryWithFactory", m.parameterTypes.size)
return@findMethodsByExactPredicate m.parameterTypes.size == 4
}
false
}.onEach {
XposedHelpers2.hookMethod(it, object : XC_MethodReplacement2() {
override fun replaceHookedMethod(param: MethodHookParam): Any? {
// LogUtil.d("sql rawQueryWithFactory:", param.args[1], param.args[2], param.args[3])
// val sourceData = CursorUtil.getAll(cursor, true, true)
// LogUtil.d("sql rawQueryWithFactory result:", sourceData)
//通过拦截sql语句,来隐藏搜索,或者通过cursor代理来隐藏

var sql = param.args[1].toString()
val wxMaskPlugin = PluginProviders.from(WXMaskPlugin::class.java)
val needReplace = wxMaskPlugin.maskIdList.isNotEmpty() && (
sql.startsWith("SELECT FTS5MetaTopHits.docid")
|| sql.startsWith("SELECT FTS5MetaContact.docid")
|| sql.startsWith("SELECT FTS5MetaKefuContact.docid")
|| sql.startsWith("SELECT FTS5MetaFeature.docid")
|| sql.startsWith("SELECT FTS5MetaWeApp.docid")
|| sql.startsWith("SELECT FTS5MetaFinderFollow.docid")
|| sql.startsWith("SELECT FTS5MetaFavorite.docid"))

if (needReplace) {
val hideValueText = StringBuilder()
for ((index, s) in wxMaskPlugin.maskIdList.withIndex()) {
hideValueText.append("\"$s\"")
if (index < wxMaskPlugin.maskIdList.size - 1) {
hideValueText.append(",")
}
}

if (sql.endsWith(";")) {
sql = sql.substring(0, sql.length - 1)
}
val sql2 = "SELECT * FROM ($sql) AS a WHERE aux_index NOT IN ($hideValueText);"

param.args[1] = sql2
LogUtil.d("sql hide hit:", sql2)
}
val result = XposedHelpers2.invokeOriginalMethod(param.method, param.thisObject, param.args)

// if (result is Cursor) {
// LogUtil.d("sql:", sql, param.args[2])
// LogUtil.d("sql result:", CursorUtil.getAll(result, true, true))
// }
return result
}

})

}

}

}
// private fun proxyCursor(cursor: Cursor, filterList: List<Map<String, Any?>>): Any {
// if (!Proxy.isProxyClass(cursor::class.java)) {
// // 创建代理类
// Proxy.newProxyInstance(
// cursor.javaClass.getClassLoader(),
// cursor.javaClass.getInterfaces(),
// CursorProxy(cursor, filterList)
// )
// }
// return cursor
//
// }

}

//class WxCursorWrap(val cursor: Cursor, val filterList: List<Map<String, Any?>>) : AbstractCursor {
// override fun getCount(): Int {
// return filterList.size
// }
//
// private inline fun getValue(column: Int): Any? {
// val columnName = getColumnName(column)
// return filterList[position][columnName]
// }
//
// override fun getColumnNames(): Array<String> {
// return cursor.columnNames
// }
//
// override fun getString(column: Int): String? {
// val result = getValue(column)
// return result?.toString()
// }
//
// override fun getShort(column: Int): Short? {
// val result = getValue(column)
// if (result is Short) {
// return result
// }
// return if (result is Number) {
// result.toShort()
// } else {
// result.toString().toShortOrNull()
// }
// }
//
// override fun getInt(column: Int): Int {
// val result = getValue(column)
// if (result is Int) {
// return result
// }
// return if (result is Number) {
// result.toInt()
// } else {
// result.toString().toIntOrNull() ?: 0
// }
// }
//
// override fun getLong(column: Int): Long {
// val result = getValue(column)
// if (result is Long) {
// return result
// }
// return if (result is Number) {
// result.toLong()
// } else {
// result.toString().toLongOrNull() ?: 0
// }
// }
//
// override fun getFloat(column: Int): Float {
// val result = getValue(column)
// return if (result is Float) {
// result
// } else if (result is Number) {
// result.toFloat()
// }else{
// result.toString().toFloatOrNull() ?: 0f
// }
// }
//
// override fun getDouble(column: Int): Double {
// val result = getValue(column)
// return if (result is Double) {
// result
// } else if (result is Number) {
// result.toDouble()
// }else {
// result.toString().toDoubleOrNull() ?: 0.0
// }
// }
//
// override fun isNull(column: Int): Boolean {
// return getValue(column) == null
// }
//
//}
//
//class CursorProxy(val cursor: Cursor, val filterList: List<Map<String, Any?>>) : InvocationHandler {
//
// override fun invoke(proxy: Any?, method: Method, args: Array<out Any>?): Any {
// if ("getCount" == method.name) {
// return filterList.size
// }
// if ()
// return method.invoke(cursor, args)
// }
//
//}
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@ class EmptySingChatHistoryGalleryPluginPart : IPlugin {
in Constrant.WX_CODE_8_0_43..Constrant.WX_CODE_8_0_44 -> "z"
in Constrant.WX_CODE_8_0_44..Constrant.WX_CODE_8_0_45 -> "A"
Constrant.WX_CODE_8_0_47 -> "B"
Constrant.WX_CODE_8_0_49 -> "y"
else -> "l"
}
val MediaHistoryListUI = "com.tencent.mm.ui.chatting.gallery.MediaHistoryListUI"
Expand Down Expand Up @@ -232,6 +233,7 @@ class EmptySingChatHistoryGalleryPluginPart : IPlugin {
in Constrant.WX_CODE_8_0_40..Constrant.WX_CODE_8_0_41, Constrant.WX_CODE_8_0_43 -> "Q"
in Constrant.WX_CODE_8_0_41..Constrant.WX_CODE_8_0_42 -> "R"
in Constrant.WX_CODE_8_0_44..Constrant.WX_CODE_8_0_47 -> "D"
Constrant.WX_CODE_8_0_49 -> "F"
else -> null
}
LogUtil.d("setEmptyActionBarTabPageUI method is :", commonHookMethodName)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,7 @@ class EnterChattingUIPluginPart() : IPlugin {
in Constrant.WX_CODE_8_0_40..Constrant.WX_CODE_8_0_41 -> "K"
in Constrant.WX_CODE_8_0_41..Constrant.WX_CODE_8_0_42 -> "M"
in Constrant.WX_CODE_8_0_44 .. Constrant.WX_CODE_8_0_47 -> "z"
Constrant.WX_CODE_8_0_49 -> "B"
else -> null
}
var dispatchMethod: Method? = null
Expand Down Expand Up @@ -165,7 +166,7 @@ class EnterChattingHookAction(
val mmListViewId =
if (AppVersionUtil.getVersionCode() == Constrant.WX_CODE_PLAY_8_0_42) {
ResUtil.getViewId("bnu")
} else if (AppVersionUtil.getVersionCode() in Constrant.WX_CODE_8_0_42..Constrant.WX_CODE_8_0_47) {
} else if (AppVersionUtil.getVersionCode() in Constrant.WX_CODE_8_0_42..Constrant.WX_CODE_8_0_49) {
ResUtil.getViewId("bm6")
} else {
ResUtil.getViewId("b5n")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ class HideMainUIListPluginPart : IPlugin {
val GetItemMethodName = when (AppVersionUtil.getVersionCode()) {
Constrant.WX_CODE_8_0_22 -> "aCW"
in Constrant.WX_CODE_8_0_22..Constrant.WX_CODE_8_0_43 -> "k" // WX_CODE_PLAY_8_0_42 matches
Constrant.WX_CODE_8_0_49 -> "l"
else -> "m"
}

Expand Down Expand Up @@ -268,7 +269,7 @@ class HideMainUIListPluginPart : IPlugin {
in Constrant.WX_CODE_8_0_35..Constrant.WX_CODE_8_0_38 -> "com.tencent.mm.ui.z"
in Constrant.WX_CODE_8_0_40..Constrant.WX_CODE_8_0_43 -> "com.tencent.mm.ui.b0" // WX_CODE_PLAY_8_0_42 matches
in Constrant.WX_CODE_8_0_43..Constrant.WX_CODE_8_0_44 -> "com.tencent.mm.ui.h3"
in Constrant.WX_CODE_8_0_43..Constrant.WX_CODE_8_0_47 -> "com.tencent.mm.ui.i3"
in Constrant.WX_CODE_8_0_43..Constrant.WX_CODE_8_0_49 -> "com.tencent.mm.ui.i3"
else -> null
}
var getItemMethod = if (adapterClazzName != null) {
Expand Down Expand Up @@ -342,18 +343,18 @@ class HideMainUIListPluginPart : IPlugin {
XposedHelpers2.setObjectField(itemData, "field_unReadCount", 0)
XposedHelpers2.setObjectField(itemData, "field_UnReadInvite", 0)
XposedHelpers2.setObjectField(itemData, "field_unReadMuteCount", 0)

//文本消息
XposedHelpers2.setObjectField(itemData, "field_msgType", "1")

// try {
// var cTime = XposedHelpers2.getObjectField<Long>(itemData, "field_conversationTime")
// if (cTime != null) {
// val cTime2 = cTime - Constrant.ONE_YEAR_MILLS
// XposedHelpers2.setObjectField(itemData, "field_flag", cTime2)
// XposedHelpers2.setObjectField(itemData, "field_conversationTime", cTime2)
// }
// } catch (e: Exception) {
// }
// XposedHelpers2.setObjectField(itemData, "field_msgType", "1")
try {
val cTime = XposedHelpers2.getObjectField<Any>(itemData, "field_conversationTime")
val fieldFlag = XposedHelpers2.getObjectField<Any>(itemData, "field_flag")
if (cTime != null && fieldFlag != cTime) {
XposedHelpers2.setObjectField(itemData, "field_flag", cTime)
}
} catch (e: Exception) {
e.printStackTrace()
}

}

Expand Down
Loading

0 comments on commit 609b4bb

Please sign in to comment.