① 請問如何讀取系統內存中任意地址的數據,如0x100,用C語言實現。
首先要明確windows 的內存管理方式, (在 windows XP 非 3GB enabled)。 ring3程序也就是用戶空間的進程可以用的空間地址是 virtual address 0x00000000 - 0x7FFFFFFF ,注意virual address 呵呵,而 0x80000000 以後為內核使用 都是 virtual address啊。ring3 進程不能讀取 0x80000000 以後的地址。0x0000000 - 0x7FFFFFFF 也並不是都可以讀取的。這個空間中會根據系統需要由系統分配一定的 region 或一系列的 regions。只有位於這些 regions 的地址是可以被ring3 進程讀取的。所以比如任意地址 如 0x100 若這個地址不再任何一個 region 當中。就會出錯(指定地址無內存)。實際上即是說,系統沒有為 0x100 這個地址建立頁表映射,也就不可讀。 若你所說想要實現讀取內核地址空間,也只能讀取已經建立了頁表映射的地址。不然同樣要出錯。若想要判斷一個地址是否是有效的,如你所擔心的,用戶可能傳給你一個非法地址。可以用一些api 判斷合法性。如 VirtualQuery 更強大的還有VirtualQueryEx。 http://msdn.microsoft.com/en-us/library/aa366902(VS.85).aspx。 也可以用異常處理歷程。 try except (c++),c也有異常處理 不過不好用。