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