所以我一直在通過問題與外部進程內存讀取(讀取進程的內存我不能訪問。)我已經改變了,但有一件事我只是我無法理解我的頭腦。內存在Windows中如何工作?
的Win32API函數ReadProcessMemory()接受幾個參數,如下所示:
public static extern Int32 ReadProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress,
[In, Out] byte[] buffer, UInt32 size, out IntPtr lpNumberOfBytesRead);
我傳遞這些參數是這樣的:
public byte[] ReadBytes(IntPtr Handle, Int64 Address, uint BytesToRead)
{
IntPtr ptrBytesRead;
byte[] buffer = new byte[BytesToRead];
ReadProcessMemory(Handle, new IntPtr(Address), buffer, BytesToRead, out ptrBytesRead);
return buffer;
}
那是,直到最近,我的理解是這裏列出的地址對於閱讀內存來說是唯一非常重要的事情,這就是我在內存中找到的正確值。不幸的是,這似乎是一個託什的負擔,而且看起來實際上這個句柄控制着我與之交互的那個窗口。例如:
我正在運行「Notepad.exe」進程的2個版本。
過程的每個實例有一個整數,第一個包含數字12345,第二個是包含54321
我期待讀取整數,並讓我們說(雖然我還沒有證實了這一點,所以它可能是不真實的)該程序內存空間內存地址是0x1000。
如果我例如運行:
ReadProcessMemory(NP.Handle, NP.MainModule.BaseAddress + 0x1000, buffer, 32, bread);
這將與手柄閱讀的過程中,在該基地的地址添加到該偏移。然而這段代碼將讀取完全相同的值:
ReadProcessMemory(NP.Handle, NP2.MainModule.BaseAddress + 0x1000, buffer, 32, bread);
注意NP2應該是第二個記事本窗口,NP是第一。在上述的頂部,這將讀出的不同的值(儘管我們正在閱讀是相同的與第一示例中的地址的):
ReadProcessMemory(NP2.Handle, NP.MainModule.BaseAddress + 0x1000, buffer, 32, bread);
當然這意味着該把手控制,其中存儲器是閱讀,而不是地址,而且事實上這個地址與我實際上想要做的事情完全不相關?任何人都可以向我解釋爲什麼會是這種情況?
道歉,如果這個問題過於具體,但這個問題一直困擾着我的腦子很長一段時間了,雖然我每天都和很多程序員說話,但他們都沒有能夠(或者更多他們不願意)幫助我。
我完全意識到這隻適用於同一個exe的2個運行實例,所以如果你要閱讀Firefox和記事本(我認爲),它將不起作用。我只是想知道爲什麼它是這個改變的句柄,而不是地址。
感謝
由於您僅從基址讀取4k,我懷疑您正在讀取內存的可執行部分,這對於'notepad.exe'進程都是相同的。你有沒有嘗試過讀兩個不同的程序?兩個過程的價值在這個位置是完全可行的。 – Steve
「完全相同的價值」是什麼意思?同樣的答案,當它不應該? –
@Steve - 我明白你的意思,實際上我沒有使用記事本,但另一個程序,我懷疑這裏會有人,記事本只是作爲一個例子。我實際讀取的偏移量是一個結構數組的一部分(在我注意到這個「問題」的情況下),並且距基數的偏移量爲0x553008)。 (還是)感謝你的建議。 – XtrmJosh