抱歉,Xposed真的能够随心所欲——5.我本身刷的Xposed凭什么不给我用

一句话归纳本文java

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


引言git

由于有带饭的习惯,每周上班前的一天都会想好这周要作的菜式,而后京东 到家采购一波食材。昨天下午当我习惯性地打开下厨房,而后:github

每打开一个新的页面就弹一次对话框,哇,是真的烦!我TMwindows

你说我Hook了下厨房,这样整我没话说,可是我只是装Xposed只是Hook 一下微信,这就很烦啦,行行行,那我只能也Hook下下厨房咯,就Hook掉你检测 是否安装了Xposed方法总行了吧!因而有了这篇文章~数组


胡乱分析

先定位一波方法咯,接上手机,打开 monitor ,新版的AS貌似连入口都 隐藏了,你须要到 sdk的tools目录 下找下,windows下的是 monitor.bat微信

先获取一波下厨房的包名:com.xiachufang框架

接着找到对应的进程:ide

第一个就不用说了,接着跟踪一波方法调用,点入下一个页面弹出 Xposed提示对话框,点击肯定后为止:工具

接着搜索:xposed 逐个排除,不难定位到(包名):

这个 XposedDetectionUtil 类十有八九就是判断是否安装了Xposed 的工具类了,接着用Jadx反编译工具,反编译一波apk,接着用AS打开 反编译后的工程! (PS:多是采用了加固或者什么手段,不是全部代码都能正确反编译 出来的!!!)

反编译后的项目结构以下:

呃...,有点太过于耿直了吧,类名啥的也不混淆一下... 打开XposedDetectionUtil类,代码以下:

z 映入眼帘的入手点:

sXposedInstalledisXposedInstalled()方法,初步猜想前者是一个标记, 默认true,表明手机装了xposed,应该是在进行程序的时候经过一些逻辑判断后 去修改这个标志变量,而后Activity基类进入前先获取这个变量,而后决定是否 弹出Xposed警告对话框。

得出最简单的hook方法就是直接把这个变量的值修改成true。写代码试试~


Hook标志位静态变量

代码很是简单,修改权限,而后设置下标志位为true

模块安装上,重启下,接着打开下厨房,可是程序却意外闪退了,看下Log:

校验错误异常?猜想是在错误的位置修改了本地寄存器的变量, 要另外去折腾smali,脑袋疼(反编译与逆向分析java.lang.VerifyError总结) 放弃改变量这个套路了,得从另外一个入手点切入。


继续胡乱分析

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

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

这段代码是检验手机是否安装了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)
            }
        })
    }
}
复制代码

来啊,Py交易啊

想加群一块儿学习Py的能够加下,智障机器人小Pig,验证信息里包含: PythonpythonpyPy加群交易屁眼 中的一个关键词便可经过;

验证经过后回复 加群 便可得到加群连接(不要把机器人玩坏了!!!)~~~ 欢迎各类像我同样的Py初学者,Py大神加入,一块儿愉快地交流学♂习,van♂转py。

相关文章
相关标签/搜索