天天看點

聽鬼哥說虐心的2048簡化過程

從開發轉到逆向破解,開始準備寫部落格後,朋友們說,想看一些好玩的遊戲分析過程,簡單一點,最好是會開發的人員能完成的,那麼本篇就不講反編譯追蹤代碼實作方式了,寫給一些開發者朋友來對自己喜歡的小軟體進行破解。

在flappybird火了一陣子之後,又出來一些小遊戲,使得部分人愛不釋手,欲罷不能,在遊戲出來以後,我也玩了好長一段時間了,看着空間裡面整天有人曬着自己的得分,那麼咱們就一起來看一下,如何實作刷分的過程。

0x01:簡單試玩一下,體驗遊戲樂趣

我們試玩的圖,簡單記錄一下相關資料。

聽鬼哥說虐心的2048簡化過程

界面清新,操作簡單,是我們休閑娛樂的消遣品,那麼我們就開始分析一下分數上面的控制了。

0x02:遊戲分數的相關設定

通過我們試玩了一下,了解到遊戲分數是根據玩的時候的數字相加得到。例如最初隻有兩個方塊數值為2,那麼這兩個方塊合成一個方塊後數值為4,那麼目前的得分也就是4,是以我們明白這個之後,就可以想一下是不是可以通過将初始化的數值變大一點,那麼相加後分數自然後變大了,分數不就更高了嘛。

通過玩了幾次遊戲以後,我們可以發現,在遊戲未失敗情況下推出遊戲,再次打開會還原到上次玩的遊戲進度,是以了解到這一點很重要,因為我們這樣就可以推測出遊戲是通過資料儲存來恢複上次遊戲進度的,那麼我們就開始繼續分析了。

資料存儲方面,我們首先是觀看目前包名下的,data/data/com.aa

,類似這樣的,用到這裡就是data/data/com.estoty.game2048。那麼我們在shell下進入檢視一下:

聽鬼哥說虐心的2048簡化過程

可以到到files檔案夾,對開發者朋友來說,那麼很容易了解這個檔案夾所代表的含義。我們在程式中如果往本地存儲一些檔案,一般都會存儲到這裡的。如:

FileOutputStream fop=null;

fop = c.openFileOutput("love", Context.MODE_PRIVATE);

這樣就是簡單的在本地files目錄下建立一個名稱為love的空檔案了。

好了,言歸正傳,我們就切換到files下檢視一下相關内容:

聽鬼哥說虐心的2048簡化過程

看到這個圖,發現檔案下面還是有很多内容的啊,那麼具體是哪一個呢?本文暫時不講反編譯從代碼中找如何儲存,那麼我們就全部拿出來。

使用cat指令來複制吧,如果手機安裝了busybox的話,試試copy是不是更友善。如:

cat saveOriginal.plist>/sdcard/l.plist    将檔案建立在sd卡上

然後直接從sd卡pull出來,或者用第三方工具如應用寶之類拿出來即可。

通過檢視所有檔案,我們發現了目标:

聽鬼哥說虐心的2048簡化過程

通過這個圖,我們可以發現這是簡單的xml檔案方式來儲存資料。

一個個鍵值對形式的,還是比較容易讀懂的。

上下文浏覽一下這個檔案,可以推測出紅色标注的key為遊戲中每個方塊中代表的數值,而array為這16個方塊數值放到的一個數組。

我們對照試玩的圖來看一下,遊戲前兩行:

聽鬼哥說虐心的2048簡化過程

第一個資料存在,為4,對應:

聽鬼哥說虐心的2048簡化過程

推測:第一個string為位置,第二個string為方塊的數值,即2的次方。

驗證:我們拿第一行第三條資料來驗證:

數值為2

聽鬼哥說虐心的2048簡化過程

我們可以看到我們的猜測好像是正确的。

但是我們要保持嚴謹,繼續驗算,将後面的資料都驗算一遍。

最終發現我們的推測是正确的,那麼也就證明這個檔案,是存儲資料的核心檔案。

下一步,我們就讨論如何來進行操作。

0x03:準備動手操作

通過前兩步的分析,我們已經漸漸有了眉目。

我們需要做的,就是把這個檔案進行修改,然後重新替換到那個檔案夾下即可。

那麼我們就先進行修改,将每個dict中第二個數值進行修改,這裡要記得數值的計算是2的次方,是以這個數值不要太大,寫個10就行了,也就是1024。

首先就是建立安卓工程了,這裡不多叙述那些,直接進行核心方法的講解。

我們因為是需要替換檔案的,是以得先把原檔案放到一個位置,一般都是放到assets目錄下。

聽鬼哥說虐心的2048簡化過程
聽鬼哥說虐心的2048簡化過程

看到這個方法,相信已經明白了我們已經進行的操作了。

0x04:将代碼加入到原遊戲中

其實不管是開發還是破解,掌握一點反編譯的小技巧還是很有用的,比如項目中使用到圖檔資源之類,檢視下對方軟體是如何使用的某種效果,模仿一種算法,都是需要自己動手操作的。

上面那個算法寫好後,我們調用一下:

聽鬼哥說虐心的2048簡化過程

調用是很簡單的,然後我們就運作一下這個apk,檢視是否正确,檔案生成是否可用。

測試正常後,我們拿出來這個apk,在bin目錄下是未簽名的:

聽鬼哥說虐心的2048簡化過程

将其反編譯,對應到剛才那個類裡面找到算法:

聽鬼哥說虐心的2048簡化過程

從這裡開始複制,到end結束

聽鬼哥說虐心的2048簡化過程

然後我們反編譯2048的遊戲檔案:

從AndroidManifest.xml檔案中找到遊戲的主類,進去

Lcom/estoty/game2048/game2048:

找一個空白位置複制進去我們的算法

聽鬼哥說虐心的2048簡化過程

然後回到我們寫好的軟體中,找下這個方法的調用:

聽鬼哥說虐心的2048簡化過程

這樣複制過去以後,我們需要注意一下剛才複制的内容,因為一些方法的調用是this,也就是目前類,我們直接複制過去肯定是空指針,是以需要修改Lcom/ggz/cunda/MainActivity為目前類,也就是替換所有為Lcom/estoty/game2048/game2048,好了,這樣弄完後,我們回編譯軟體,安裝測試一下即可。效果圖如下:

聽鬼哥說虐心的2048簡化過程

0x05:其實我們有更簡單的方法的

1.既然我們有root權限,那麼我們就可以更加簡單的在指令行下來操作檔案的替換過程了

2.我們要寫代碼,那麼直接new一個process執行下指令就行了

第一種方法很簡單,我們就不叙述,下面說第二種,寫好的代碼如下,很簡單:

我們先将那個檔案複制到sd卡上面即可。

聽鬼哥說虐心的2048簡化過程

看完代碼,大家也都明白了,代碼很短,不再講解了。

使用這個方法的好處,就是我們可以自己玩遊戲,然後想刷分的時候,直接執行我們另外一個軟體來操作2048即可,簡單,實用。

0x06:結束語

寫了這麼多,結束語就不說了,愛破解,愛鬼哥。。。

部落格沒啥内容,順手貼上一下了:

http://blog.csdn.net/guiguzi1110

繼續閱讀