【遊戲漏洞】頁遊逆向—摩爾莊園封包解密

2021-02-14 遊戲安全實驗室
前言

摩爾莊園這個遊戲想必很多人都聽過,這是一款兒童網頁遊戲,我從初中就開始玩了,通過這個遊戲我也結識了不少朋友,給我留下了難以忘懷的美好記憶。

當時這個遊戲非常火熱,經常是幾十個伺服器爆滿的狀態。

我記得當時我每天都會打開摩爾莊園看看摩爾時報,喂喂拉姆,種種地,釣釣魚,完成日常任務。

但後來同類型的遊戲(如洛克王國、奧比島、奧拉星等)層出不窮,英雄聯盟這類大型遊戲又火熱起來,或許是因為這些,摩爾莊園的玩家逐漸減少。

終於,摩爾莊園停止了更新,摩爾時報停在了2015年2月6日,標題是回憶莊園。

現在,摩爾莊園的伺服器從最多時候的一千多個變成了30個(實際上只有一個伺服器,IP是123.206.131.236)且非常不穩定。

我想衝個超拉祭奠一下我的回憶,可誰知充值的網頁都打不開了。

再這樣下去的話估計離關閉伺服器不遠了,於是我寫下這篇文章,算是和摩爾莊園做一個告別儀式,同時也希望相關遊戲研發人員看到能做出相應改進。


 

關於網頁遊戲

網頁遊戲一般值無需下載,打開網頁就能玩的遊戲。

網頁遊戲的作弊一般都是模擬操作或者分析封包協議模擬封包的,因為代碼是在虛擬機中運行的,內存修改很難找到基址。

目前的網頁遊戲的框架一般是Flash,也有Unity3D的,由於Unity3D需要安裝客戶端或者插件,所以佔極少數,也有個別網頁遊戲是HTML5代碼寫的,這種暫不討論。

摩爾莊園則是一款Flash遊戲,網頁屬於客戶端,與伺服器通信就會產生封包,我們只需要構建出封包數據,就可以實現遊戲內的所有動作,通過修改封包數據,還可以實現很多客戶端本身沒有的功能(如刷金幣刷道具等)。

因此網頁遊戲為了安全都會將封包加密再發送,而又為了減輕伺服器的負擔,封包的加密不會很複雜,且封包的加密算法一般都可在本地緩存的swf文件中找到。

目前有許多Flash加密技術,如Alchemy、DoSwf等,但Flash類似Java,是一種跨平臺,解釋型語言,AS代碼被編譯成字節碼代碼運行在AS的虛擬機中,所以代碼最終都會被解密。而且加密Flash的成本很高,這為攻擊者帶來可乘之機。


關於摩爾莊園封包加密

據我所知封包加密算法更新過三次(內部小更新忽略不計)。

從最初的沒有驗證,可以隨意發送封包不掉線,到後來加入了封包序列段,從00遞增到FF循環,如果封包序列不符合則斷開連接。

再後來序列段的遞增改為加密算法,序列段的值和包體及上一個封包的序列號有關。

最後,有序列段驗證的同時加密了包體(封包尾部)。


 

加密算法尋找過程

遊戲有很多子類和模塊,我們需要找到發送封包的函數,Flash中發送封包一般都是通過重寫Socket類進行的,所以我們可以搜索這個類名(flash.net.Socket)找到最底層的封包發送類,然後通過調用關係找到封包加密的算法。

幾種思路:

1.提取緩存目錄中的swf文件反編譯分析。

2.通過截包得到的swf文件反編譯分析。

3.由於緩存中的swf很多是加密過的,我們可以在一個進程裡打開遊戲的網頁,內存中搜索swf文件頭,提取swf文件並全部保存到同一個目錄中,然後批量反編譯成as代碼,在文件夾搜索關鍵字socket,定位到swf文件中分析。

 

 

經過分析找到發送封包代碼所在文件:TaomeeCoreDLL.SWF

 

同時找到幾個關鍵基本類:

com.core.socketlogic.baseSocket.BaseSocket

com.mole.net.SocketImpl

 

