抱歉,Xposed真的可以为所欲为——3.微信运动占领封面出售广告位

简介: 简单的二十行代码,利用Xposed Hook掉计步传感器,以此达到刷步数的目的。

引言


现在的年轻都喜欢用各种各样的计步APP来记录每天的步数,微信自带的微信运动因为用户群体基数大,很多人都在用,还有钉钉也整个钉钉 运动


本节就来Hook一波微信运动,来试试那种霸占封面的快感。


1.胡乱分析


手机APP计步基本都是依靠的手机自带的传感器,只是不同的计步软件的算法 可能不一样。以4.4为分水岭,在4.4之前步数采集基本都是通过 加速度传感器, 需要一个后台常驻服务实现计步功能,如果后台服务被杀死,会导致计步功能 无法使用。而在4.4之后,大部分手机开始新增计步传感器,官方对此的介绍:developer.android.com/about/versi…



该传感器是系统级别的,从手机开机开始记录步数,关机时会重置为0,程序可以 直接调用获取步数,而不用后台运行服务实时跟踪,省电还不用去担心服务保活的问题。

新的计步传感器有两种,官方是建议使用TYPE_STEP_COUNTER,该传感器会进行 较多的处理以消除误报,结果会更加准确。


因为不同APP的计步算法可能不一样,还可能对计步结果进行校验之类的,得出不合理 的值可能会增大被监测到异常的概率,所以打算从源头直接Hook掉传感器返回的值

PS:如图是我的Moto xt 1085,5.1的系统,没有计步传感器,微信直接说手机 不支持,猜测是直接放弃了没计步传感器的手机,因为Hook的是微信运动, 所以加速度传感器就不处理了撒~



先来编写代码,看下获得传感器数据的整个过程:



返回的values里只有一个值,就是我们想要的步数。



接着开始跟踪代码,点进去onSensorChange查看源码



dispatchSensorEvent方法,留意到上面的注释了吗? 该方法native层的代码进行调用,所有我们到这里就够了,values这个float数组, 就是我们想要的数据了,我们赶在方法调用前,获取里面的步数,然后就可以为所欲为 了,比如加上一个值,又或者乘以一个倍数,走一步等于人家走几百步或者几千步。


这个方法是在一个静态内部类中:



上上节讲过了,内部类用 $ 符号进行连接。


到此,整个过程就摸清了,接下来开始编写代码。


2.代码编写


编写一个简单设置页面,一个CheckBox,一个Seekbar滑动条。



接着要找东西存储用户的选项,是否卡开启步数助手,还要记录倍数, 一开始我像以前一样直接使用Hawk的,在APP类里实例化了Hawk, Hawk.init(this).build(),然后在运行的时候我去获取这些参数,发现报错了, 大概是:调用Hawk前需要先调用Hawk.build(),原因是Hook的 是SystemSensorManager,这个服务,在我这个程序开始前就创建了 所以才会出现这个问题。对于存储这种需要持久化配置型的数据,可以采用 Xposed自带的 XSharedPreferences


这个东西呢,本质上还是SharedPreferences,正常使用它的时候,我们需要传入 上下文context,比如:



而在Xposed中,提供了XSharedPreferences 专门读取自身的 SharedPreferences, 而不用传入context。



注意两点:


  • 1.生成SharedPreferences,权限是:Context.MODE_WORLD_READABLE


  • 2.XSharedPreferences实例化后,需要调用makeWorldReadable(),这个玩意只能读不能写!!!


接着继续编写代码,写一个 SharedPreferences 的工具类。



再接着改下设置页面的代码: 点击Checkbox和Seekbar移动时把结果写到SP里,进度值默认+1,从0开始。



最后就是核心Xposed代码的编写了:



流程:


  • 1.判断包名是否为微信或者钉钉


  • 2.反射获取传感器Class(这里的 \ 是转义,在Kotlin里 $ 用于变量取值)


  • 3.Hook掉dispatchSensorEvent),在这里获取第二个参数(下标从0开始算),然后修改 这个float数组里的第一个参数,乘以我们设置的倍数


  • 4.super.beforeHookedMethod(param)调用下原方法


大概就是这样,原理非常简单。


3.为所欲为


接着运行重启下,设置1000倍,走一步等于别人走1000步,美滋滋



接着出去溜达以下,或者直接原地摇手机,打开微信运动查看步数:



4.小结


代码和上节一样,非常简单,都是直接Hook掉某个系统进程


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


class XposedInit : IXposedHookLoadPackage {
    companion object {
        var xsp by Delegates.notNull<XSharedPreferences>()
    }
    init {
        xsp = XSharedPreferences(BuildConfig.APPLICATION_ID, "config")
        xsp.makeWorldReadable()
    }
    @SuppressLint("PrivateApi")
    override fun handleLoadPackage(lpparam: XC_LoadPackage.LoadPackageParam) {
        when (lpparam.packageName) {
            "com.tencent.mm", "com.alibaba.android.rimet" -> {
                val c = Class.forName("android.hardware.SystemSensorManager\$SensorEventQueue")
                XposedBridge.hookAllMethods(c, "dispatchSensorEvent", object : XC_MethodHook() {
                    override fun beforeHookedMethod(param: MethodHookParam) {
                        xsp.reload()
                        if (xsp.getBoolean(Constants.IS_STEP_OPEN, false)) {
                            val muti = xsp.getString(Constants.CUR_STEP_MULT, "1").toInt()
                            (param.args[1] as FloatArray)[0] = (param.args[1] as FloatArray)[0] * muti
                        }
                        super.beforeHookedMethod(param)
                    }
                })
            }
        }
    }
}


相关文章
|
2月前
|
机器学习/深度学习 人工智能 JSON
微信小程序原生AI运动(动作)检测识别解决方案
近年来,疫情限制了人们的出行,却推动了“AI运动”概念的兴起。AI运动已在运动锻炼、体育教学、线上主题活动等多个场景中广泛应用,受到互联网用户的欢迎。通过AI技术,用户可以在家中进行有效锻炼,学校也能远程监督学生的体育活动,同时,云上健身活动形式多样,适合单位组织。该方案成本低、易于集成和扩展,已成功应用于微信小程序。
|
6月前
|
小程序 JavaScript Java
基于SpringBoot+Vue+uniapp微信小程序的运动健康小程序的详细设计和实现
基于SpringBoot+Vue+uniapp微信小程序的运动健康小程序的详细设计和实现
44 1
|
小程序 JavaScript
微信小程序仿微信运动步数排行-交互
微信小程序仿微信运动步数排行-交互
54 0
|
小程序 JavaScript
微信小程序实现运动步数排行(可删除)
微信小程序实现运动步数排行(可删除)
59 0
|
数据安全/隐私保护 Android开发 iOS开发
使用 Python 修改微信/QQ/支付宝运动步数
使用 Python 修改微信/QQ/支付宝运动步数
|
小程序 开发工具 git
如何获取微信文章封面和文章标题!
如何获取微信文章封面和文章标题!
|
编解码 计算机视觉 Python
|
计算机视觉 Python
|
小程序 数据安全/隐私保护
微信小程序——获取用户的运动步数
微信小程序——获取用户的运动步数
微信小程序——获取用户的运动步数