-
-
[求助]ZwQueryKey通过KEY句柄获取项名的一点疑问
-
发表于:
2011-10-26 09:30
7263
-
[求助]ZwQueryKey通过KEY句柄获取项名的一点疑问
不知道发这里合适不。。。但我还是很想请教这板块的高手啊。。
前段时间学习写了一个REG防护程序,其实就是一个R3的HOOK
我选择HOOK的是ZwSetValueKey
但是程序调用RegSetValueEx时,第一个参数是一个已经打开的句柄
,第二参数是要设置值的名字,而这个句柄通过RegOpenKey,RegCreateKeyEx等指定了标准项和要打开的项名获得,也就是说,通过ZwSetValueKey参数的截取,我无法知道程序修改的具体是哪个是项,只知道句柄,要设置值的名字,和值……
后来百度翻到一个别人的源码,他可以通过ZwQueryKey 在只有句柄的情况下获得项名的
然后用OD简单看了下搬到了自己的程序中
invoke ZwQueryKey,handle,3,eax,255,eax ;调用ZwQueryKey 3号功能返回KEY项名,参数1为句 柄参数2为功能号 参数3为返回项名的地址 参数4 为最大字节 参数5为实际返回的字节
下面就是我想请教各位的问题了,上面参数 2 那个3号功能,哪里能查到其他功能号的作用呢? MSDN? 我好象没看见。
还有就是上面的参数 3 他返回的是一个结构,结构里的其中一个参数就是宽字符显示的项名,但是,这个返回地址必须是在EXE模块里的地址,不然返回一个错误,忘了说了,我是用DLL注入的方式HOOK的,当程序转到我的函数运行时,通过传来的句柄然后调用ZwQueryKey获取项名的,起初,那个返回地址我是放在DLL里的,结果不行,而单独写一个测试用的程序来却能获取到,凭着两个调用只有地址的不一样的感觉,我在DLL里,就用VirtualAlloc分配一个地址作为返回地址,这个地址在EXE模块内,结果成功返回,这是为什么?。 和权限有关系? 还是说和句柄存储的结构有关系? 还望指点迷津
附一个例子:
比如在一个已经注入DLL的程序中,有以下片段
PUSH 10000030 ;实际返回的字节数 此地址在DLL模块内
PUSH 255 ;最大字节数
PUSH 10000040 ;返回结构的地址 此地址在DLL模块内
PUSH 3 ;3号功能
PUSH [EBP+24] ;句柄
CALL ZwQueryKey
如此调用后返回一个C0000005还是80000002给EXE我忘了。。
但是
PUSH 00408000 ;实际返回的字节数 此地址在EXE模块内
PUSH 255 ;最大字节数
PUSH 00408004 ;返回结构的地址 此地址在EXE模块内
PUSH 3 ;3号功能
PUSH [EBP+24] ;句柄
CALL ZwQueryKey
这样就成功。。
[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法