Win32 實現記憶體修改器

2021-10-06 15:40:09 字數 3700 閱讀 6010

在遊戲執行中啟動修改器, 輸入遊戲當前想要修改的金幣/礦石/木材/…的數值

找到程式執行時的程序id, windows為每個程序都分配4gb的虛擬位址空間, 我們只需要在虛擬位址空間去遍歷儲存數值與遊戲中數值相同的位址, 去修改它即可, 但需要注意僅搜尋一次得到的儲存此數值的位址極可能不唯一, 故在得到多個位址時就再在遊戲中花費一點金幣/…的值, 再到剛剛儲存的多個位址中搜尋. 直到獲得唯一的位址.

修改此位址上的數值, 完成目標 !

直接使用cui操作, 沒有gui美麗的外衣.(加上gui不就成了金山某俠了嗎?)

首先將遊戲執行起來, windows為每個程序分配4gb的位址空間, 前2gb歸應用程式所有, 後2gb屬於整個作業系統共用. 我們要向在指定的程序位址空間中修改資料就先要得到此程序的操作控制代碼.

實現原理: 輸出當前所有執行中的程序及程序id, 主動輸入指定的程序id, 返回目標程序的操作控制代碼. 通過控制代碼就能在找到指定的空間修改資料了.

實現輸出和查詢程序id的demo

#include

#include

#include

using

namespace std;

intmain()

bool bmore =

process32first

(hprocesssnap,

&pe32)

;while

(bmore)

bmore =

process32first

(hprocesssnap,

&_pe32)

; dword processid;

cout <<

"input processid: "

; cin >> processid;

while

(bmore)

bmore =

process32next

(hprocesssnap,

&_pe32);}

closehandle

(hprocesssnap)

;system

("pause");

return0;

}

這樣就能將所有正在執行中的程序名與程序id列印出來, 得到id即可使用函式得到控制代碼

windows採用分頁機制來管理資料, 以4kb為單位搜尋可以提高搜尋速率. 下面的compareapage函式的功能就是比較目標程序記憶體1頁大小的記憶體. 得到的位址可能不止乙個, 故將符合的所有位址儲存在乙個set中, 接下來會在這些位址中再篩選.

bool compareapage

(dword dwbaseaddr, dword dwvalue)

// 在這1頁中查詢

dword* pdw;

for(

int i =

0; i <4*

1024-3

; i++

)else}}

return true;

}

使用findfirst函式來在2gb的記憶體中搜尋

bool findfirst

(dword dwvalue)

// 在使用者位址空間進行搜尋, win98為應用位址預留位址為4mb至2gb

// win2000預留位址為64kb至2gb

// 故需判斷作業系統型別, 用以決定開始位址

dword dwbase;

osversioninfo vi =

;getversionex

(&vi);if

(vi.dwplatformid == ver_platform_win32_windows)

else

// 從開始位址到2gb的位址空間進行查詢

for(

; dwbase <

2* dwonegb; dwbase +

= dwonewpage)

return true;

}

數值改變後再到之前儲存的位址中查詢資料變化相同的資料, 直到滿足結果

bool findnext

(dword dwvalue)}}

g_hashmap.

swap

(newset)

;return bret;

}

bool writememory

(dword dwaddr, dword dwvalue)

#include

"memrepair.h"

handle g_hprocess;

// 儲存遊戲程序控制代碼

unordered_set g_hashmap;

// 儲存資料位址

intmain()

showhash()

; cout <<

"----------------"

<< endl;

} cout <<

"input new val = "

; cin >> val;

auto it = g_hashmap.

begin()

;while

(it != g_hashmap.

end())

else

it++;}

return0;

}

本來想使用紅警2測試, 由於遊戲版本過低原因我無法切回桌面, 故使用紅警3

開啟遊戲, 開始遊戲, 這個時候只有15000很少.

開啟修改器程式. 輸入指定遊戲程序id

輸入5692, 等待輸入金額

輸入15000的金額, 程式進行搜尋, 將儲存此數值的位址列印並儲存起來

發現多個位址, 我們在遊戲中建乙個電廠花費點錢, 金錢變為14200, 再在視窗輸入這個數

這時在剛剛儲存的位址中僅有兩個位址儲存的資料為14200, 再重複上一步花點錢. 再輸入進去

最後, 輸入你想要的數字, 回車, 返回遊戲檢視

ohhhhhhhhhhhhhhhhhhhhhhhh, 讓我們使用先鋒轟炸機轟平tokyo吧 !

需要原碼可以聯絡作者哦

參考文獻:

windows程式設計(第三版) 張錚 孫寶山 周天立

記憶體修改器實現原始碼

include stdafx.h include include include includeusing namespace std dword g arlist 1024 int g nlistcnt handle g hprocess bool writememory dword dwaddr...

C 製作記憶體修改器

先看效果圖 其實 搞這個東西 主要是因為 不久前看到乙個c 寫的外掛程式 頓時就來了興趣 當時看了之後 覺得不爽的就是 那個位址是寫死在程式裡面的是固定的 而且是用其他東西掃出來的位址 頓時就覺得不爽了 要這個位址也是自己寫的程式掃出來的那才有成就感 於是呼這東西就這樣誕生了 在做之前 我感覺這東西...

windows虛擬記憶體(win32)

windows是乙個以虛擬記憶體為基礎的作業系統。在這種系統環境下,windows記憶體管理器經常在記憶體中來回移動物件,依此來 滿足各種應用程式的記憶體需要。物件被移動意味著它的位址變化了。如果位址總是如此變化,我們該到 去找物件呢?為了解決這個問題,windows作業系統為各應用程式騰出一些記憶...