我試圖擴展在線遊戲的遺留代碼,以合理保證與遊戲相關的資源文件是最新版本,而不是篡改。我想在不使用DRM的情況下執行此操作,無需進入內核模式,也無需硬件幫助。理想情況下,我最終解決的問題應該與用戶空間一樣安全。如果他們能夠繞過這些機制,那麼我會說他們已經有了調皮的權利 - 至少在一段時間內,我們會禁止他們。 :)輕量級文件驗證與PKI
顯而易見的做法是對每個文件進行加密散列,並將散列輸出與預先計算的散列進行比較。但必須注意確保用戶不能輕易地篡改用於與當前計算的哈希值進行比較的預先計算的哈希值。下面是我腦子裏想的措施,在體系結構層次:
- 使用OS設備時,過程開始鎖定所有的資源文件的寫作,所以沒有其他進程可以在事後覆蓋這些文件。
- 計算每個資源文件的MD5總和。
- 連接到https服務器,要求對存儲在客戶端可執行文件中的特定簽名證書進行驗證。
- 通過https下載包含「正確」散列的文件,將其存儲在RAM(而不是磁盤)中。
- 將計算出的散列值與通過https接收的散列值進行比較。
- 如果哈希值不匹配則退出。
這比存儲哈希客戶端更安全,因爲只要它們存儲在客戶端,通常有人可以修改它們。使用這種方案,攻擊者必須弄清楚如何修改可執行文件,以便更改嵌入式公共證書,以便它實際上包含攻擊者的證書,該證書針對攻擊者的https web服務器進行驗證,該證書包含與攻擊者篡改資源文件。這當然是可行的,但是如果程序使用存儲在客戶端的預先計算的密鑰,它會比它更難。
可執行文件是本地代碼,因此可能會將其封裝到打包程序中,這樣會更難以編輯二進制文件並替換公鑰。
現在,如果我剛剛描述了兩段如何潛在地攻擊我設計的方案:除了我描述的攻擊此方案之外,還有其他方法嗎?
我的第二個問題是,什麼是可以從Win32 C++(Visual Studio 2010編譯器)調用來完成這些任務的免費(如免費或自由)庫?它們可以使用內置的Windows API完成,還是需要第三方解決方案?
所以總而言之,這些問題: 1.我建議的方案是否足以阻擋大多數劇本小子;和 2.我會用什麼依賴或庫來實現它?因爲這只是一個遊戲,而不是國家安全甚至是貨幣風險(遊戲是100%免費軟件,沒有遊戲中的經濟),我實現的解決方案應該是相當不錯的,但它不會必須是工業實力。
隨意回答我的問題的一個或兩個部分,如果您認爲我提出了錯誤的問題,那麼請您糾正我。
謝謝!
@selbie:我只想回到這個(老)問題,並說非常詳細和慷慨的解決方案謝謝你。我最近閱讀了這篇文章,它對我非常有幫助,現在我有足夠的信心去嘗試在我的遊戲的開發環境中進行這種改變。不要停止爲別人做這種腦轉儲的事情;這很棒! – allquixotic 2012-08-13 21:01:04
今年的兩年,你還在做同樣的遊戲? :) – selbie 2012-08-14 19:07:08
是的。它當然向公衆發佈,但我們仍在考慮如何實現這樣的方式來改進我們的補丁程序並在讓人們開始遊戲之前驗證資源是否完好無損。當然,我們的目標並不是像Valve Anti-Cheat那樣具有限制性和偏執性,但有些人試圖至少避免無意的文件損壞/過時,並避免偶然的腳本小子會很好。所以你的答案有幫助。 – allquixotic 2012-08-14 19:14:25