抱歉,Xposed真的可以为所欲为——5.我自己刷的Xposed凭什么不给我用(下)

简介: 分析定位排查下厨房APP检测手机是否安装了Xposed框架的方法,然后一步步 Hook掉对应代码,以此去掉恶心的重复弹出警告对话框。

继续胡乱分析


接下来看下下面的这段代码:



这里要注意,静态代码块静态变量 的初始化都发生在类装载 的时候,级别是相同的,会按照代码顺序进行初始化。


这段代码是检验手机是否安装了xposed的一个套路之一,逻辑是:


XposedDetectionUtil 类被调用时,加载,然后显式抛出一个异常, 然后catch这个异常,通过e.getStackTrace获得一个异常调用的堆栈信息, 然后遍历这个堆栈,如果出现了包含XposedBridge的类名或者方法,就说明 用户的手机安装了xposed。


这里其实有个小疑问,为何if里没有代码,是因为反编译没有获得完整代码, 还是这样做就可以了,有知道的看官可以告知下!!!


看到这里,应该基本会想到一个套路:Hook掉getStackTrace()方法 点进去看下这个方法的具体详情:



看完之后,很容易Get到几个点:


  • 1.Hook的完整类名是:java.lang.Throwable


  • 2.Hook的方法是:getStackTrace,该方法返回的是StackTraceElement[]


  • 3.只需要过滤一波返回值,去掉包含XposedBridge的类名或者方法然后重置下即可。


思路又有了,写一波代码~


Hook getStackTrace方法


这里要吐槽一波Kotlin,getStackTrace方法返回的是数组嘛,需要用as Array<StackTraceElement> 强转一波,然后呢,Array类里只有 几个寒碜的方法:



2333,对的,没有移除元素的方法,So,需要借用另一个可变的容器来装, 于是要创建一个可变列表,mutableListOf<StackTraceElement>(), 然后遍历这个数组,把不包含XposedBridge的类和方法装到里面, 遍历完以后,还需要把这个可变集合再强转一波:toArray<StackTraceElement>()然后重置下返回的结果。


所以有了这样的一串代码:



运行下重启手机,打开下厨房,检验下效果:



同时看下Logcat打印的日志信息:



到此就Hook完成了,抱歉,Xposed真的可以为所欲为。


小结


因为下厨房一直弹安装了Xposed的警告,所以有了这篇文章。 检测是否安装了Xposed可以不止这种套路,更多的可以翻阅:Android Java 层的anti-Hook 技巧.md


附:Hook部分代码(都可以在:github.com/coder-pig/C… 找到):


object XiaChuFangHook{
    fun hook(lpparam: XC_LoadPackage.LoadPackageParam) {
        findAndHookMethod("java.lang.Throwable", lpparam.classLoader, "getStackTrace", object : XC_MethodHook() {
            override fun afterHookedMethod(param: MethodHookParam) {
                val result = mutableListOf<StackTraceElement>()
                for (stackTraceElement in (param.result as Array<StackTraceElement>)) {
                    val className = stackTraceElement.className
                    val methodName = stackTraceElement.methodName
                    if(className != null && methodName != null) {
                        if(!className.contains("XposedBridge")  && !methodName.contains("XposedBridge")) {
                            result.add(stackTraceElement)
                        }
                    }
                }
                param.result = toArray<StackTraceElement>(result)
                super.afterHookedMethod(param)
            }
        })
    }
}


相关文章
|
弹性计算
2024年《幻兽帕鲁/Palworld》阿里云服务器优惠价格表
想要在帕鲁的奇幻世界中与可爱的幻兽们共度悠闲时光,或是与偷猎者展开惊心动魄的较量吗?阿里云为您带来了一系列超值优惠的服务器套餐,让您轻松搭建游戏服务器,与全球玩家一同探险!
217 1
|
消息中间件 存储
RabbitMQ的高可用机制
RabbitMQ 提供了多种高可用机制来确保消息队列的可靠性和稳定性。
1076 0
|
测试技术 API Python
Appium控件交互策略:优化自动化测试效率的关键方法
该文介绍了如何使用Selenium与APP进行交互,包括点击、输入和状态判断等操作。例如,通过element.click()点击控件,element.send_keys()输入文本,以及element.is_displayed()检查元素是否可见。还展示了如何获取元素属性,如resource-id、text和class,并提供了Python代码示例来定位并操作APP元素,如滑动条的显示、可点击性检测及点击滑动条中心位置。在编写测试脚本时,应注意元素定位和状态验证以确保测试稳定性。
Grafana实现图表双Y坐标轴展示
Grafana实现图表双Y坐标轴展示
|
存储
数据在内存中的存储之整数存储
数据在内存中的存储之整数存储
119 0
|
测试技术 Android开发 iOS开发
『App自动化测试之Appium基础篇』| Desired Capabilities详解与使用
『App自动化测试之Appium基础篇』| Desired Capabilities详解与使用
276 0
|
存储 Prometheus 监控
【监控】grafana图表使用快速上手
【监控】grafana图表使用快速上手
453 0
|
监控 网络性能优化 网络安全
【MODBUS】Modbus主站为边缘设备通过MQTT协议上云
【MODBUS】Modbus主站为边缘设备通过MQTT协议上云
250 1
|
程序员 编译器 C语言
带你彻头彻尾了解『动态内存管理』
带你彻头彻尾了解『动态内存管理』
|
Linux 数据安全/隐私保护 网络安全