搬一次家:
今天看核心編程,看到他說的偽句柄,著實有些迷糊,上網上查查,也說的是云里霧里的,所以我就去看看
MICROSOFT的MSDN,他們也是遮遮掩掩的,沒有辦法我就只有靠一些調試工具來解決了。
從MSDN上,我們知道象GETCURRENTPROCESS,GETCURRENTTHREAD都是在KERNEL32中,所以我用了
OLLYDBG加載了這DLL文件,從中我們可以執行單個文件,恩,返回值和應用程序中返回的一致,象這種情況,
如果我想的不錯的話,由于他在脫離進程的情況下也能返回正確的值,那他返回的基本上是立即數(呵呵,我可
不敢絕對話,模糊也是一種美,吐一個)。
現在我們可以證實我們的想法,這樣很簡單,應用OLLYDBG給我們提供的功能,直接跳到函數的首地址,可以看
到GETCURRENTPROCESS的代碼是
OR EAX,0XFFFFFFFF
C3
呵呵,這個我想大家都能看懂,我們的偽進程句柄獻身,數值為-1
那么GETCURRENTTHREAD的代碼也沒有出什么意料之外的情況:
PUSH -2
POP EAX
C3
恩,不錯,是這樣的,我們的EAX里是0XFFFFFFFE
所以偽句柄就是一個特定的 數值,對于不同的內核對象,是強行規定的,沒有什么可探討的,可探討之處在于
MICROSOFT為什么這樣處理,對性能來說這沒有什么可挑剔的(哈哈)。
其實真正的目的可能是(沒有辦法,MICRO總是不愿出來澄清一些東西,我也不敢MAKE SURE):
在本身進程和線程中,對句柄沒有必要進行權限的限制,而在把句柄交由別的進程或別的線程操作時可能就不怎
么放心,一般要加上權限限制,這樣就可以減少意外情況的發生。
至于偽句柄和真實句柄之間的轉換和權限限制,可以參考DUMPLICATEHANDLE,如果你對以上說明感到懷疑,可
以直接用進程和線程的數值代替看看結果。
注意HANDLE的定義:
typedef void * HANDLE;
HANDLE hproc=0xFFFFFFFF;
HANDLE hthre=0xFFFFFFFE;