我正在做一个应用程序虚拟化项目。所以我挂钩应用程序在NT级别,并将注册表调用指向我的虚拟注册表。在运行任何应用程序时,如果我转到文件 - >打开..我的注册表调用很少,如下所示:
ZwOpenKey(registry key path)
- >它产生句柄ex:(0x04e8)ZwQueryKey(0x4ea,...)
Process Monitor表示打开和查询都在同一个密钥上执行。我自己测试并证实了同样的关键。
查询键也为querykey api生成了正确的结果。 这个2字节的差异不适用于所有打开和查询密钥的情况。
在调用0x4e8
之前,应用程序如何以及为何将句柄从0x4ea
更改为querykey
?
我还在open和querykey之间测试了ZWDuplicateObject
的调用,但是没有调用duplicateobject api。
有谁可以说这个句柄有何变化?
答案 0 :(得分:3)
内核不使用句柄的最低两位,因此应用程序可以自由地将它们设置为其他值和/或某些API将这些值用作附加标志,而不是使用额外的参数
0x4ea & 0xffc == 0x4e8 & 0xffc
Raymond Chen做a series讨论这些位的可能用途:
内核句柄总是四的倍数;最后两位可供应用程序使用。但是为什么应用程序还需要那些位呢?