今天看核心编程,看到他说的伪句柄,着实有些迷糊,上网上查查,也说的是云里雾里的,所以我就去看看 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;
网址:http://blog.csdn.net/ouyang2008/archive/2006/08/02/1009760.aspx