比方說,我正在製作一款遊戲,玩家的健康狀況存儲在一個變量float player_hp
中。玩遊戲時,用戶可以打開像Cheat Engine這樣的內存編輯器,對內存進行一些聰明的搜索,並在內存中找到變量的位置。然後,他們可以將其編輯爲任何他們想要的內容,從而有效地允許他們作弊。內存中的變量能否免於惡意內存編輯?
是否有一種奇妙的方式來存儲我的變量,這將有效地阻止用戶惡意編輯它們?我應該在記憶中移動它們嗎?我應該加密或散列它們嗎?
如果重要,我主要使用C++。
比方說,我正在製作一款遊戲,玩家的健康狀況存儲在一個變量float player_hp
中。玩遊戲時,用戶可以打開像Cheat Engine這樣的內存編輯器,對內存進行一些聰明的搜索,並在內存中找到變量的位置。然後,他們可以將其編輯爲任何他們想要的內容,從而有效地允許他們作弊。內存中的變量能否免於惡意內存編輯?
是否有一種奇妙的方式來存儲我的變量,這將有效地阻止用戶惡意編輯它們?我應該在記憶中移動它們嗎?我應該加密或散列它們嗎?
如果重要,我主要使用C++。
保護您的數據的兩種方法:
1)僅向用戶提供二進制文件。編譯代碼。不要給他們源代碼。 2)如果你的遊戲是一個在線遊戲,存儲敏感數據服務器端。
您應該研究一個名爲「封裝」的想法,以用於設計API,以便敏感數據得到保護。
聲明:我沒有經驗的編程遊戲,只爲他們作弊。
計算所有重要變量,如健康&彈藥服務器端並將該數據複製到客戶端。皮卡也必須由服務器驗證。如果你在服務器端使用彈藥,如果它是客戶端的話,我們會調用PickUp(ammoCrate)。
你永遠不會阻止所有人,但我認爲讓90%的人不要再作弊是很煩人的。每款遊戲都應該有一些基本的東西,然後再採用更先進的保護措施,讓流行的遊戲必須避免被作弊者摧毀。
使用基本的異或運算法則(如隨時間變化)加密通常修改的值(如健康狀況)。更改密鑰的地址並使用指針指向它,使指針超過6層深。這將迫使作弊者製作一個腳本,並使用模式掃描,而不僅僅是一張作弊表,這將阻止大多數人。
使用IsDebuggerPresent()來檢測被連接的調試器,然後關閉該過程。當您在Cheat Engine中執行「Find What Accesses」時,將附加一個調試器,並且如果使用默認選項將被IsDebuggerPresent檢測到。
這可以掛和修補,下一步是手動檢查是BeingDebugged國旗在Process Environment Block
獲得PEB指針:
PEB* GetPEB()
{
#ifdef _WIN64
return (PEB*)__readgsword(0x60); //64 bit
#else
return (PEB*)__readfsdword(0x30); //32bit
#endif
}
閱讀調試標誌:
bool IsDebugFlagSet(PEB* peb)
{
if (peb->BeingDebugged == 1) return true;
else return false;
}
如果他們掛鉤IsDebuggerPres ent()你可以比較磁盤上的字節與內存中的字節在函數的開始處並進行比較,或者更容易,只需檢查第一個字節並查看它是否是相對jmp(x86示例)
檢查鉤:
bool IsHooked(char* functionName, char* dllName)
{
BYTE* functionAddress = (BYTE*)GetProcAddress(GetModuleHandle(dllName), functionName);
return (*functionAddress == 0xE9);
}
其他招數:
掛鉤調用LoadLibrary()& LDRLoadDLL()和加載DLL的流氓爲
內存掃描運行進程停止他們通過這樣調試器將無法連接
除了這些技巧可以使用商業反作弊或內核模式驅動程序,以保護您的遊戲比較使用CreateToolHelp32Snapshot函數()對黑名單
填補所有調試寄存器中的映像名稱或圖像路徑編輯,但上面的提示會阻止普通人。
但即使在用戶只有二進制文件且沒有源代碼的遊戲中,仍然可以使用Cheat Engine等實用工具將程序內存編輯爲惡意結尾。 –
通常,人們可以在自己的機器上編輯程序。你能做的最好的事情往往是保護其他人的機器。 –