微信5.0 Android版飛機大戰破解無敵模式手記




微信5.0 Android版飛機大戰破解無敵模式手記


最近微信出了5.0,新增了遊戲中心,並內置了一個經典遊戲《飛機大戰》。遊戲其實很簡單,但因爲能夠和好友一塊兒競爭排名,一時間受到你們的追捧,小夥伴們進入「全民打飛機」時代。
 
ios 版出來不久就被破解出了無敵模式。Android版出後好像一直風平浪靜。週末無事,加之看雪zmworm版主邀請,因而花了一天的工夫研究了下。也出了個Android版的無敵模式加強版。具體來講就是無敵、雙排子彈加無限炸彈。固然,這個不是重點,咱們的重點固然是技術細節啦!
 
微信的遊戲繼承了Android版手機QQ遊戲中心的思想,也採用插件動態加載方式。具體來講,就是插件及遊戲以jar包形式存在,jar包中有classes.dex及其餘資源文件,在運行時動態加載資源及classes.dex代碼。這樣的好處是靈活管理,易於擴展。之後更多的遊戲只要上架到微信的服務器,用戶就能在微信應用內部下載、安裝、運行。具體原理能夠參考我2011年的一篇文章 《Android類動態加載技術》
 
固然,那篇文章講的只是基本原理,而微信在代碼動態加載方面則走得更遠。針對插件的管理及安全,它有一套完整的框架,並自稱爲sandbox。因爲代碼有作混淆,加之代碼量挺大,因此我僅算管中窺豹,看到的也只是冰山一角。與實際狀況有所出入,還請見諒!
 
1、微信遊戲插件的安全校驗
 
其實說實話,微信在遊戲插件的安全架構方面花了很多功夫。我能破解並非利用微信在安全方面的漏洞,而是Android系統自己的安全漏洞。這個漏洞也就是我前段時間發的覺得是bluebox上報google的漏洞,後來被證明不是。詳情請看 《Bluebox Security最新提報Android漏洞的初步探討》
 
那微信是如何對遊戲插件進行加載及安全校驗的呢?
 
飛機大戰的遊戲插件以jar包的形式,放在微信apk的assets/preload文件夾下:

   
jar包中包括classex.dex、so本地庫及drawable圖片資源或者還有xml資源。微信處理插件加載的代碼在com.tencent.mm.compatible.loader包中。加載插件資源的類叫作PluginResourceLoader,它是android.content.res.Resources的子類。
 
而最核心的加載類應該是PluginClassLoader。上面說的PluginResourceLoader也是它的成員變量。它彷佛負責整個插件加載的各個環節調度。
 
Android動態加載類有一個弊端,就是dex文件必須釋放爲本地文件。這是dalvik虛擬機機制決定的。一直覺得google或者dalvik會改,不過彷佛到如今還沒見改進。釋放到本地緩存的dex是很容易受到攻擊的,不過微信在這些細節上處理得還挺好,沒有明顯漏洞。這個後面再說。
 
PluginClassLoader會在微信安裝後第一次啓動時,掃描插件的狀況,並將插件拷貝到本身應用data下面的app_dex文件夾下。接下來會對插件進行處理。將so庫釋放到app_lib文件夾下,將jar包中的classes.dex重命名釋放到app_cache文件夾下。
 
在拷貝插件jar包的過程當中,會對插件進行第一次校驗——簽名校驗。關於簽名校驗的原理,能夠參看我2011年的另外一篇文章 《Android APK 簽名比對》 。微信的簽名校驗就是微信APK的簽名須要和插件jar包的簽名一致。這裏我考慮過用bluebox上報的ANDROID-8219321漏洞繞過插件jar包的簽名檢測。通過一段時間的研究發現了它還有第二次校驗。。。
 
