關於VirtualQueryEx() |
尚未結案
|
rollboy
一般會員 發表:8 回覆:16 積分:9 註冊:2005-04-12 發送簡訊給我 |
hi all ...
小弟最近在站上看了一些修改記憶體程式的資料..
找到一些關於readprocess() , writeprocess() , VirtualQueryEx()的討論
其中提到要找出某某process的位置必須先用VirtualQueryEx()搭配MORY_BASIC_INFORMATION去找出可能位置 ... SIZE_T VirtualQueryEx(
HANDLE hProcess,
LPCVOID lpAddress,
PMEMORY_BASIC_INFORMATION lpBuffer,
SIZE_T dwLength
); typedef struct _MEMORY_BASIC_INFORMATION {
PVOID BaseAddress;
PVOID AllocationBase;
DWORD AllocationProtect;
SIZE_T RegionSize;
DWORD State;
Protect;
DWORD Type;
} MEMORY_BASIC_INFORMATION, *PMEMORY_BASIC_INFORMATION; 我大概試了一下 ... 搜尋範圍由 0k ~ 接近2G位址 ... 慢慢累加RegionSize
並將每次MEMORY_BASIC_INFORMATION的內容紀錄下來 ...
但是我不知道如何由MEMORY_BASIC_INFORMATION內容去判斷這是否為該Process所擁有的記憶體位置? 希望我的描述不會太差 ..< >
煩請有經驗的會員分享一下 , 謝謝!< >
|
RedSnow
版主 發表:79 回覆:1322 積分:845 註冊:2003-12-15 發送簡訊給我 |
rollboy 您好: 不知道您是否已經參考過下列這兩篇討論與 tomtomtom 發表的作品了?如果沒有的話,仔細瀏覽一下,應該會有所獲的:
請教有關 VirtualQueryEx() 的用法
http://delphi.ktop.com.tw/topic.php?topic_id=45251 ReadProcessMemory()在2K/XP回傳失敗
http://delphi.ktop.com.tw/topic.php?topic_id=28068 讀取指定執行中程式的記憶體內容
http://delphi.ktop.com.tw/topic.php?TOPIC_ID=52200
7 天天敲鍵盤 v 時時按滑鼠 8 發表人 - RedSnow 於 2005/08/13 01:00:26
|
rollboy
一般會員 發表:8 回覆:16 積分:9 註冊:2005-04-12 發送簡訊給我 |
hi RedSnow ..
老實說這三篇討論我都有參考過...
在寫這程式之前我有找過站上及網路上的相關文章
看了很多資料, 我覺得自己的想法跟站上的討論有一些出入
先提供我的Source Code ..
TListItem *ListItem; HWND hWnd; DWORD ProcessId; HANDLE hProcess; PVOID pvAddress = (void*)0x0; MEMORY_BASIC_INFORMATION MBI; AnsiString WinTitle = InputBox("System", "Input Window Title", ""); hWnd = FindWindow(NULL, WinTitle.c_str()); if( !hWnd ) ShowMessage(WinTitle.c_str() AnsiString(" does not exist")); else{ ListView1->Clear(); memset(&MBI, 0, sizeof(MBI)); GetWindowThreadProcessId(hWnd, &ProcessId); hProcess = OpenProcess(PROCESS_ALL_ACCESS, false, (unsigned long)ProcessId); while( VirtualQueryEx(hProcess, pvAddress, &MBI, sizeof(MBI)) ){ ListItem = ListView1->Items->Add(); ListItem->Caption = ProcessId; ListItem->SubItems->Add("0x" IntToHex((int)MBI.BaseAddress, 2)); ListItem->SubItems->Add("0x" IntToHex((int)MBI.AllocationBase, 2)); ListItem->SubItems->Add("0x" IntToHex((int)MBI.AllocationProtect, 2)); ListItem->SubItems->Add("0x" IntToHex((int)MBI.RegionSize, 2)); ListItem->SubItems->Add("0x" IntToHex((int)MBI.State, 2)); ListItem->SubItems->Add("0x" IntToHex((int)MBI.Protect, 2)); ListItem->SubItems->Add("0x" IntToHex((int)MBI.Type, 2)); (int)pvAddress = MBI.RegionSize; } } CloseHandle(hProcess); }底下是一個VB Source Code, 撰寫方式跟我蠻像的... http://www.hosp.ncku.edu.tw/~cww/html/q00534.html 現在很疑惑, 所以又跑來問問大家, 希望能確定一下VirtualQueryEx()的用法! 我想關鍵應該在於MEMORY_BASIC_INFORMATION的內容 ... 不知道大家看法如何 ... 先謝謝RedSnow嘍 發表人 - |
rollboy
一般會員 發表:8 回覆:16 積分:9 註冊:2005-04-12 發送簡訊給我 |
|
pwipwi
版主 發表:68 回覆:629 積分:349 註冊:2004-04-08 發送簡訊給我 |
|
rollboy
一般會員 發表:8 回覆:16 積分:9 註冊:2005-04-12 發送簡訊給我 |
引言: rollboy你好: 你大概忘了作業系統中process的定義。process和thread最大的不同在記憶體空間的分隔與共用。每個process都有自已的0~4G的記憶體空間。在這個觀念下,你找到的所有記憶體資訊都是屬於單一個process,(VirtualQueryEx的第一個參數)Oh .. 天啊!我一直以為0~4G的Virtual Memory是共用的, 以為所有Process都會被分配同一個Virtual Memory內!看來我對於Process跟Virtual Memory的認知是錯誤的!! 謝謝 > 發表人 - |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |