王盛邦, 韋寶典, 謝 逸
(1. 中山大學 公共教學實驗中心, 廣東 廣州 510006;2. 中山大學 數據科學與計算機學院, 廣東 廣州 510006)
通過技術層面分析微信紅包[1-4],并以此作為教學案例。通過抓取移動數據分析微信紅包分發、接收的全過程,包括URL、紅包服務器IP和延遲等細節內容;此外,通過記錄和分析群內搶紅包數據,找出紅包金額分布規律、時序分布規律以及每個人多次搶到的紅包金額的分布規律。剖折、探究自動搶紅包的機理,提出了防范外掛搶紅包軟件的策略。
在對移動端數據進行分析的過程中,需要捕獲手機端側的數據包。在有線網絡環境里,基本上不必做特別的設置,使用諸如Wireshark的工具,就可以捕獲到大量的數據包。而對于手機上移動端數據,捕獲方法顯然有別于有線網絡環境。目前比較常用的方法有以下幾種:
(1) 使用Tcpdump[5]工具抓包,所抓取的數據包保存在手機上,之后需傳回PC處理,此法需要root權限,缺點是環節較多;
(2) 在PC上建立WiFi熱點,手機連上熱點后使用熟知的Wireshark[6-7]就可以捕獲流經的數據包,只要PC配備有無線網卡且具有無線承載功能,就可以采用此法;
(3) 使用Fiddler[8-9]工具抓包,Fiddler是一個富客戶端桌面工具,可以對移動終端上客戶端和服務器之間的通信數據進行捕獲,一般需要將PC上的瀏覽器的代理設置為指向Fiddler所監聽的端口,Fiddler啟動后對該端口進行監聽,當瀏覽器請求網頁的時候,Fiddler便能獲取所有請求的數據和Web服務器回復的數據。
采用第2或第3種方法,對于所有能夠無線訪問的手機都比較合適。而在PC端建立WiFi熱點方面,只須使用Windows系統提供的網絡外殼命令netsh。此命令同時起到監視自己的WiFi有沒有被蹭網的作用。
捕獲到手機數據包后,接下來就是對關于紅包的數據包進行分析。圖1、圖2是捕獲的微信紅包數據。

圖1 發紅包數據

圖2 拆紅包數據
微信紅包應用流程主要分為發送和接收2個主要流程。分析圖1、圖2可知:
(1) 發送流程主要交互域名為short.weixin.qq.com,以POST方式發起,包括支付過程。
(2) 接收流程主要交互域名為wx.gtimg.com,以GET方式下載紅包圖片,以POST方式向short.weixin.qq.com發起紅包余額相關更新。
GET就是搶紅包的關鍵,接收紅包消息,該消息類型為圖片形式,該消息觸發的信令詳細URI為http://wx.gtimg.com/hongbao/img/hongbao.png,訪問方式為GET,資源類型為image/png。
POST就是拆紅包的關鍵,點開紅包頁面,點擊“拆”后便跳轉至紅包詳情界面,后臺進行紅包余額更新等交互動作,該動作出發的信令詳細URI為http://short.weixin.qq.com/cgi-bin/mmpay-bin/hongbao,訪問方式為POST,資源類型為application/octet-stream。
經多次實驗,微信在應用層使用HTTP協議傳輸數據,微信紅包分發以POST方式發起,包括支付過程;而接收流程以GET的方式下載紅包圖片,以POST方式發起紅包余額更新(搶到紅包)。騰訊提供了多個負載均衡服務器,除IP地址為14.215.158.100外,還有58.251.100.101、180.163.25.140等。另外,微信使用了基于TSL 1.3的安全通信協議mmtls[10],該協議只對Server做認證。mmtls除安全性高外,還可保證數據在傳輸過程低延遲。
其他細節,諸如紅包發送頁面、支付頁面、成功發送、接收紅包、拆紅包等,都可在抓取的數據包中詳細分析,限于篇幅,本文不再展開。
搶紅包時,常彈出“手慢了”的提示,如果排除人為因素,主要與延遲有關。微信客戶端與服務器之間的鏈接是通過TCP協議建立的,而后面傳送數據的過程主要就是用HTTP協議建立的。這2部分都可能產生延遲協議。此外,還有DNS 解析的時間等。圖3是通過Fiddler工具捕獲的數據。