因爲是在拷貝以前進行簽名校驗,因此我考慮過拷貝完成後,直接替換app_dex和app_lib下的文件的方法。發現均不可行。繼續分析發現了第二次校驗——MD5校驗。一開始看到jar包命名就很疑惑,文件名後面一串數字是幹嗎的。想過是MD5碼,沒作驗證。直到碰壁以後,才發現了這裏的奧祕。後面這一串數字就是jar包的MD5值。插件加載的時候會去解析這個MD5值,並存起來。在加載運行的時候會對這個MD5值進行校驗,若是緩存中的文件MD5值不一樣,會用從新釋放apk中的插件覆蓋。緩存中的dex應該也有相似的機制。這部分代碼分析得不是很透徹,大概原理如此,有感興趣的朋友能夠繼續深刻。
 
MD5值做文件名+簽名校驗,覺得着利用ANDROID-8219321漏洞的企圖落空了。由於ANDROID-8219321漏洞的前提是apk中文件的文件名須要保持不變,這樣才能經過重名文件繞過簽名校驗。然而只要咱們改了插件jar包,MD5值就必須得變,從而致使文件名改變。所以此路不通了。(也許能夠經過修改MD5校驗和簽名校驗的smali繞過校驗,無奈我暫時沒找到具體MD5校驗的代碼,只能做罷)。
 
MD5值做文件名+插件簽名校驗,再加上安裝APK自己的簽名校驗。三重校驗保證了微信遊戲的安全性。
 
所以我只能採用 《Bluebox Security最新提報Android漏洞的初步探討》 一文中所述的安全漏洞。此漏洞針對system/app和vendor/app下的apk只會校驗manifest.xml文件簽名。所以我能夠任意修改插件jar包,在從新生成新包以後計算出新包的MD5值,並對新包進行重命名。對於插件的簽名校驗,則直接經過修改smali代碼,屏蔽掉微信簽名校驗的函數功能,直接返回true:


這就是咱們修改插件以後得以正常運行的理論基礎及可行性保證。有了上面的理論,咱們就能夠開始修改遊戲了!
 
 
2、飛機大戰遊戲破解
 
飛機大戰這個遊戲聽說是騰訊一個程序員一週時間開發完成的做品。其實考慮到這個遊戲的規模,除GUI和交互設計外,程序員一週時間應該也差很少了。沒有太大出入。
 
此遊戲採用的遊戲引擎是libgdx。相信作過Android遊戲的朋友對此款引擎不會陌生。若是在Android平臺開源遊戲引擎裏,cocos2d當仁不讓地排第一的話,那麼libgdx也能夠當仁不讓地排第二了。cocos2d主要採用C++開發,而libgdx則主要採用java方式開發。學習成本低,開發週期短,是它的優點。固然它也是跨多平臺的遊戲引擎,運行效率方面稍有欠缺但也不錯。所以廣大的Android單機小遊戲都是採用libgdx做爲遊戲引擎。
 
微信飛機大戰的代碼量不大,有興趣的朋友能夠研究下,移植成爲一款獨立的單機遊戲應該也不難。下面我詳細介紹下飛機大戰遊戲破解的技術細節。
 
第一步就是將飛機大戰遊戲的插件包從apk中釋放出來。咱們能夠採用反編譯APK的方式反編譯這個插件包。修改smali代碼以後,再打包回jar包文件。若是還有朋友對APK破解流程不熟悉的話,能夠參考我之前的一篇文章 《APK Crack》 。這裏咱們主要介紹遊戲的架構及破解思路。
 
解壓以後,smali部分其實能夠分爲兩個包:com.badlogic.gdx和com.tencent.mm.plugin.shoot。前面一個是libgdx導入的jar包,這個不是咱們關心的內容。咱們的重點就在com.tencent.mm.plugin.shoot這個包中。
 
遊戲主要有兩個Activity:ShootMainUI和ShootFlashUI。它們都繼承自com.badlogic.gdx.backends.android.AndroidApplication,這個類事實上繼承自Android系統的Activity。它們一個是主加載界面,一個是咱們停留時間最長的遊戲界面。固然須要瞭解,但都不是重點,重點是咱們遊戲中的各類角色:
 

