Shaolin.TW

shaolin's 20% time

神魔之塔脫機自動戰鬥

前言

最近下載了神魔之塔這款遊戲…orz。 我發現在 Facebook 打廣告還算有用,真的就是因為他出現贊助在我牆上太多次,才決定下載試試看,而且當我意識到的時候,我已經花了整整一天在轉珠上面了,也難怪神魔之塔版會佔據 PTT 熱門看板前幾名,不是沒有道理 XD 我喜歡從應用層的協定來了解一款網路遊戲,了解程式和程式間的溝通,總能更了解開發者的思維。身為一個研究僧,動手來看看神魔之塔的 API 吧!

發現

一開始錄封包還滿訝異的,因為它是走 HTTP,沒有 SSL/TLS 的狀況下很容易被偷走遊戲資訊,而且其 session 好像大喇喇的出現在 GET 參數裡面,如下面一個取得獎賞清單的請求:

http://zh.towerofsaviors.com/api/user/reward/list?uid=400000000&session=21232f297a57a5a743894a0e4a801fc3&language=zh_TW&platform=android&version=3.27&timestamp=1234567890&timezone=8&nData=8d777f385d3dfec8815d20f7496026dc&hash=5f4dcc3b5aa765d61d8327deb882cf99

不過其實神魔之塔這款遊戲帳號被偷走也不太會有影響,畢竟虛擬的卡片也不能流通。影響比較大能想到的就是把其他玩家六星神卡當肥料餵史萊姆。(但有人會這麼無聊嗎?)

神魔之塔的 API 還滿清楚簡單的,結構一目了然。唯一讓我有興趣的,是 hash 那個參數,因為如果對請求做了修改,伺服器就會回傳 Invalid Hash Code.,看起來這串 hash 值是對所有參數做某種演算法的結果。

所以我就翻翻翻,翻到了產生 hash 的演算法:

1
hash = Checksum.GetHash("/api/" + path + URLBuilder.BuildQuery(dictionary, true), string.Empty);

其中 GetHash 是下面這個樣子。

1
2
3
4
5
6
public static string GetHash(string input, string salt = "")
{
     string str = "YmZhYTRkNzIwM2VkODhhZTZiZTg4MDU2NWFlYjkxMDU=" + salt;
     string str2 = Encryption.MD5(input).Substring(4, 4);
     return Encryption.MD5(str2 + str);
} 

在有了這串 hash 演算法的前提下,可以做的事情好像就很多了,例如說 自動戰鬥

實作

為了要證實這樣的想法,我寫了一支程式去測試。模擬戰鬥中的參數,然後送出戰鬥勝利的請求。實作影片如下:

這只是一支 POC (Proof of Concepts) 程式,雖然看起來很強大,但就寫到這邊為止了。要不是前兩天陪朋友們去參加比賽,我順便去練練程式,不然這應該永遠只是一個 concept 而已。 利用同樣的前提,以下還有其他猜想,但我已經不會去驗證了: - 感覺夠做到自動化首抽,應該可以不受官方開新帳號的限制 - 例如在戰鬥中回合次數改成 9999,不知道會不會把 skill 等級提昇

結論

本篇從神魔之塔 API 的角度出發,嘗試了解參數的意義,並實作程式自動化戰鬥。 從這件事情也學習到,在開發者的角度,有必要在重要的加密程序上做一些混淆,可以增加有心人解析的困難度。

我能夠預料到這篇文章寫出來有些人可能會有問題想問,但這只是我突發奇想做的事情,也不會繼續研究下去,所以請原諒我不會在這篇文章下回應留言。

« Facebook 修改文章 API Rails CookieStore 的安全議題 »

Comments