搬一次家:
今天看核心编程,看到他说的伪句柄,着实有些迷糊,上网上查查,也说的是云里雾里的,所以我就去看看
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;