-
-
[求助]Zw*&&Nt*函数的区别,读undocumented window2k secrects的困惑
-
发表于:
2009-2-18 19:59
5440
-
[求助]Zw*&&Nt*函数的区别,读undocumented window2k secrects的困惑
我在读undocumented window2k secrects,其中有这样一段(p76中文版)
你可能会奇怪为什么表B-1(位于附录B中)分别为ntdll.dll和ntoskrnl.exe提供了两列,其名称分别为:ntdll.Nt*、ntdll.Zw*和ntoskrnl.Nt*、ntoskrnl.Zw*。原因是,这两个模块导出了两组相互关联的Native API符号。在表B-1(位于附录B中)的最左列给出了所有名字中包含Nt前缀的符号。另一个集合包含相似的名字,不过由Zw前缀代替了Nt。反编译ndll.dll可看出每对符号都指向相同的代码。这看起来似乎是浪费内存。然而,如果你反编译ntoskrnl.exe,你就会发现Nt*符号指向实际的代码而Zw*指向INT 2eh stubs(如示列2-1列出的)。这意味着Zw*函数集合将从用户模式转入内核模式,而Nt*符号直接指向的代码会在模式切换后被执行。
示例2-1:
NtDeviceIoControlFile:
mov eax, 38h
lea edx, [esp+4]
int 2Eh
ret 28h
我用uf查看了该nt和zw函数,发现差距很大。 为什么作者说是“你就会发现Nt*符号指向实际的代码而Zw*指向INT 2eh stubs(如示列2-1列出的)。这意味着Zw*函数集合将从用户模式转入内核模式,而Nt*符号直接指向的代码会在模式切换后被执行” ?
[培训]科锐逆向工程师培训第53期2025年7月8日开班!