簡體   English   中英

內存如何在Windows中運行?

[英]How does memory work in 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;
    }

直到最近,我的理解是,這里列出的地址是讀取內存唯一真正重要的東西,這就是我在內存中找到正確值的原因。 不幸的是,這似乎是tosh的負擔,似乎實際上句柄控制着我正在與哪個窗口進行交互。 例如:

我正在運行2個版本的Process“Notepad.exe”。

進程的每個實例都有一個整數,第一個包含數字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和Notepad(我認為)它將無法工作。 我只是想知道為什么這是改變的句柄,而不是地址。

謝謝

直到最近,我的理解是,這里列出的地址是讀取內存唯一真正重要的東西,這就是我在內存中找到正確值的原因。 不幸的是,這似乎是tosh的負擔,似乎實際上句柄控制着我正在與哪個窗口進行交互。

在這一段中,對於你正在做的事情存在多種錯誤理解,我不確定從哪里開始。

但是這里(假設這是不完整的):

讀取我無法訪問的進程的內存

你不能。

如果您沒有足夠的權限訪問目標進程,Windows安全性將阻止您獲得具有必要權限的該進程的句柄。 (如果不是這種情況則不會有安全措施。)

但是,我們假設讀取過程正在運行Debug或等效權限,從而提供足夠的訪問權限(這就是為什么,在某種程度上稱為“上帝特權”允許持有者繞過安全性)。

處理控制哪個窗口

你需要一個進程句柄,而不是一個窗口句柄:它們是完全不同的東西。 使用OpenProcess從進程ID獲取進程句柄,在請求的訪問權限中讀取內存包括PROCESS_VM_READ

他們需要利用Windows進程的(虛擬)內存布局知識來確定您需要讀取的地址。 請記住,ASLR和32對64位進程將改變該內存布局。 額外分配的地址空間不太可能是連續的,因此您不能只是按順序讀取內存。

這是一個高級主題。 最后幾乎總有一種更好的方法(適當的API,利用SendMessage來請求控件的內容......),而不是直接讀取進程內存(記住對一個DLL的一個小改動 - 例如來自安全補丁 - 將轉移事物)。

總結:找到另一種更好的方法。

編輯:了解Windows中內存的一些資源:

  1. Mark Russinovich(第1部分,共2部分)揭示了記憶管理的奧秘
  2. Mark Russinovich(第2部分,共2部分)揭示了記憶管理的奧秘

    兩部分的討論(第1部分:虛擬內存,第2部分:物理),它還將介紹一些非常有用的工具,用於查看內存及其組織方式。

  3. 閱讀Windows Internals ,Mark Russinovich等。 (並非所有都是相關的,但您還需要了解Win32中的安全性)。

  4. 閱讀高級Windows ,Jeffrey Richter。 我認為這已經絕版(我的第3版涵蓋了Win95 / NT4),但是對於讀取進程內存和解釋結果需要了解的信息是唯一的重要內容。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM