線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1015
推到 Plurk!
推到 Facebook!

請教這個範例程式片段,為什麼可以這樣用?

尚未結案
csf0427
一般會員


發表:6
回覆:8
積分:2
註冊:2004-07-26

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-08-05 12:09:15 IP:140.130.xxx.xxx 未訂閱
在我前一篇發問的問題,有關讀取別的程式的記憶體的方式中, 感謝高手版友為我提點了一個方向: 請參考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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-08-05 23:45:20 IP:211.76.xxx.xxx 未訂閱
csf0427你好: 我覺得你的猜想應該沒有錯,Tom版友在這個範例中只是簡略的示範了如何去讀其他行程的記憶體。至於為何用c000開始,我也不解... 另外Tom也精簡了一些步驟。在讀記憶體前,也需要先知道該行程那個部份的記憶體是可以讀的,那些是不能讀的。有一些API有這個功能,(Tom的範例裡也有,找一下有關MEMORY_BASIC_INFORMATION)
csf0427
一般會員


發表:6
回覆:8
積分:2
註冊:2004-07-26

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-08-06 19:33:23 IP:140.130.xxx.xxx 未訂閱
不好意思,讀取記憶體這部份我不太熟,所以多問一點: 照pwipwi大大所說,是不是有些記憶體是不能被讀取的呢? 還是經過VMQuery處理後,其實還是什麼都能讀得到的呢?
pwipwi
版主


發表:68
回覆:629
積分:349
註冊:2004-04-08

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-08-06 21:04:16 IP:211.76.xxx.xxx 未訂閱
引言: 不好意思,讀取記憶體這部份我不太熟,所以多問一點: 照pwipwi大大所說,是不是有些記憶體是不能被讀取的呢? 還是經過VMQuery處理後,其實還是什麼都能讀得到的呢?
1.是不是有些記憶體是不能被讀取的呢? 沒錯,這就是為何會有我們常見的Access violation錯誤。普通視窗的程式所能讀取的是由Windows所管理的記憶體,而不是實體記憶體…相關的運作方式,可以參考侯捷網站,有一個電子書可以下載:windows95 system programming secrets。(已經絕版了)
csf0427
一般會員


發表:6
回覆:8
積分:2
註冊:2004-07-26

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-08-09 10:28:23 IP:140.130.xxx.xxx 未訂閱
不知道是不是TOM版友的範例程式精簡了什麼關鍵步驟,而我對記憶體的認識 又不是很深入,所以研究了3天,還是沒法理解,只好再上來發問了 QQ 我想做的是類似將記憶體dump出來的程式,例如把已開啟的"小畫家"的 全部記憶體內容顯示出來,如此而已,不過即使是這樣的小功能, 好像也不太容易做到,研究好久了說,這樣的功能我想程式碼應該不會太長, 不知道能不能給我個簡單的範例套用?感謝大大幫忙~~~ 我也去過侯捷網站看過,pwipwi大大提到的電子書也有找到,不過可能是頻寬 不夠,下載了好久,結果還是斷線 ><" 現在連它的首頁都進不去了,找時間我 再努力下載看看...
pwipwi
版主


發表:68
回覆:629
積分:349
註冊:2004-04-08

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-08-09 21:46:54 IP:211.76.xxx.xxx 未訂閱
你提到的東西,下面的連結有範例下載~ http://www.codeproject.com/threads/MDumpAll.asp    我有抓來研究過,寫得很棒喔
系統時間:2024-05-09 21:37:32
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!