圖3 Fiddler捕獲的數據
通過Fiddler工具的Statistics選項卡 可以查看到有關HTTP 請求的信息,包括Client 以及Server 的連接、請求和響應時間(3次握手產生的延遲)。例如本次實驗中,DNS 解析的時間是5 ms,建立TCP/IP 連接的時間是139 ms。此外,受制于服務器的處理效率及客戶端設備的效率等,服務器處理也是有一定的延時。還會存在因為丟包而產生的難以避免的延遲。實際上,延遲還要考慮網絡環境,較優的路線可以降低延時和丟包率等。
(1) WiFi環境還是運營商流量環境。手機網絡的狀態是搶到紅包成功與否的關鍵因素。隨著4G網絡的發展,在信號正常的環境下,4G網絡的網速已經超越寬帶的網速,而且4G網絡的延時僅僅為20~30 ms,遠勝于一般寬帶100 ms左右的延遲。同時由于WiFi屬于公用網絡,同一WiFi下的其他用戶網絡數據的不確定性又為搶紅包帶來了很大的干擾,而且WiFi的信號在不同的位置會有不同程度的衰減。所以,搶紅包的時候4G網絡優先,WiFi次之。
(2) 手機性能。手機性能對搶紅包有何影響?使用4年前出品的手機,與時下流行的熱門手機在同一環境進行搶紅包測試。假設有紅包30份,經多次試驗,在WiFi環境下,新手機不會落空,搶到時一般處于前10,而舊手機如能搶到,要排到27之后,甚至常搶不到;在使用運營商流量時,新手機已經搶到紅包了,而舊手機才出現紅包提示圖標。這說明手機性能對延遲的影響程度很大。
(3) 手機品牌。搶紅包的時候往往是一瞬間的事,需要手機能極快速地跳轉到“搶紅包”的頁面,所以理論上來說,性能越強的手機在搶紅包的時候越有優勢。由于不同品牌手機性能會有所差異,即使是同時期的產品,在延遲上也會略有差異。
搶紅包策略是一個引人入勝的問題。時常期望自己是手氣最佳的,但有時在某種情況下又希望避免手氣最佳。最懊惱的莫過于點開紅包后看到“手慢了”的提示。
微信派發紅包的形式共有2種,一種是普通的等額紅包,一對一或者一對多發送,無論先搶還是后搶,紅包金額是一樣的;另一種被稱作“拼手氣群紅包”,由發紅包者設定好總金額以及紅包份數,自動生成不同金額的紅包供他人搶,搶到的紅包中金額隨機(隨機數在0.01~200元之間),多的可能超過紅包總額的80%,少的只有一兩分錢。本文討論的是后一種形式。這種形式在拆開紅包后可看到“紅包詳情”中各種隨機生成的金額不等的紅包,通常“手氣最佳”只有一個(有可能會出現金額一樣的,但是手氣最佳只有一個,先搶到的那個為最佳)。如果份數被設定得足夠多,就有可能產生0.01元的紅包。
值得一提的是有所謂“末尾紅包抽屜原理”。該原理稱,在微信紅包中,n個人搶(n+1)分錢,必然是前面的人都搶到1分,最后一個人搶到2分。經測試,在手機上基本如此。
微信并未公布紅包隨機生成算法,本文只是通過實驗數據給出一些搶紅包策略。
實驗獲取紅包的數據見圖4,一共有12組,每組有21個成員參與搶紅包,每次的總金額是5元,紅框處屬于手氣最佳。

圖4 搶紅包樣本數據
通過觀察圖4可知,紅包金額最小的為0.01元,第一個被搶紅包金額最大為 0.43,這小于均值的2倍(0.476)。且每個紅包的金額都比剩余均值的2倍要小,即紅包金額分布在0.01到2倍剩余金額均值之間。對以上數據畫出散點圖,如圖5所示。

圖5 紅包金額分布圖
橫軸為第n個人搶的紅包,縱軸為搶到的紅包的金額。通過對比,可以發現越往后面覆蓋的金額范圍越大,最高金額的紅包幾乎是由后搶的人獲得。即越往后面搶獲得最高金額的機會越大。根據圖4中數據畫出紅包金額的均值以及標準差折線圖,如圖6所示。