這些角色構成了整個遊戲的演員,他們都繼承自同一個類:GameSprite。至關於遊戲引擎中精靈的概念。它們都有生命值、寬高、速度、類型、狀態等屬性。這些類的定義都在actor子包內。在遊戲過程當中會對每一個精靈作碰撞檢測,當你發現你的飛機爆炸時,就是碰撞檢測在起做用。順便說一下,libgdx引擎採用的物理引擎是C++版的box2d,性能很是不錯。
 
好了,咱們具體的破解特性,我會以任務的形式一個一個娓娓道來。下面咱們接到的第一個任務就是「永久雙子彈」!
 
任務一、永久雙子彈!
 
在玩飛機大戰時,雙子彈意味着更大的威力。能夠消滅更多的敵機,化險爲夷。然而在實際遊戲中咱們只有吃到PROPS_DOUBLE以後才能擁有一段有限時間的雙子彈狀態。
 
雙子彈屬性屬於HERO的,對應的類是Player和PlayerActor。Player繼承自GameSprite,而PlayerActor則是libgdx中的actor類的概念。兩個前者注重狀態和屬性,後者注重邏輯和動做。
 
Player在構造函數初始化時就會設置子彈類型:

 
咱們只須要把BulletType從NORMAL改成DOUBLE就能夠了。
 
PlayerActor會對子彈類型進行定時地檢測,檢測是會將雙子彈還原爲單子彈。應該是爲了處理吃到PROPS_DOUBLE後,一段時間子彈還原的問題。因此咱們一併改掉:

 
OK,雙子彈破解任務完成!
 
 
任務二、炸彈無限!
 
炸彈是個好東西,威力無窮。關鍵時候全靠它清屏,消滅全部敵機!並且它仍是刷分利器。固然,只有在它變爲無限的時候,咱們才能用它來刷分。
 
這裏我試圖修改Player的getBombNumber和setBombNumber方法,發現均不行。後來轉變思路,只要在使用炸彈後炸彈數量不減小,就能實現無限炸彈的功能。通過代碼追蹤,最後定位到一處混淆代碼處。將-0x1改成了0x0。

 
修改的結果,在吃到兩個炸彈後使用炸彈不會減小炸彈數量。吃一個炸彈時,使用炸彈後炸彈按鈕消失,所以沒法作到無限。請記住必定要存到兩個炸彈以後才能無限炸彈。無限炸彈破解任務完成!
 
 
任務三、開啓無敵模式!
 
長生不死一直是咱們人類的終極夢想,在遊戲中也不例外。iphone版微信也是由於有了飛機大戰無敵模式而被各大新聞站點競相轉載。讓咱們Android版也無敵一下吧~
 
前面提到了GameSprite是全部角色的父類,在遊戲用物理引擎作碰撞檢測後,會調用GameSprite類的hit方法。hit方法中將GameSprite的liftCount減一,若是減到0則將狀態設置爲DEAD。
 
GameSprite的狀態有以下一些:
 
DEAD
EXPLODING
FLIGTHING
HITING
INVINCIBLE
 
在飛機正常的死亡過程當中,是先HITING,再EXPLODING,再DEAD。FLIGTHING我不清楚幹嗎的,INVINCIBLE應該是無敵模式。可是在個人破解裏,並無使用這個模式,而是強制在碰撞檢測結果中,把它列在了生死薄以外。至於INVINCIBLE的方式,你們能夠試試能不能很好的維護這個狀態。
 
具體來講就是hit方法無論GameSprite是hero也好,enemy也罷,均一視同仁,生命值減一,或者死掉。然而咱們能夠經過修改smali代碼,將hero列在生死薄以外:

 
其中goto_1標籤跳轉到return-void。這樣咱們的hero將永遠不會被hit,所以也就無敵啦!
 
 
任務四、獨孤求敗。。。
 
本覺得完成任務3就大功告成了,誰知咱們缺遇到了無敵的尷尬——死不了。。。死不了,意味着永遠沒法結束遊戲,永遠不會有機會上傳本身的得分進入排行榜。哎,如今終於明白爲何獨孤求敗了。。。
 
基於此,咱們得想個辦法觸發飛機非天然死亡。想來想去,我仍是以爲讓飛機本身決定本身的生死最合理。具體就是當飛機飛到屏幕最上方時觸發死亡。由於通常狀況,咱們不會把飛機飛到屏幕最上方,因此誤操做機率極低。
 
經過前面咱們知道hero飛機的類就是Player。而Player中有一個函數更新飛機的座標位置:updatePosition。因此咱們能夠在這個函數中進行咱們想要的操做:

 
其中0x64就是我指定的y座標下限100。當飛機座標y在100之內時,我會把飛機的LiftCount設置爲0,而後再將狀態設置爲EXPLODING。飛機就會爆炸死亡了~
OK,任務完成,打完收工!
 
 
3、一些掃尾工做
 
 插件包修改完成後,咱們經過apktool,將其打包回jar包。res資源包須要手動添加會jar包中。而後按照第一節所說的,生成jar報的MD5碼,重命名jar包。
 微信APK也須要按第一節的方法,將插件的簽名校驗屏蔽掉。編譯出classes.dex,替換微信原始包中的classes.dex。
再將APK包中的飛機大戰插件換爲咱們編譯出來重命名的這個jar包。
 
OK,APK準備好了。
 
因爲我利用的是 《Bluebox Security最新提報Android漏洞的初步探討》 一文中所述的安全漏洞,因此安裝此APK的過程並非菜鳥能玩的。。。簡單來講,你須要root權限,並能將system分區mount爲可寫。
 
而後卸載你本來的微信。將這個apk放到/system/app/文件夾下。稍等片刻,你就是打飛機的高手了!
 
如需技術交流,請與我聯繫。新浪微博: @囧虎張建偉
附排行榜:



      
注:遊戲做弊有必定的封號風險,請你們慎重使用。本帖只做技術交流,不用於其餘任何商業目的。
 

--------------------------------------------------------------

補充說明(2013.8.15):
     
有朋友反饋,按照我文中的步驟一步步下來,生成apk push到system/app下,程序沒法正常運行起來。強制退出。
請查看log,是否有相似以下錯誤:
   
Caused by: java.lang.UnsatisfiedLinkError: Couldn't load CrashMonitorForJni: findLibrary returned null ..... 
at com.tencent.mm.sdk.platformtools.CrashMonitorForJni.init(SourceFile:26) 
at com.tencent.mm.sdk.platformtools.aq.<clinit>(SourceFile:62)
   
致使這類錯誤的緣由是有些手機將apk push到system/app下後,安裝過程不會釋放拷貝so庫。
你須要手動將微信lib下對應你手機平臺的so庫拷貝到/data/data/com.tencent.mm/lib對應的文件夾下。
因爲個人手機沒這個問題,因此以前沒有發現。特在此作補充說明。

----------------------------------------------------------------

補充說明2暨可安裝版APK發佈(2013.8.18):

本文發出後,獲得廣大網友的熱烈響應。一些網友因本文對軟件安全產生了極大興趣。

許多朋友按照文中的方法破解成功,而也有很多朋友還有一些關鍵點沒有突破。很高興看到你們在論壇、微博、 博客和郵件中與我交流,我也儘可能答覆你們技術相關的問題。但仍有很多朋友的問題沒來得及答覆,在此向大家表示歉意!

在你們的提問中,不少朋友但願我能直接提供APK,以供深刻研究。以前因爲安裝步驟過於繁瑣,因此一直沒有發佈APK。

好消息是在網友的不斷提問和更多的信息提供以後,我發現最新的微信版本彷佛將我文中說起的安全校驗機制關閉掉了。所以,咱們能夠採用重簽名的方法獲得能夠直接安裝的APK。值得注意的是:一、插件jar包和APK包都須要簽名,且簽名一致;二、MD5校驗彷佛也失效,不用重命名插件包。

(我確信這在我以前破解的版本是不行的,嚴重懷疑微信是否是把內部debug的版本給放出來了。。。)


APK下載地址: 點擊下載 
    
再次聲明:本破解版遊戲僅用做技術交流,嚴禁用於任何商業目的!違者後果自負!     
相關文章
相關標籤/搜索