背景
隨著帶協(xié)處理器和買手環(huán)的人越來(lái)越多,微信運(yùn)動(dòng)一下子火了,只要你在微信關(guān)注微信運(yùn)動(dòng),手機(jī)就能自動(dòng)記錄你每天行走的步數(shù),還可以跟朋友圈里的好友PK運(yùn)動(dòng)量。并且每日排名第一的用戶可以占據(jù)當(dāng)日排行榜的封面。這充分激起了大家的求勝的欲望,于是出現(xiàn)了很多勵(lì)志的和悲傷的故事……
微信運(yùn)動(dòng)作弊大法
其實(shí)想要拿第一沒(méi)有那么麻煩,只要會(huì)一點(diǎn)Android的Hook知識(shí),就可以輕松沖到排行榜第一名。接下來(lái)我就手把手教你如何變成第一。
首先我們需要一臺(tái)帶協(xié)處理的root后的android機(jī)器,比如說(shuō)nexus 5。然后我們裝上作弊用的XPosed Hook框架和作弊插件。這兩個(gè)apk可以在我的github上下載到。
https://github.com/zhengmin1989/WechatSportCheat
下載完后,先安裝XPosed.apk。接著打開(kāi)Xposed,選擇“安裝/更新”,然后根據(jù)提示重啟手機(jī)。
重啟完后,再安裝xposedwechat.apk插件。然后打開(kāi)Xposed的模塊界面,會(huì)看到xposedwechat這個(gè)插件。我們?cè)谶@里將它選中,然后再根據(jù)提示重啟手機(jī)。
接下來(lái)就是見(jiàn)證奇跡的時(shí)刻…你隨意走兩步,然后打開(kāi)微信運(yùn)動(dòng),咦,怎么就多了1000步?再隨便走幾步,咦,怎么又多了1000步?… demo視頻如下:
僅僅刷步數(shù)還是不夠過(guò)癮吧?微信運(yùn)動(dòng)還推出了益行家活動(dòng),可以用每天的步數(shù)換取愛(ài)心捐款。有了微信運(yùn)動(dòng)作弊大法,我們可以每天在家隨便走幾步然后換取愛(ài)心捐款(如圖所示)。
微信運(yùn)動(dòng)作弊原理
我們是如何作弊的呢?簡(jiǎn)單來(lái)說(shuō),當(dāng)微信運(yùn)動(dòng)想要知道我們走了多少步的時(shí)候,微信app會(huì)詢問(wèn)android系統(tǒng)的計(jì)數(shù)傳感器,隨后計(jì)數(shù)傳感器會(huì)返回 我們行走的步數(shù)。因此,如果我們能夠攔截微信運(yùn)動(dòng)和計(jì)數(shù)傳感器之間的對(duì)話,然后偽造一個(gè)步數(shù)傳遞給微信運(yùn)動(dòng)就可以達(dá)到我們想要的作弊效果。
具體怎么做呢?首先我們可以用Xposed框架來(lái)hook計(jì)數(shù)傳感器的隊(duì)列函數(shù)dispatchSensorEvent(),這個(gè)函數(shù)在 android.hardware.SystemSensorManager$SensorEventQueue這個(gè)類中。隨后在微信運(yùn)動(dòng)每次詢問(wèn)行走步數(shù)的時(shí)候,我們先獲取當(dāng)前步數(shù),然后在目前的步數(shù)的基礎(chǔ)上加1000步,然后將信息返回給微信運(yùn)動(dòng)。微信運(yùn)動(dòng)就會(huì)誤以為我們運(yùn)動(dòng)了1000步,從而達(dá)到了欺騙的效果。
關(guān)鍵代碼如下:
首先hook android.hardware.SystemSensorManager$SensorEventQueue這個(gè)類的dispatchSensorEvent()函數(shù):
final Class<?> sensorEL = findClass(“android.hardware.SystemSensorManager$SensorEventQueue”,lpparam.classLoader);
XposedBridge.hookAllMethods(sensorEL, “dispatchSensorEvent”, new XC_MethodHook()
接著我們?cè)谟洸絺鞲衅靼巡綌?shù)信息返回給微信運(yùn)動(dòng)之前,將返回的步數(shù)加上1000步:
protected void beforeHookedMethod(MethodHookParam param) throws
Throwable {
XposedBridge.log(” mzheng Hooked method: ” + param.method);
((float[]) param.args[1])[0]=((float[]) param.args[1])[0]+1000*WechatStepCount;
WechatStepCount+=1;
…
另外我們還可以使用一些傳感器的接口獲取一些數(shù)據(jù)的信息:
Sensor ss = ((SparseArray<Sensor>) field.get(0)).get(handle);
XposedBridge.log(” SensorEvent: sensor=” + ss);
比如說(shuō)x就代表開(kāi)機(jī)以來(lái)行走的步數(shù),timestamp是獲取步數(shù)時(shí)候的時(shí)間戳等。
另外,我們不僅在android上可以hook計(jì)步器,在iOS上也是可以通過(guò)越獄后hook iHealth的API接口達(dá)到同樣的作弊效果,有興趣的同學(xué)可以繼續(xù)研究。
3微信運(yùn)動(dòng)反作弊建議
如何防止這種作弊發(fā)生呢?我的第一個(gè)建議是加強(qiáng)服務(wù)器端的邏輯檢測(cè)功能。比如說(shuō)一個(gè)人是不可能十分鐘內(nèi)走一萬(wàn)步的,如果他做到了,那么他一定是在作弊。 我的第二個(gè)建議是增加對(duì)hook的檢測(cè)功能。雖然微信運(yùn)動(dòng)作下弊無(wú)非就是滿足一下大家爭(zhēng)強(qiáng)好勝的虛榮心,并不會(huì)對(duì)大家的隱私和財(cái)產(chǎn)產(chǎn)生損失。但是既然微信 運(yùn)動(dòng)可以被hook,同樣也意味著語(yǔ)音聊天,微信支付等功能也是可以被hook的,當(dāng)黑客利用hook技術(shù)對(duì)你的隱私和財(cái)產(chǎn)產(chǎn)生危害的時(shí)候可就不是那么好 玩的事了。之前我們?cè)贖acking Team事件中也親眼目睹了利用hook技術(shù)來(lái)獲取微信語(yǔ)音消息的android木馬,所以一定要增加針對(duì)hook的檢測(cè)才行。
此文只是介紹了Android Hook的簡(jiǎn)單場(chǎng)景應(yīng)用,關(guān)于Android Hook的原理以及更多的利用方式,比如說(shuō)調(diào)試,關(guān)鍵API攔截,外掛等技巧,敬請(qǐng)期待WooYun Book系列的文章《安卓動(dòng)態(tài)調(diào)試七種武器之離別鉤 – Hooking》。 https://github.com/zhengmin1989/TheSevenWeapons