抱歉,Xposed真的可以为所欲为——3.微信运动占领封面出售广告位(转载)
?
一句話概括本文
簡單的二十行代碼,利用Xposed Hook掉計步傳感器,以此達到刷步數(shù)的目的。
引言
現(xiàn)在的年輕都喜歡用各種各樣的計步APP來記錄每天的步數(shù),微信自帶的 微信運動因為用戶群體基數(shù)大,很多人都在用,還有釘釘也整個釘釘 運動...看到別人天天走2W步就是為了占領(lǐng)封面,多走路本來是個好東西, 卻變成了一種攀比的行為,走路這種東西不是越多越好的,我...
?
?
?
本節(jié)就來Hook一波微信運動,來試試那種霸占封面的快感。
1.胡亂分析
手機APP計步基本都是依靠的手機自帶的傳感器,只是不同的計步軟件的算法 可能不一樣。以4.4為分水嶺,在4.4之前步數(shù)采集基本都是通過 加速度傳感器, 需要一個后臺常駐服務(wù)實現(xiàn)計步功能,如果后臺服務(wù)被殺死,會導(dǎo)致計步功能 無法使用。而在4.4之后,大部分手機開始新增計步傳感器,官方對此的介紹: developer.android.com/about/versi…
?
?
?
該傳感器是系統(tǒng)級別的,從手機開機開始記錄步數(shù),關(guān)機時會重置為0,程序可以 直接調(diào)用獲取步數(shù),而不用后臺運行服務(wù)實時跟蹤,省電還不用去擔(dān)心服務(wù)保活的問題。
新的計步傳感器有兩種,官方是建議使用TYPE_STEP_COUNTER,該傳感器會進行 較多的處理以消除誤報,結(jié)果會更加準(zhǔn)確。
因為不同APP的計步算法可能不一樣,還可能對計步結(jié)果進行校驗之類的,得出不合理 的值可能會增大被監(jiān)測到異常的概率,所以打算從源頭直接Hook掉傳感器返回的值。
PS:如圖是我的Moto xt 1085,5.1的系統(tǒng),沒有計步傳感器,微信直接說手機 不支持,猜測是直接放棄了沒計步傳感器的手機,因為Hook的是微信運動, 所以加速度傳感器就不處理了撒~
?
?
?
先來編寫代碼,看下獲得傳感器數(shù)據(jù)的整個過程:
?
?
?
返回的values里只有一個值,就是我們想要的步數(shù)。
?
?
?
接著開始跟蹤代碼,點進去onSensorChange查看源碼
?
?
?
dispatchSensorEvent方法,留意到上面的注釋了嗎? 該方法native層的代碼進行調(diào)用,所有我們到這里就夠了,values這個float數(shù)組, 就是我們想要的數(shù)據(jù)了,我們趕在方法調(diào)用前,獲取里面的步數(shù),然后就可以為所欲為 了,比如加上一個值,又或者乘以一個倍數(shù),走一步等于人家走幾百步或者幾千步。
這個方法是在一個靜態(tài)內(nèi)部類中:
?
?
?
上上節(jié)講過了,內(nèi)部類用 $ 符號進行連接。
到此,整個過程就摸清了,接下來開始編寫代碼。
2.代碼編寫
編寫一個簡單設(shè)置頁面,一個CheckBox,一個Seekbar滑動條。
?
?
?
接著要找東西存儲用戶的選項,是否卡開啟步數(shù)助手,還要記錄倍數(shù), 一開始我像以前一樣直接使用Hawk的,在APP類里實例化了Hawk, Hawk.init(this).build(),然后在運行的時候我去獲取這些參數(shù),發(fā)現(xiàn)報錯了, 大概是:調(diào)用Hawk前需要先調(diào)用Hawk.build(),原因是Hook的 是SystemSensorManager,這個服務(wù),在我這個程序開始前就創(chuàng)建了 所以才會出現(xiàn)這個問題。對于存儲這種需要持久化配置型的數(shù)據(jù),可以采用 Xposed自帶的 XSharedPreferences ,吐槽下,網(wǎng)上關(guān)于這個東西的介紹 模棱兩可,直接懟代碼,一點解釋也沒有,頭皮發(fā)麻。
這個東西呢,本質(zhì)上還是SharedPreferences,正常使用它的時候,我們需要傳入 上下文context,比如:
?
?
?
而在Xposed中,提供了XSharedPreferences 專門讀取自身的 SharedPreferences, 而不用傳入context。
?
?
?
注意兩點:
- 1.生成SharedPreferences,權(quán)限是:Context.MODE_WORLD_READABLE
- 2.XSharedPreferences實例化后,需要調(diào)用makeWorldReadable(),這個玩意 只能讀,不能寫!!!
接著繼續(xù)編寫代碼,寫一個 SharedPreferences 的工具類。
?
?
?
再接著改下設(shè)置頁面的代碼: 點擊Checkbox和Seekbar移動時把結(jié)果寫到SP里,進度值默認+1,從0開始。
?
?
?
最后就是核心Xposed代碼的編寫了:
?
?
?
流程:
- 1.判斷包名是否為微信或者釘釘
- 2.反射獲取傳感器Class(這里的 \ 是轉(zhuǎn)義,在Kotlin里 $ 用于變量取值)
- 3.Hook掉dispatchSensorEvent),在這里獲取第二個參數(shù)(下標(biāo)從0開始算),然后修改 這個float數(shù)組里的第一個參數(shù),乘以我們設(shè)置的倍數(shù)
- 4.super.beforeHookedMethod(param)調(diào)用下原方法
大概就是這樣,原理非常簡單。
3.為所欲為
接著運行重啟下,設(shè)置1000倍,走一步等于別人走1000步,美滋滋
?
?
?
接著出去溜達以下,或者直接原地搖手機,打開微信運動查看步數(shù):
?
?
?
噗呲
?
?
?
4.小結(jié)
代碼和上節(jié)一樣,非常簡單,都是直接Hook掉某個系統(tǒng)進程,不過非常好玩, 后面會開始慢慢Hook一些應(yīng)用,比如微信,最想做的就是垃圾群聊分組, 還記得之前用無障礙服務(wù)AccessibilityService寫的自動加好友,拉群, 朋友圈自動點贊,搶紅包么?后面都會用Xposed來實現(xiàn),敬請期待~
?
?
?
附:最終代碼(都可以在: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)}})}}} } 復(fù)制代碼
原文鏈接:https://juejin.im/post/5adf1d846fb9a07abb234015
總結(jié)
以上是生活随笔為你收集整理的抱歉,Xposed真的可以为所欲为——3.微信运动占领封面出售广告位(转载)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: AI编程软件会取代程序员吗?
- 下一篇: 小熊美家上线法大大,电子合同创新家政数字