圖6 紅包金額的均值以及標準差
由圖6可見,均值在每個紅包均值范圍上下浮動不大,而標準差則是越后越大。所以,越后搶紅包的金額越不穩定,即有機會搶到大紅包。通常第一個搶紅包的人通常不會手氣最佳。后搶的標準差更大,也就是能搶到超級大的紅包,也可能搶到超級小的紅包。其規律總結如下:
(1) 每個紅包金額服從最小值(0.01)到 2 倍剩余均值之間的均勻分布,即不論先搶后搶,紅包金額均值都一樣。
(2) 越往后搶紅包金額的方差越大,即越后搶越可能搶到超級大紅包。
當我們點擊“拆”紅包圖標時,實際上并不知道該紅包有多少份、每份有多少金額,以及已經有多少人在前面搶了,因而所謂“策略”有點“蒙”的意思。但根據實驗的結果,可以大體上把握一些微信搶紅包的技巧:
(1) 不論是先搶還是后搶,最終搶到的平均金額都是差不多的。
(2) 如果不想冒險,只想穩穩當當地領取紅包,可以盡快搶。
(3) 如果在搶紅包的過程中,想要“手氣最佳”,可以后搶,這樣的機率更大。
所以當微信群玩“手氣最佳發紅包”的游戲時,可以根據這些規律,盡量地降低手氣最佳的概率,發的紅包數少就后搶,紅包多就中間搶,紅包數目很多就先搶,這樣一般可以有效規避“手氣最佳”,從而避免被動發紅包。例如,在3~5人游戲時,手氣最佳的概率是隨搶的順序而降低的,所以選擇后搶。在6~15人游戲時,手氣最佳的概率是先低后高的,要把握時機在中間的位置搶。當參與人數超過15人時,手氣最佳的概率隨著搶的順序往往處于后面,這時的策略應該是盡量先搶。
搶紅包時通常必須緊盯屏幕,對出現的紅包圖標立即點擊,遲了就可能“手慢了”。這是手動搶紅包者的共同感覺。為了不漏掉紅包,有人開發了自動搶紅包工具“搶紅包神器”。所謂“搶紅包神器”,就是通過編寫自動搶紅包的應用程序,將其外掛在手機上,實現程序自動搶紅包。這種搶紅包行為屬于作弊,有違公平,但主觀上沒有危害網絡安全的企圖。目前已經有一些知名“搶紅包神器”。下面通過“搶紅包神器”的實現探究其防御方法。
自動搶紅包軟件的基本原理,是通過Android系統“輔助服務(accessibility service)”的一個接口,捕捉手機的通知欄變動事件、窗口切換事件、窗口內容變動事件,一旦在手機通知欄里實時檢測到紅包推送消息時便自動轉到微信頁面,搜索到紅包節點,模擬人工點擊操作。自動搶到紅包后,再搜索“拆”紅包節點,打開紅包,取出紅包金額。
Android Accessibility Service是Android系統提供的輔助功能,通過它可以獲取頁面的UI控件位置、內容等,并且模擬點擊,通過編碼實時監控UI變化,就可以實現針對某個控件自動點擊。微信紅包的UI結構,可通過DDMS工具Dump View Hierarchy For UI Automator分析。
一個完整的發現紅包、搶紅包、拆紅包流程需要數秒時間,而各種事件是以毫秒級的速度在不斷觸發,因此程序的核心問題是維護好一個全局的搶紅包狀態轉換,處理好各個事件處理任務的并發控制和相互協調,避免因狀態走錯而導致程序運行不穩定的情況。
自動搶紅包動作由2種場景觸發:發現一個微信紅包消息通知、在當前微信聊天頁面發現一個新紅包。2種場景的處理流程大體一致,搶紅包流程如圖7所示。

圖7 搶紅包app流程
如果不是在微信的可見界面范圍(在桌面或者在使用其他應用時),收到新的消息就會在通知欄提醒用戶。而在微信的消息列表界面,就不會彈出通知欄,所以可以區分這2種情況,然后抓取相關關鍵字做進一步處理。
圖7的幾個主要環節如下:
(1) 在非微信消息列表界面,收到通知消息的事件,判斷通知欄里的文本是否有[微信紅包]的關鍵字,有則可以判斷為用戶收到紅包的消息,然后就自動觸發這個消息的意圖事件;
(2) 在通知欄跳進微信界面后,是到com.tencent.mm.ui.LauncherUI這個 Activity 界面,在紅包的消息上,包括了關鍵字領取紅包或者View的id,就可以根據這個關鍵字找到相應的View,然后再觸發 ACTION_CLICK(點擊事件);
(3) 在點擊紅包后,會跳到拆紅包的 Activity:com.tencent.mm.plugin.luckymoney.ui.LuckyMoneyReceiveUI,找關鍵字或id拆紅包,然后觸發自動化點擊事件。
這樣就可以完成整個自動化搶紅包的流程了。所以,核心就是找關鍵字,然后模擬用戶點擊事件。
目前開發app一般是通過android studio[11-12]平臺。首先,在Android studio中新建一個空project,添加Main Activity和對應的layout文件,并實現簡單的界面和接口。然后new一個service繼承自Accessibility Service。接著在注冊文件中聲明Accessibility Service權限。
為簡化起見,本app只處理發現紅包、拆紅包等主要環節。圖8是搶紅包app運行時的截圖。在圖8中,最左圖是剛剛打開app時需要設置打開服務,也就是開啟監測操作和檢索窗口內容的功能;中間是收到紅包,自動跳轉到微信界面并點擊紅包(速度非常快,很難截到圖);最右圖是模擬點擊紅包成功,在分發的3份紅包中最先一個搶到。

