一句話歸納本文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。