接著我們搜索哪裡實現了這個類的功能

找到了:

com.core.socketlogic.baseSocket.MoleSocket

 

分析重載的send方法:

這個方法就是用來發送封包的,我們先來看看封包是什麼樣子:

我們可以在遊戲中執行相同動作,然後通過通過封包工具查看封包:

 

這個封包是多次喊話數字1的封包十六進位文本(打碼部分是帳號的十六進位),我們可以看出只有第5位(這裡我們以一個字節一位)在變化,其他部分都一樣。

由此可以斷定這一位就是封包驗證段,也就是序列號。

 

我們可以從代碼中分析封包的結構:

public static const HEAD_LEN:uint = 17;

 override public function send(param1:uint, param2:Array, param3:String = null) : void

      {

         var _loc4_:ByteArray = null;

         var _loc5_:uint = 0;

         if(connected)

         {

            _loc4_ = this.createBody(param2,param3);

            _loc5_ = HEAD_LEN + _loc4_.length;

            this._seq = this.versionEvent(param1,_loc5_,this._seq,_loc4_);

            _loc4_ = this.encryptBody(_loc4_,param3);

            _loc5_ = HEAD_LEN + _loc4_.length;

            writeUnsignedInt(_loc5_);

            MsgHead.Version = this._seq;

            writeByte(MsgHead.Version);

            writeUnsignedInt(MsgHead.Command);

            writeUnsignedInt(MsgHead.UserID);

            writeUnsignedInt(MsgHead.Result);

            writeBytes(_loc4_,0,_loc4_.length);

            flush();

            this.parselogger(LoggerType.OUTPUT,param1,_loc4_.length);

         }

      }

 

 

封包一位前面是 17加上 包體長度,那麼可以推測出包頭的長度就是17

然後是MsgHead.Version(這個來自函數versionEvent返回值,後面分析)接著是

MsgHead.Command,推測是封包的命令標識,相同的動作這個是一樣的,接著是MsgHead.UserID,這個也就是米米號,再接著是Result(返回碼),最後是包體_loc4_,是createBody的返回值。

我們重點需要分析的是MsgHead.Version和包體的生成,因為其他的都是固定的值。

從代碼中可以看到MsgHead.Version的值來自this._seq,也就是上面調用的this.versionEvent(param1,_loc5_,this._seq,_loc4_);的返回值。

我們分析下versionEvent這個函數:

是一個簡單的加密算法,後面還調用了getCrc

也是一個簡單的算法,我們可以直接轉換成相應的語言調用。

轉換成易語言代碼如圖:

知道這個後,剩下的就是包體的加密了:

  _loc4_ = this.encryptBody(_loc4_,param3);

調用了encryptBody方法,這個方法調用了MessageEncrypt.encrypt

我們找這個方法的定義:

如圖,調用了com.fcc中的方法:

我們定位到該方法:

發現這個旁邊還有個MDecrypt,但是代碼應該是混淆處理過,還有一些亂七八糟的東西,非常亂,基本無法還原。

但是我們需要構建封包就必須解密封包體,然後再調用上面分析的序列號計算方法,再加密封包發送。

既然無法還原代碼,那我們是否能調用這個方法呢?我之前學過一點Flash,知道通過Loader類可以實現獲取其他swf中的類,然後調用。

於是設想使用Loader加載這個類,然後通過ExternalInterface,也就是和JS通訊的Callback方式傳遞參數和返回值。

接下來就開始實踐了。


 

實踐Loader

Flash Builder新建一個as3項目,然後新建asstest文件夾,把這個函數所在的swf放進去:

 

使用Embed引入swf文件,然後寫一個函數調用返回ByteArray:

定義變量:

實現Loader:

Loader加載完畢事件中,用getDefinition獲取類定義,並添加callback。

getClass方法:

其中output是我加的編輯框,用於顯示輸出文字,方便調試。

 

最後導出:

 

測試:

測試使用Flash對象加載這個swf,執行腳本的CallFunction函數調用我們添加的callback方法。

測試解密方法:

測試加密方法:

都得出正常結果。

 

至此我們成功攻破了摩爾莊園的封包加密,之後便可以隨心所欲地發送和修改封包了。

 


 

 

結語

通過我們的分析得知摩爾莊園的封包加密目前來說還是有難度的,但部分關鍵算法和發送封包的方法都沒有進行混淆和加密,類名和變量的命名都一覽無餘,甚至開發調試用的Log和Trace都沒有清除,這為逆向分析者提供了極大的便利。

謹以此文,祭奠我在摩爾莊園裡度過的快樂童年。

 

聲明

本篇內容僅供研究學習,禁止用於非法和商業用途,由此帶來的一切後果自行承擔,與本文作者無關。

來源:specher-郵件投稿

*轉載請註明來自遊戲安全實驗室(GSLAB.QQ.COM)

近期精品文章:

【遊戲漏洞】CSGO人物結構分析

【遊戲漏洞】《幻想神域》線程發包分析

【外掛分析】CSGO公眾作弊ezfrags外掛分析

【遊戲漏洞】《魔力寶貝》步步遇敵分析

投稿文章:gslab@tengcent.com


相關焦點

  • 《摩爾莊園》遊戲回歸,已上架蘋果 App Store 預約:卡通頁遊變全面...
    12 月 16 日消息 據蘋果 App Store 商店信息,《摩爾莊園》推出了移動版。相比於原來的卡通頁遊,新的《摩爾莊園》全面 3D 化,角色與場景擁有了立體的精緻模樣。2008 年上線的網頁遊戲《摩爾莊園》,曾經是很多人心底的珍貴記憶。這款遊戲少有戰鬥對抗,反而以 「健康、快樂、創造、分享」為主題,讓玩家悠閒生活,在分工協作中獲得快樂。
  • 《摩爾莊園》回歸上架蘋果商店 卡通頁遊3D化更精美
    近日據蘋果商店信息,《摩爾莊園》推出了移動版。相比於原來的卡通頁遊,新的《摩爾莊園》全面3D化,角色與場景擁有了立體的精緻模樣。 2008年上線的網頁遊戲《摩爾莊園》,曾經是很多人心底的珍貴記憶。這款遊戲少有戰鬥對抗,反而以 「健康、快樂、創造、分享」為主題,讓玩家悠閒生活,在分工協作中獲得快樂。
  • 摩爾莊園,好久不見
    摩爾莊園是什麼?對很多人來說,它可能是自己接觸的第一款遊戲,是現在想起來依然美好的回憶……因為長大或者其他原因,你選擇了離開摩爾莊園,沒關係,我們回來找你了。雖然《摩爾莊園》和《功夫派》的伺服器和遊戲團隊早已支離破碎,但從遺蹟中仍能嗅到童年熟悉的氣息。然而,對《賽爾號》和《小花仙》這些仍在運行的遊戲而言,崩解的卻是淘米遊戲的內核,驅使人們匆匆逃離。《摩爾莊園》停止更新的時間正是手遊產業開始爆發的節點,傳統頁遊無法再俘獲6-14歲的年齡群體。
  • 摩爾莊園的公主叫什麼名字?
    《摩爾莊園》頁遊變手遊,是許多人的回憶。
  • 《摩爾莊園》手遊公測延期公告
    在籌備遊戲公測的過程中,我們遇到了一個突發底層代碼問題, 導致遊戲卡頓、bug、閃退等問題頻發,在共研服測試的小摩爾們都遇到了上述問題,目前我們已經定位到了這一問題,但仍需要花費較多時間解決。  同時這個突發問題的出現打亂了我們春節前上線的籌備計劃,所以原定於春節前上線的不得不延期,具體上線時間待定。
  • 回到摩爾莊園
    跨進門,聯上微博,就邁進了屬於他的另外一重身份——摩爾莊園超話主持人。 《摩爾莊園》是星夜接觸的第一款網路遊戲。在遊戲中,玩家扮演一隻滾圓可愛的小鼴鼠,在一個名叫「摩爾莊園」的虛擬世界裡探索與遊戲。遊戲面向6~14歲兒童,具有很強的社交屬性,在2008年5月上線後迅速席捲網絡,被稱為「兒童版『開心網』」與「全國最大的兒童虛擬社區」。
  • 歡迎回到摩爾莊園,這裡有一份你的專屬回歸攻略
    A:淘米為摩爾莊園的老玩家定製了一個找回米米號密碼的地方,大家如果有忘記密碼的可以在這個頁面嘗試下哦!聽說找回機率大大提高了(網站地址請點擊文章末尾「閱讀原文」)Q:找回了自己的帳號後,在2020年的摩爾莊園頁遊裡,我還有什麼可以玩的地方?
  • 摩爾莊園手機版下載_摩爾莊園官方手遊下載-太平洋下載中心
    摩爾莊園手遊是一款承載了許多人的童年和夢想的遊戲,是一個集懷舊、益智、養成、社交和劇情為一體的休閒社區。摩爾莊園手機版在保留頁遊經典的同時又加入了全新的社交元素,摩爾莊園手機版將繼承"摩爾莊園"的品牌優點,延續生動的角色和豐富精彩的故事情節,全新的3D形式更立體地在玩家面前呈現那些熟悉、美好的場景,讓小摩爾更真實的享受悠閒的莊園生活。在摩爾莊園手遊裡你可以和麼麼聊天、和瑞琪一起戰鬥、和艾爾警官一起解謎。
  • 《奧拉星》《摩爾莊園》手遊都要出了,你小學時玩過嗎?
    最近《奧拉星》和《摩爾莊園》都放出了手遊版的預約消息。曾經兩款風靡全國小學生的頁遊在將近10年後都紛紛回到了玩家身邊。
  • 《摩爾莊園手遊》正在消耗老玩家的情懷?
    》開服,抱著情懷順帶在摩爾莊園裡偷偷懶的想法,她開始在遊戲裡設計起了「建築」。以前玩頁遊時,她會覺得NPC就是一群小鼴鼠,但在劇情的加持下,他們個性突出,變得更有意思了。 玩家在微博、豆瓣上研究起與劇情相關的NPC關係,磕起了怪盜RK與騎士瑞琪的CP,對遊戲中NPC產生了奇妙的情感,「饞瑞琪的身子」等大膽的表白頻頻出現在摩爾莊園豆瓣小組的帖子裡。阿年表示自己是老乙女遊戲愛好者,現在看到好看的紙片人就會饞人家身子。
  • 摩爾莊園手遊NPC摩爾大全 有哪些NPC摩爾
    標籤: 黑森林 大家好,摩爾莊園手遊NPC有哪些人物?摩爾莊園NPC人物都認識嗎?摩爾莊園NPC人物長什麼樣子?摩爾莊園NPC人物有哪些特點?這些小摩爾們都清楚嗎?呵呵~今天就讓小編介紹幾個重要的NPC們,一起來看看吧。
  • 連續3天上熱搜、刷屏朋友圈,摩爾莊園怎麼就火了?
    北京人民最愛在莊園打工簡單來說,摩爾莊園的遊戲類型和《動物森友會》《星露谷物語》相似,江湖人稱「種田養老遊戲」。玩家進遊戲的第一課,就是0基礎種南瓜。從第一分鐘開始,摩爾莊園就要激發出中國人基因裡對種地的熱愛。從微博熱議度來看,摩爾莊園的熱度是從5月30日開始攀升的。
  • 毀童年系列:《摩爾莊園手遊》明日上線開測晚節不保?
    說起《摩爾莊園》、《洛克王國》、《賽爾號》、《小花仙》等遊戲,絕對是很多小夥伴的童年。但是這次是真的「爺青回」啦,《摩爾》在明天正式開啟線上內測。還記得這款遊戲的口號就是「摩爾莊園,快樂童年」,這款遊戲也的確是很多和小鸚一樣95後、00後的記憶。其實提起《摩爾莊園》,不止小鸚,很多人都是有點恨鐵不成鋼的。
  • 回到摩爾莊園丨觸樂
    跨進門,聯上微博,就邁進了屬於他的另外一重身份——摩爾莊園超話主持人。《摩爾莊園》是星夜接觸的第一款網路遊戲。在遊戲中,玩家扮演一隻滾圓可愛的小鼴鼠,在一個名叫「摩爾莊園」的虛擬世界裡探索與遊戲。遊戲面向6~14歲兒童,具有很強的社交屬性,在2008年5月上線後迅速席捲網絡,被稱為「兒童版『開心網』」與「全國最大的兒童虛擬社區」。
  • 摩爾莊園是這屆年輕人的動森
    這《 摩爾莊園 》是用 Flash 開發的,不僅不需要什麼配置,有網就能玩,而且也不用充錢,你只需要註冊個帳號,就能成為一個摩爾,擁有自己的角色。畢竟,遊戲的終極目的都是為了賺錢,但是對大多數熱愛《 摩爾莊園 》的孩子們來說,他們不僅沒啥消費能力,更沒有充錢的動機,快樂就完事了。
  • 除了摩爾莊園,還有哪些童年遊戲正在離我們遠去
    現在提起這款叫做摩爾莊園的網頁遊戲,也許很多人都會感到陌生,但是對於隨著網際網路飛速發展成長起來的一代人來說,它卻是珍藏在腦海中的一段集體記憶。這是此前很多4399或是 7k7k 上的單機小遊戲所無法做到的,這也是為什麼摩爾莊園下線的消息一出,就引起了眾多老玩家的懷念潮——雖然遊戲大家很早就不玩了,可是情懷還在啊。
  • 濃濃中國風 《摩爾莊園》手遊精美小屋視頻曝光(未入庫遊戲)
    自從2008年《摩爾莊園》開園以來,休閒輕鬆的佛系莊園生活便吸引了無數小摩爾入駐,種菜養花,釣魚滑雪,生活樂無邊,除了這些以外,裝修自己的專屬小屋,也是小摩爾們樂此不疲的事情,為此甚至毫不吝惜自己辛辛苦苦積攢的摩爾豆。
  • 經典遊戲中那些風靡一時的Q版遊戲,你還記得當年的摩爾莊園嗎?
    遊戲作為人們日常生活不可或缺的一部分,其種類也是相當豐富。而Q版遊戲身為其中的一員,因其有著萌到爆炸的人物形象和輕鬆的遊戲風格,一直大受歡迎。提到Q版遊戲,相信很多玩家第一時間就會想到《摩爾莊園》。當然你也可以任意變更摩爾的皮膚顏色,隨心所欲搭配你認為的最好看的摩爾。該作品以現實生活中的城市為背景,打造了一個夢幻、美好的虛擬世界,各種職業也是應有盡有,但玩家在加入職業前也需要完全相關的任務。所獲得的摩爾豆可以用來購買各種千奇百怪的服裝和道具,打造屬於你自己的風格。不過很可惜的是,《摩爾莊園》如今已正式停服,獨留一份回憶給眾玩家。
  • 《摩爾莊園》手遊年度內容曝光,你還記得自己的米米號嗎?
    2008年, 《摩爾莊園》頁遊正式上線,在那個充滿快樂和溫馨的莊園裡,我們留下了許多快樂、溫暖的回憶。你還記得永遠盡職守則的瑞琪隊長、優雅大方的麼麼公主、搗蛋鬼RK、菩提大伯還有拉姆們嗎?走過十二年,《摩爾莊園》已經推出3部動畫片和3部大電影,成為國內最經典的動漫品牌之一。
  • Galgame漢化中的逆向 (一):文本加密(壓縮)與解密
    這個遊戲還是很典型的,cpk 封包,文本應該在 sn.bin 裡面。打開一看沒有明顯的字符,而且數據看起來很緊湊,應該是壓縮或者加密了。找文本很簡單,等遊戲運行起來後直接暫停,搜索內存 sjis 字符串。比如說「椿子」。然後記住這個地址(或附近的某個),下硬斷點 write,重新啟動遊戲運行,遊戲中斷在這裡。