Tesla.Angela 发表于 2012-5-29 12:42:37

[已解决]WIN64上内核挂钩Zw(Nt)CreateFile的怪现象

无论是SSDT HOOK ZwCreateFile,还是INLINE HOOK NtCreateFile,即使在代理函数里直接调用原函数并返回,都会出现问题。状况为:全部返回一样的失败值,前者貌似是“参数不正确”,后者貌似是“拒绝访问”。

但是INLINE HOOK IopCreateFile无此现象(我的WIN64AST里用的就是INLINE HOOK IopCreateFile实现禁止创建文件)。

有人可能认为是句柄的关系,但是HOOK同样需要句柄NtTerminateProcess就没有此现象。

大家说说是什么原因?

2012-05-31:
问题已由某高校研究生WatchSky解决,经WatchSky本人同意,附上无错代码。

watchsky 发表于 2012-5-29 14:18:33

函数地址不正确?被人hook过了?

Tesla.Angela 发表于 2012-5-29 21:06:49

watchsky 发表于 2012-5-29 14:18 static/image/common/back.gif
函数地址不正确?被人hook过了?

应该不是

watchsky 发表于 2012-5-30 14:26:01

ssdt HOOK有没有可能在GetOffsetAddress里或是其他什么地方,抹掉了参数信息?ZwCreateFile的参数比较多,另外换地址的时候改成原子操作能保险点

Tesla.Angela 发表于 2012-5-31 10:42:30

watchsky 发表于 2012-5-30 14:26 static/image/common/back.gif
ssdt HOOK有没有可能在GetOffsetAddress里或是其他什么地方,抹掉了参数信息?ZwCreateFile的参数比较多, ...

感觉更加不可能。

如果是这样的话,参数更加多的IopCreateFile为什么没事呢?

watchsky 发表于 2012-5-31 11:16:00

是ssdt表里函数地址的低四位,有人说这个是存放参数个数的,当然我没验证过

kk1025 发表于 2013-4-11 16:38:30

M。。真的來試看看

chess0726 发表于 2013-4-28 13:19:51

一直调试这个函数,郁闷,又是楼主这里发现他有问题的。纠结了很长的时间!!!

内联hook 跳到自己的函数之后,所有的操作都正常,然后,复位原来的函数时,第一条指令
fffff800`01b88400 4c8bdc          mov   r11,rsp
执行了就 跳到系统异常中断,然后,就蓝屏了。
求解决~

chess0726 发表于 2013-4-28 13:22:05

蓝屏代码是 0x000000fc

kk1025 发表于 2013-6-7 22:00:54

也是有同樣問題, 但權限不足。看不到

Tesla.Angela 发表于 2013-6-7 23:16:19

kk1025 发表于 2013-6-7 22:00 static/image/common/back.gif
也是有同樣問題, 但權限不足。看不到

你发一个原创技术贴就有权限了,懂?

kk1025 发表于 2013-6-8 11:02:29

Tesla.Angela 发表于 2013-6-7 23:16 static/image/common/back.gif
你发一个原创技术贴就有权限了,懂?

謝謝大大, 因為一直試不出來所以還沒法有所謂的原創

Tesla.Angela 发表于 2013-6-11 20:30:23

kk1025 发表于 2013-6-8 11:02 static/image/common/back.gif
謝謝大大, 因為一直試不出來所以還沒法有所謂的原創

任何类型的『技术原创帖』均可,不是非要WINDOWS底层相关的帖子。

kk1025 发表于 2013-6-18 22:43:53

Tesla.Angela 发表于 2013-6-7 23:16 static/image/common/back.gif
你发一个原创技术贴就有权限了,懂?

謝謝版大, 看到了,但有一個問題請教,要找NtCreateFile index ,為何是用ZwTerminateProcess+0x15, 那個0x15怎麼算來的呢~~

Tesla.Angela 发表于 2013-7-11 21:31:53

kk1025 发表于 2013-6-18 22:43 static/image/common/back.gif
謝謝版大, 看到了,但有一個問題請教,要找NtCreateFile index ,為何是用ZwTerminateProcess+0x15, 那個 ...

我电脑上的WINDBG坏了。。。

没记错的话,ntdll!ZwTerminateProcess+0x15正好是NtTerminateProcess的INDEX。

kk1025 发表于 2013-7-13 17:51:12

Tesla.Angela 发表于 2013-7-11 21:31 static/image/common/back.gif
我电脑上的WINDBG坏了。。。

没记错的话,ntdll!ZwTerminateProcess+0x15正好是NtTerminateProcess的IND ...

謝謝大大,再請教一下, 那為何是NtCreateFile = ntdll!ZwTerminateProcess+0x15

Tesla.Angela 发表于 2013-7-14 01:41:23

kk1025 发表于 2013-7-13 17:51 static/image/common/back.gif
謝謝大大,再請教一下, 那為何是NtCreateFile = ntdll!ZwTerminateProcess+0x15

昨天解释错了,应该是:
nt!NtTerminateProcess的INDEX=*(PULONG)((PUCHAR)nt!ZwTerminateProcess+0x15)。
至于为什么,看WINDBG。

kk1025 发表于 2013-7-14 21:57:13

Tesla.Angela 发表于 2013-7-14 01:41 static/image/common/back.gif
昨天解释错了,应该是:
nt!NtTerminateProcess的INDEX=*(PULONG)((PUCHAR)nt!ZwTerminateProcess+0x15) ...

感謝大大。這段我完全了解, 我唯一不了解的是
index = SYSCALL_INDEX(ZwTerminateProcess);//明明找出來的是NtTerminateProcess的index
NtCreateFile=(NTCREATEFILE)GetSSDTFuncCurAddr(index);//為何是把NtTerminateProcess的index當成NtCreateFile的index用

kk1025 发表于 2013-7-28 23:19:07

功力真的有差,原來是要這樣調整才行,
页: [1]
查看完整版本: [已解决]WIN64上内核挂钩Zw(Nt)CreateFile的怪现象