《魔獸爭霸3》是一款經久不衰的裡程碑遊戲,可以說他為大多數的競技類遊戲提供了一個模板,從早期的起凡對戰平臺,夢三國等遊戲就開始大量的模仿和改進魔獸地圖。到現在膾炙人口的《英雄聯盟》也處處可以看到魔獸的影子。
魔獸最大的亮點在於一個平衡性,電子競技是其核心思想,而如同大牌電影一般的劇情,和培養團隊協作的RPG模式同樣是吸引玩家的經典玩法。
電子競技的第一要求是平衡,魔獸在這一點上做的無可挑剔。但是在單人模式中,我們同樣可以通過各種秘籍來打破這平衡,這也是讓手殘黨能夠打敗簡單電腦的一種福利。這些秘籍都是魔獸自帶的,它們大多來自於電影小說的臺詞等,處處散發著西方人的幽默感。
今天我們要了解的是「keysersoze」這條指令。他來源於《非常嫌疑犯》中的人名Keyser soze,這裡不做細說,有興趣的朋友可以去了解一下這個人物。這條指令的作用是讓我們的金幣增加500,如果再後面加上空格並輸入一定的數值,則可以增加我們指定的金幣數量(如圖)
那麼這個功能在內存中是如何實現的呢?下面我們通過逆向的角度來對其進行分析。
在分析前我們需要用窗口模式來打開魔獸,這更加方便我們進行調試,修改方式為將快捷方式的路徑後面+空格+window(如圖)
接下來打開遊戲,並用CE進行加載(如圖)
由於這條命令是修改金幣數量的,所以我們要從金幣的數量入手對其進行分析。在大部分的情況下,金幣數量是以整數型進行存放的,當然也有個別情況可能會用到浮點型。那麼我們先用CE搜索整數型的數量發現沒有得到任何的結果,而同樣用其他的類型掃描也沒有得到結果。這說明這個金幣的數量很有可能是進行加密處理。
於是我們通過位置初始值進行首次掃描,並通過增加和減少數值來進行過濾,並最終得到一個結果(如圖)
很明顯這是將實際的金幣數量*10之後的結果,我們將其修改為1234560後,遊戲內的金幣變為123456(如圖)
這裡為了修正實際的金幣數量,對建築進行一下多人建造,所以實際數量減少了1。
接下來我們用OD加載遊戲,並對金幣數量的地址下硬體寫入斷點(如圖)
當我們輸入秘籍之後遊戲斷下,這說明秘籍對遊戲金幣進行改寫(如圖)
講斷點刪掉之後,我們執行到返回,對外層函數進行分析,看一下哪一層函數方便我們調用,並且可以達到秘籍的效果。(由於測試崩潰了,所以重新啟動了一下遊戲)
在外層我們發現可以調用的函數很多,我們選擇一個最外層可以調用的函數進行分析(如圖)
這個函數有3個參數,其中的第一個參數是常量,代表的是金幣,第二個參數則表示需要增加多少金幣,而第三個參數則是立即數1。再傳入一個this指針ecx既可以對函數進行調用了。我們通過代碼注入器進行測試(如圖)
測試成功,遊戲金幣增加500,當然這是數值是我們可以任意添寫的。
雖然測試成功了,但是我們發現在調用之後中並沒有出現啟用秘籍的提示,對於有強迫症的人來說,這顯然是不完美的。出現這種情況的原因很顯然是因為調用內部不完整函數導致的。那麼我們繼續選擇向外層返回,得到了一個新的函數(如圖)
這個函數只有一個結構體參數,結構內部除了一個金幣數量是可以進行修改的,其他都是常量,顯然這些常量中某一個代表KeyserSoze秘籍。通過插件在OD中申請一片空的內存,並將結構體拷貝到裡面(如圖)
將ecx傳入之後進行調用,在金幣增加的同時,啟用秘籍的提示也出現了(如圖)
這就是指令KeyserSoze在內存中調用的函數,當然也僅僅在單機版中可以實現。在聯網模式中,是有伺服器進行數據驗證的,如果檢測到數據不同步,就會出現遊戲崩潰或者斷開連接的情況。這種檢測方式也同樣適用於網路遊戲中,這也是網路遊戲安全最基本的一種檢測手段。後面我們會陸續對其他的遊戲秘籍進行分析。