抱歉,Xposed真的可以为所欲为——3.微信运动占领封面出售广告位
抱歉,Xposed真的可以為所欲為——3.微信運動占領封面出售廣告位
標簽: 2018
一句話概括本文
簡單的二十行代碼,利用Xposed Hook掉計步傳感器,以此達到刷步數的目的。
引言
現在的年輕都喜歡用各種各樣的計步APP來記錄每天的步數,微信自帶的 
 微信運動因為用戶群體基數大,很多人都在用,還有釘釘也整個釘釘 
 運動…看到別人天天走2W步就是為了占領封面,多走路本來是個好東西, 
 卻變成了一種攀比的行為,走路這種東西不是越多越好的,我…
本節就來Hook一波微信運動,來試試那種霸占封面的快感。
1.胡亂分析
手機APP計步基本都是依靠的手機自帶的傳感器,只是不同的計步軟件的算法 
 可能不一樣。以4.4為分水嶺,在4.4之前步數采集基本都是通過 加速度傳感器, 
 需要一個后臺常駐服務實現計步功能,如果后臺服務被殺死,會導致計步功能 
 無法使用。而在4.4之后,大部分手機開始新增計步傳感器,官方對此的介紹: 
 https://developer.android.com/about/versions/android-4.4.html#UserInput
該傳感器是系統級別的,從手機開機開始記錄步數,關機時會重置為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掉某個系統進程,不過非常好玩, 
 后面會開始慢慢Hook一些應用,比如微信,最想做的就是垃圾群聊分組, 
 還記得之前用無障礙服務AccessibilityService寫的自動加好友,拉群, 
 朋友圈自動點贊,搶紅包么?后面都會用Xposed來實現,敬請期待~
附:最終代碼(都可以在:https://github.com/coder-pig/CPWechatXposed 找到):
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。
總結
以上是生活随笔為你收集整理的抱歉,Xposed真的可以为所欲为——3.微信运动占领封面出售广告位的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: 网站开发规范及流程v1.0
 - 下一篇: BeJSON—实用网站(一)