怎麼成爲風靈月影宗長老(上篇)

有什麼工具是電子陽痿的根源,可以快速消耗一個遊戲的遊玩壽命?

又是什麼工具讓人慾罷不能,"將遊戲最後一滴價值榨出來".

很多人的答案都會是--風靈月影。

選擇修改器這件事,本來就存在兩面性,無法下定義好與壞,很多時候選擇修改器,是爲了規避不友好的關卡設計、時間不充裕的前提下快速通關,或者對框架內的玩法感到倦怠,只想體驗最純粹的劇情。

但是今天不是從修改器的選擇出發,而是分析修改器背後的原理(我也要當風靈月影宗長老

對於單機遊戲而言,遊戲中絕大部分的參數(比如血、藍、能量亦或是金幣)都存儲在計算機的堆棧中,一些類似劇情進度的則加密後寫入本地的自定義配置文件中,一些防護性強大的遊戲爲了避免玩家作弊,會在上述的步驟中設置加密,來保證玩家的用戶體驗(或者純純爲了噁心玩家)。

在此之前,我們來了解一些基礎知識:

數據類型:遊戲中的血量、藍、生命值等,我們將他們稱之爲變量,變量位於內存中,包含了變量名稱和數據類型,如果可以找到對應變量在內存中的地址,就可以將其修改並得到想要的數值。

進程:每一個應用程序/遊戲啓動,都會產生至少一個進程Process,在任務管理器裏可以看到進程名稱和進程PID,大家在修改器界面可以看到這個進程。

句柄:英文HANDLE,一個整數值。數據的地址需要變動,變動以後就需要有人來記錄管理變動,就好像戶籍管理一樣,因此係統用句柄來記載數據地址的變更

進入正題,我們該怎麼找到需要修改的變量的地址呢?一般要參考一下路線:

修改變量的數值→找到存儲變量的內存地址→找到遊戲窗口的句柄→找到遊戲的進程。

這裏給出一個獲得內存地址的思路,Windows系統庫的kernel32.dll庫文件中包含了內存操作的API,其中VirtualQueryEx用於查詢地址空間中內存地址的信息。

此函數負責獲取內存信息,而查詢內存信息中具體存放數值則用到另一函數ReadProcessMemory,將根據句柄讀取該進程的某個內存空間,並將讀取到的字節數寫入到我們開闢的一塊空間中,而此空間存放的正是我們苦苦追尋的“有意義的數值”。此函數的部分參數依賴於上一個函數VirtualQueryEx產生的結果。

根據上面的API,來看怎麼獲取窗體句柄,同樣的kernel32.dll提供了名爲OpenProcess的函數用來打開一個已存在的進程對象,並返回進程的句柄。

我們獲取到進程的PID以後,就可以調用OpenProcess獲取窗體的句柄,然後利用函數VirtualQueryEx遍歷內存查找地址信息,根據地址利用ReadProcessMemory查找具體存放的值,最後利用WriteProcessMemory把修改後的值寫入該地址,這樣就完成了一次數據的修改。

到了這裏,修改遊戲數值的原理和套路已經很明白了,甚至脫離遊戲來講,任何的應用如果沒有對緩存中的數據進行良好的加密,都是存在很大的風險隱患的,這也是爲什麼運行作弊軟件時,360經常報毒的原因。

上篇先了解一下常用到的名詞和API的運用。具體如何利用代碼進一步調用API,以及更詳細的剖析每一步的邏輯,留在中篇和下篇繼續寫吧(立個flag吧

更多遊戲資訊請關註:電玩幫遊戲資訊專區

電玩幫圖文攻略 www.vgover.com