圖8 app運行截圖
經測試,app能達到預期效果。需要說明的是,app可以快速搶紅包,但并不意味著能搶到大的紅包。相反,如果硬件配置很高,app響應速度快,快速搶到紅包的概率越大,但是越早搶到紅包,對應的紅包金額可能會相對較小。
(1) 干擾發現紅包信息。如3.1節,編寫搶紅包app時是通過[微信紅包]來進行是否有紅包的判斷,所以在發紅包之前,先行在微信發送文本[微信紅包]這樣的信息,可以導致部分外掛工具失效(即編寫的搶紅包app會暫時失效)。為了防御此種搶紅包方式,可以將[微信紅包]文本改為圖標方式,將ID改為動態ID(每次顯示都是隨機生成)。這樣通過文本內容找到控件的方法,或通過ID找尋控件的方法也就不可行了。
(2) 及時更新微信版本。識別窗體中節點的文字信息比較容易,但是識別圖片就困難得多。最新的微信版本的一種改進就把拆紅包界面原來的“拆紅包”字樣改成了“開”的圖片,這樣就增加了識別的難度,導致程序很難判斷,因而應及時更新微信版本。很多搶紅包app都因為微信版本更新而不再適用,微信運營也針對這種情況進行打擊防范。
(3) 監測搶紅包掛件。自動搶紅包主要核心點就是快速搶。因而防止這些插件的出發點也就是通過這個時間來判斷是否使用了插件。正常情況下搶一個紅包需要經歷多次屏幕點擊,對于平均網速和人的反應速度,完成一次搶紅包動作最快需要4~5 s左右。而app大概只要2~3 s左右,其速度明顯超出正常人的反應能力。因而可以編寫一個檢測程序,對紅包詳情界面的數據進行分析,通過提取紅包ID值以及時間戳,計算每份被搶的時間值,再算出對應的搶紅包的時間差。一般2 s內搶到的,應認為是搶紅包外掛所為。如果一個微信賬號多次以極快的速度搶到紅包,該用戶就有很大的幾率是使用了搶紅包的app,就可以對其進行舉報、警告等處理,嚴重者可對其進行封號或者封掉紅包功能。
實際上,在多次調試搶紅包app程序時,就收到微信團隊如圖9的警告信息。

圖9 微信團隊警告信息
可見,微信后臺有監控,管理者可以監測到手機端的搶紅包軟件,一旦發現疑似作弊就可以給予警告。
最后需要指出的是,雖然搶紅包app沒有危害網絡安全的主觀意圖,但開啟“輔助服務”后手機存在較大安全隱患。理論上啟動后,可以監聽用戶的任何操作,包括輸入的銀行卡密碼等。因此對于開啟輔助服務,一定要慎重。
以本文案例為例,以現實生活常見的“微信搶紅包”為案例切入點,項目背景具有趣味性、工程性、知識應用的綜合性和實現方法的多樣性的特點,比較容易激發學生的學習熱情,實驗參與度高,討論熱烈。教學中,多數學生采用Wireshark方法捕獲移動端數據,也有結合Fiddler進行分析。為取得樣本數據他們自發組群發紅包,然后綜合運用數學分析方法得出搶紅包規律。編寫拆紅包和搶紅包app是本案例一大難點,但學生運用在移動應用開發課程上學到的安卓開發知識,掌握了手機輔助功能的開發應用,最終完成了實驗,提升了綜合解決問題的能力。
目前教學中所使用的案例內容相對陳舊,滯后于技術發展,難以實現學以致用,影響學習效果。隨著技術的快速發展,許多技術已經應用到日常生活中,發掘這些技術并應用到教學中,很有必要且空間巨大。本文是一個運用統計分析技術和手機插件編寫技術的綜合案例。案例涉及知識綜合性高,案例分析與設計相結合,總體有一定難度,體驗度高、接地氣,在教學中取得顯著效果。