一句话归纳本文html
简单的二十行代码,利用Xposed Hook掉计步传感器,以此达到刷步数的目的。python
引言android
如今的年轻都喜欢用各类各样的计步APP来记录天天的步数,微信自带的 微信运动由于用户群体基数大,不少人都在用,还有钉钉也整个钉钉 运动...看到别人每天走2W步就是为了占领封面,多走路原本是个好东西, 却变成了一种攀比的行为,走路这种东西不是越多越好的,我...git
本节就来Hook一波微信运动,来试试那种霸占封面的快感。github
手机APP计步基本都是依靠的手机自带的传感器,只是不一样的计步软件的算法 可能不同。以4.4为分水岭,在4.4以前步数采集基本都是经过 加速度传感器, 须要一个后台常驻服务实现计步功能,若是后台服务被杀死,会致使计步功能 没法使用。而在4.4以后,大部分手机开始新增计步传感器,官方对此的介绍: developer.android.com/about/versi…算法
该传感器是系统级别的,从手机开机开始记录步数,关机时会重置为0,程序能够 直接调用获取步数,而不用后台运行服务实时跟踪,省电还不用去担忧服务保活的问题。数组
新的计步传感器有两种,官方是建议使用TYPE_STEP_COUNTER,该传感器会进行 较多的处理以消除误报,结果会更加准确。bash
由于不一样APP的计步算法可能不同,还可能对计步结果进行校验之类的,得出不合理 的值可能会增大被监测到异常的几率,因此打算从源头直接Hook掉传感器返回的值。微信
PS:如图是个人Moto xt 1085,5.1的系统,没有计步传感器,微信直接说手机 不支持,猜想是直接放弃了没计步传感器的手机,由于Hook的是微信运动, 因此加速度传感器就不处理了撒~ide
先来编写代码,看下得到传感器数据的整个过程:
返回的values里只有一个值,就是咱们想要的步数。
接着开始跟踪代码,点进去onSensorChange查看源码
dispatchSensorEvent方法,留意到上面的注释了吗? 该方法native层的代码进行调用,全部咱们到这里就够了,values这个float数组, 就是咱们想要的数据了,咱们赶在方法调用前,获取里面的步数,而后就能够随心所欲 了,好比加上一个值,又或者乘以一个倍数,走一步等于人家走几百步或者几千步。
这个方法是在一个静态内部类中:
上上节讲过了,内部类用 $
符号进行链接。
到此,整个过程就摸清了,接下来开始编写代码。
编写一个简单设置页面,一个CheckBox,一个Seekbar滑动条。
接着要找东西存储用户的选项,是否卡开启步数助手,还要记录倍数, 一开始我像之前同样直接使用Hawk的,在APP类里实例化了Hawk, Hawk.init(this).build(),而后在运行的时候我去获取这些参数,发现报错了, 大概是:调用Hawk前须要先调用Hawk.build(),缘由是Hook的 是SystemSensorManager,这个服务,在我这个程序开始前就建立了 因此才会出现这个问题。对于存储这种须要持久化配置型的数据,能够采用 Xposed自带的 XSharedPreferences ,吐槽下,网上关于这个东西的介绍 模棱两可,直接怼代码,一点解释也没有,头皮发麻。
这个东西呢,本质上仍是SharedPreferences,正常使用它的时候,咱们须要传入 上下文context,好比:
而在Xposed中,提供了XSharedPreferences 专门读取自身的 SharedPreferences, 而不用传入context。
注意两点:
接着继续编写代码,写一个 SharedPreferences 的工具类。
再接着改下设置页面的代码: 点击Checkbox和Seekbar移动时把结果写到SP里,进度值默认+1,从0开始。
最后就是核心Xposed代码的编写了:
流程:
\
是转义,在Kotlin里 $
用于变量取值)大概就是这样,原理很是简单。
接着运行重启下,设置1000倍,走一步等于别人走1000步,美滋滋
接着出去溜达如下,或者直接原地摇手机,打开微信运动查看步数:
噗呲
代码和上节同样,很是简单,都是直接Hook掉某个系统进程,不过很是好玩, 后面会开始慢慢Hook一些应用,好比微信,最想作的就是垃圾群聊分组, 还记得以前用无障碍服务AccessibilityService写的自动加好友,拉群, 朋友圈自动点赞,抢红包么?后面都会用Xposed来实现,敬请期待~
附:最终代码(均可以在: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)
}
})
}
}
}
}
复制代码
来啊,Py交易啊
想加群一块儿学习Py的能够加下,智障机器人小Pig,验证信息里包含: Python,python,py,Py,加群,交易,屁眼 中的一个关键词便可经过;
验证经过后回复 加群 便可得到加群连接(不要把机器人玩坏了!!!)~~~ 欢迎各类像我同样的Py初学者,Py大神加入,一块儿愉快地交流学♂习,van♂转py。