天天看點

[原創/讨論][windows核心程式設計一外傳]關于通路虛拟位址0的方法。

接上一篇 windows 核心程式設計研究系列之一(改變程序 pte) 内容

上一篇觀賞位址 :

<a href="http://community.csdn.net/expert/topic/5124/5124747.xml?temp=.2832453">http://community.csdn.net/expert/topic/5124/5124747.xml?temp=.2832453</a>

當然系統保證不讓通路位址0出于一種保護的目的,是防止未初始化的指針讀取資料。我說的通路位址0隻是出于一種純實作的目的,也不提倡大家這樣做。說白了

隻是好玩罷了。

大家都知道在 windows 中讀取/寫入位址0的指令肯定會出錯:

// 寫 0 位址的内容

xor edx,edx

mov [edx],eax

這是為什麼呢?是不是windows在核心做了什麼判斷?其實這是愚蠢和低效的。

windows隻是借助于pm的一個自然屬性---頁表屬性,通過将0xc000_0000置null

來完成。

知道原了解決也就很簡單了,就是将0xc000_0000 賦予一個有效的頁表屬性,

通過觀察發現 0xc000_0040 是一個有效的值,我們隻需:

mov edx,0c0000040h

mov eax,[edx]

mov edx,0c0000000h

然後執行通路0位址的任何指令,就不會發生所謂的無效位址通路的問題了,

呵呵......希望有相同興趣的朋友來聊聊吧。 

繼續閱讀