抱歉,Xposed真的能夠隨心所欲——3.微信運動佔領封面出售廣告位

一句話歸納本文html

簡單的二十行代碼,利用Xposed Hook掉計步傳感器,以此達到刷步數的目的。python


引言android

如今的年輕都喜歡用各類各樣的計步APP來記錄天天的步數,微信自帶的 微信運動由於用戶羣體基數大,不少人都在用,還有釘釘也整個釘釘 運動...看到別人每天走2W步就是爲了佔領封面,多走路原本是個好東西, 卻變成了一種攀比的行爲,走路這種東西不是越多越好的,我...git

本節就來Hook一波微信運動,來試試那種霸佔封面的快感。github


1.胡亂分析

手機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數組, 就是咱們想要的數據了,咱們趕在方法調用前,獲取裏面的步數,而後就能夠隨心所欲 了,好比加上一個值,又或者乘以一個倍數,走一步等於人家走幾百步或者幾千步。

這個方法是在一個靜態內部類中:

上上節講過了,內部類用 $ 符號進行鏈接。

到此,整個過程就摸清了,接下來開始編寫代碼。


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掉某個系統進程,不過很是好玩, 後面會開始慢慢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,驗證信息裏包含: PythonpythonpyPy加羣交易屁眼 中的一個關鍵詞便可經過;

驗證經過後回覆 加羣 便可得到加羣連接(不要把機器人玩壞了!!!)~~~ 歡迎各類像我同樣的Py初學者,Py大神加入,一塊兒愉快地交流學♂習,van♂轉py。

相關文章
相關標籤/搜索