我想知道是否可以阻止程式 A 讀取我的整個內存,因為它不需要監視程式 B 正在做什麼。
我也在 Windows 8.1 64 位元上。
答案1
Windows 中執行的程式無法直接定址 RAM。他們訪問虛擬地址。要存取 RAM,您需要藉助為此目的編寫的核心模式驅動程式。 (Mark Russinovich 的一些「sysinternals 工具」就是這樣做的:它們安裝一個打包為 .exe 中的資源的驅動程式。)
就一個程式存取另一個程式而言,Windows 中的每個行程都已經擁有自己的虛擬位址空間,與所有其他行程分開且不相交。即一個程式的 0x10000 與其他程式的 0x10000 完全不同。無論您嘗試查看哪個位址,您始終都會查看該位址的您自己的進程實例。
然而:ReadProcessMemory 和 WriteProcessMemory API 確實允許程式進行跨進程存取(就虛擬位址而言)。若要使用它們,執行「存取」的程序必須開啟另一個具有 PROCESS_VM_READ 或 PROCESS_VM_WRITE 權限的程序。在使用者會話中執行的進程通常能夠相互執行此操作(也就是說,大多數進程上的安全描述符確實允許進程的創建者執行此操作...即您)。
然而,一個程式無法知道另一進程中感興趣的內容在哪裡。尋找任何有趣的東西將是一個漫長而疲憊的過程。絕大多數嘗試都會導致「位址未定義」區域,特別是在 64 位元系統上,尤其是在 Windows 8.1 及更高版本中。即使在虛擬記憶體的定義區域內,程式也不會定期使用上下文資訊標記其記憶體區域,例如「銀行帳號在這裡:」後面跟著所述帳號。
您的任何進程都可以存取任何其他進程的「記憶體」(鬆散地解釋),這可能會被認為有點傲慢。但請記住,您在一個登入 ID 和授權下所做的一切都被視為由單一使用者完成。也就是說,無論如何,這都是您的所有數據。
坦白說,我更擔心磁碟上的資料。包含您的資料的所有檔案都是您在您的安全 ID 下建立的,因此在您的安全 ID 下執行的任何程式都可以存取它們。更糟的是,Windows 預設建立的所有檔案都具有授予「使用者」群組(基本上是每個人)的讀取存取權限。因此,在其他安全 ID 下運行的程式也可以讀取它們。由於檔案通常都有很好的命名,並放置在命名和組織良好的目錄中,因此找到像accounts.txt 這樣的「有趣」檔案並不那麼困難。 NTFS 檔案加密無助於防範在您自己的帳戶下執行的窺探程式。這比跨進程記憶體存取的暴露程度要大得多。