在玩遊戲的時候,很多人還是喜歡用修改器的(本人一樣哈
)但是很多網上下的修改器,要麼不能用,要麼有毒,很不爽,因此還是自己動手豐衣足食吧。下面就以植物大戰殭屍為例,一步一步教大家寫植物大戰殭屍的修改器。
首先大家應該對程序有一定的認識。說下大體思路吧,我們知道乙個程序在執行時系統會分配一定的記憶體供這個程序儲存自己的資料,因此我們修改某個程序的資料就應該從這個程序的記憶體區域去修改,因此首先我們要獲得這個程序的記憶體區域,怎樣獲取呢?一會說。在得到程序記憶體之後,我們知道在玩某一關的時候,陽光這個數值是在某乙個記憶體位址上面儲存,當陽光值改變也是對這個位址的資料進行操作,因此我們可以這樣做,假設開始我們陽光值為x
,對這個程序內所有資料進行便利去選擇所有儲存的值為
x的記憶體位址我們可能會找到很多,然後變化一下陽光值變為
y,然後
在剛才儲存x
的位址去尋找所有儲存值為
y的位址。
如果還有很多位址,在變化陽光值進行尋找,這樣總有那麼一天我們會找到唯一的乙個位址哈
(一般不會超過四次尋找,所以大家不用怕滴),當然這個位址就是我們儲存陽光的位址啦。然後對這個位址進行賦值,隨意賦值啦,怎樣賦值呢?一會講。
好了,現在我們大體明白我們要怎麼做了。下面具體實現
1、尋找我們的程序。
當然我們程序的名稱就是「
植物大戰殭屍
.exe」啦,
注意後面一定要有.exe
。怎樣去尋找這個程序呢?當然是用toolhelp
函式完成啦,先用
creattoolhelp32snapshot
函式建立乙個程序快照,然後採用
process32first
和process32next
函式一次將每個程序資訊讀到乙個
processentry32
的結構體裡面,這個過程在
程序操作—
檢視程序優先順序
文章裡面詳細說了,這裡就不多說了,但是我們發現
裡面沒有程序的控制代碼!!!
而後面的操作都是以程序控制代碼來進行操作的,因此我們必須找到這個程序的控制代碼,找程序控制代碼採用openprocess()
函式,這個函式功能就是開啟乙個程序號為
***的程序並且返回它的控制代碼,因此我們只需要用
toolhelp
函式找到這個程序的
id,然後傳給
openprocess
函式就可以返回我們需要的程序控制代碼了。具體實現如下:
找程序id
找打程序id
後尋找程序的控制代碼、
這樣我們就抓住這個程序啦!!!
2、搜尋記憶體
這個關鍵的一部分,我們知道我們肯定不止一次的進行查詢,然而第一次查詢與其他不同,第一次是在程序所有記憶體空間進行查詢,因此時間比較長,後面幾次查詢的時候只需要在前一步的記錄的那些「可疑」
的位址裡面查詢就行了,因此需要另寫乙個函式。為了實現這些功能,我們定義幾個全域性變數
//記錄植物大戰殭屍程序的
iddword tprocessid;
dword g_arlist[999999]; //位址列表
int g_nlistcnt=0; //有效位址個數
然後進行操作。
我們知道我們得作業系統是採用分頁儲存的技術每一頁大小是4kb
,因此我們每一次查詢時應該每次讀取程序記憶體的一頁來進行查詢。然而從**開始呢?
windows 98
系統預留的是
4mb到
2gb的空間,
windows 2000
型提供的是
64kb
到2gb
,因此在開始搜尋的時候應該確定我們作業系統的版本。我們採用
getversionex
函式進行確定結果放到乙個
osversioninfo
的結構體裡面,具體實現如下:
在第一查詢的函式裡面不停地呼叫這個函式就可以啦。如下:
在找到一些可疑的位址後,然後修改數值,進行下一次尋找,知道確定出最後乙個位址未知。如下:
3、修改記憶體
在找到我們要找的位址後,就剩最簡單一步啦,就是修改記憶體,我們只需要使用writeprocessmemory
()即可修改記憶體。
//記錄植物大戰殭屍程序的
iddword tprocessid;
dword g_arlist[999999]; //位址列表
int g_nlistcnt=0; //有效位址個數
為了方便我們檢視程式我們可以將找到的位址列印出來
上面就是我們植物大戰殭屍修改器的具體過程怎麼樣,簡單吧!!!看看效果吧!!!
手把手教你寫Undo Redo程式
手把手教你寫 undo redo程式 undo redo 操作是很多具體編輯功能的軟體所不能缺少的。最典型兩種型別就是文字編輯和影象編輯軟體。然而它的實現在某種程度上來說也不是很簡單。我也廢話少說。要在程式中支援 undo redo 操作,就需要儲存一些必要的資訊,這個是眾所周知的。如果想支援無限級...
手把手教你寫Undo Redo程式
手把手教你寫undo redo程式 undo redo操作是很多具體編輯功能的軟體所不能缺少的。最典型兩種型別就是文字編輯和影象編輯軟體。然而它的實現在某種程度上來說也不是很簡單。我也廢話少說。要在程式中支援undo redo操作,就需要儲存一些必要的資訊,這個是眾所周知的。如果想支援無限級的und...
手把手教你寫ORM(三)
昨天處於暈死狀態,少寫了乙個元件,還需要乙個元件用來專門管理cache的,這裡說道為什麼要分這麼多元件,其實這是習慣問題,很多人喜歡寫乙個很大的dll,不過我比較喜歡拆分,小粒度的專案比較好管理和單獨測試,把用單元測試驗證好了的小組件湊起來除錯和寫成乙個巨大的dll慢慢一行行的追蹤 肯定是前者更加舒...