請教這個範例程式片段,為什麼可以這樣用? |
尚未結案
|
csf0427
一般會員 發表:6 回覆:8 積分:2 註冊:2004-07-26 發送簡訊給我 |
在我前一篇發問的問題,有關讀取別的程式的記憶體的方式中,
感謝高手版友為我提點了一個方向: 請參考Tom版友的作品,非常詳細
http://delphi.ktop.com.tw/topic.php?TOPIC_ID=52200 但我下載研究了好一會,有些地方實在不瞭解為什麼可以這樣用,
以下列出TOM版友的原始程式碼,並直接在中間列出我的問題點,
煩請高手提點,謝謝: void doit(HANDLE hProcess)
{ BOOL fOk = TRUE;
PVOID pvAddress = NULL; <-----為什麼初始成NULL?後面卻可直接傳入給
int addr; VMQuery用? addr = 0xc000; <-------------為什麼要設成這個值??? while (fOk)
{
VMQUERY vmq;
fOk = VMQuery(hProcess, pvAddress, &vmq); if(1) //(vmq.BlkSize == 0x801000)
{
BYTE buff[1000];
//SIZE_T lpNumberOfBytesRead;
//ReadProcessMemory( (void*)&dwProcessId, vmq.pvBlkBaseAddress, (void*)buff, 100, &lpNumberOfBytesRead); DWORD dummy; addr = (int)vmq.pvBlkBaseAddress; if (! ReadProcessMemory( hProcess, (void*) addr, (void*) &buff, 8, &dummy) )
{
//cout << "failed to read process" << endl;
} printf("Address x = x x x x x x x x\n",addr, buff[0],buff[1],buff[2],buff[3],buff[4],buff[5],buff[6],buff[7]); //break;
} // Get the address of the next region to test.
pvAddress = ((PBYTE) vmq.pvRgnBaseAddress vmq.RgnSize);
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
為什麼這樣算位址?前面ReadProcessMemory讀了8個bytes,不是
應該直接加8,讀接下來以後的記憶體嗎?
}
} 以上是我比較看不懂的副程式的部份,
另外,我把TOM版友的這個程式run出來的結果: ...
Dump svchost.exe
Address 0000c000 = cc cc cc cc cc cc cc cc
Address 0001c000 = cc cc cc cc cc cc cc cc
Address 0001c000 = cc cc cc cc cc cc cc cc
Address 0003c000 = cc cc cc cc cc cc cc cc
Address 0003c000 = cc cc cc cc cc cc cc cc
Address 0006c000 = 00 00 00 00 00 00 00 00
Address 000dc000 = 00 00 00 00 00 00 00 00
... 發現它把svchost.exe的記憶體dump出來的情形,許多都是2組2組重複的,
而且記憶體位址跳得很遠,這樣算是正常的Dump嗎?
還是TOM版友只是為了示意,所以把一些步驟簡化了?
小弟程式能力似乎太差了,看得一頭霧水,還請各位先進再幫忙 QQ
|
pwipwi
版主 發表:68 回覆:629 積分:349 註冊:2004-04-08 發送簡訊給我 |
|
csf0427
一般會員 發表:6 回覆:8 積分:2 註冊:2004-07-26 發送簡訊給我 |
|
pwipwi
版主 發表:68 回覆:629 積分:349 註冊:2004-04-08 發送簡訊給我 |
引言: 不好意思,讀取記憶體這部份我不太熟,所以多問一點: 照pwipwi大大所說,是不是有些記憶體是不能被讀取的呢? 還是經過VMQuery處理後,其實還是什麼都能讀得到的呢?1.是不是有些記憶體是不能被讀取的呢? 沒錯,這就是為何會有我們常見的Access violation錯誤。普通視窗的程式所能讀取的是由Windows所管理的記憶體,而不是實體記憶體…相關的運作方式,可以參考侯捷網站,有一個電子書可以下載:windows95 system programming secrets。(已經絕版了) |
csf0427
一般會員 發表:6 回覆:8 積分:2 註冊:2004-07-26 發送簡訊給我 |
不知道是不是TOM版友的範例程式精簡了什麼關鍵步驟,而我對記憶體的認識
又不是很深入,所以研究了3天,還是沒法理解,只好再上來發問了 QQ
我想做的是類似將記憶體dump出來的程式,例如把已開啟的"小畫家"的
全部記憶體內容顯示出來,如此而已,不過即使是這樣的小功能,
好像也不太容易做到,研究好久了說,這樣的功能我想程式碼應該不會太長,
不知道能不能給我個簡單的範例套用?感謝大大幫忙~~~
我也去過侯捷網站看過,pwipwi大大提到的電子書也有找到,不過可能是頻寬
不夠,下載了好久,結果還是斷線 ><" 現在連它的首頁都進不去了,找時間我
再努力下載看看...
|
pwipwi
版主 發表:68 回覆:629 積分:349 註冊:2004-04-08 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |