转载自:http://hi.baidu.com/resoft007/item/eb510a0d0ae2ac03addc7019

http://bbs.pediy.com/showthread.php?t=106888

http://bbs.pediy.com/showthread.php?t=55142

解惑:http://blog.csdn.net/u012410612/article/details/17093079

lkd> u ZwOpenProcess
nt!ZwOpenProcess:
804de044 b87a000000      mov     eax,7Ah
804de049 8d542404        lea     edx,[esp+4]
804de04d 9c              pushfd
804de04e 6a08            push    8
804de050 e8dc150000      call    nt!KiSystemService (804df631)
804de055 c21000          ret     10h
lkd> u NtOpenProcess
nt!NtOpenProcess:
80573d06 68c4000000      push    0C4h
80573d0b 6810b44e80      push    offset nt!ObWatchHandles+0x25c (804eb410)
80573d10 e826f7f6ff      call    nt!_SEH_prolog (804e343b)
80573d15 33f6            xor     esi,esi
80573d17 8975d4          mov     dword ptr [ebp-2Ch],esi
80573d1a 33c0            xor     eax,eax
80573d1c 8d7dd8          lea     edi,[ebp-28h]
80573d1f ab              stos    dword ptr es:[edi]

这是看雪上某人反的两个函数。

用户模式调用Nt和Zw API,如NtReadFile和ZwReadFile,二者没有任何区别,通过设置系统服务表中的索引和在堆栈中设置参数,经由SYSENTER指令进入内核态(而不是象w2k中通过int 0x2e中断),并最终由KiSystemService跳转到KiServiceTable对应的系统服务例程中。由于是从用户模式进入内核模式,因此代码会严格检查用户空间传入的参数。

内核模式调用Nt和Zw API,连接nooskrnl.lib:
Nt系列API将直接调用对应的函数代码,而Zw系列API则通过KiSystemService,最终跳转到对应的函数代码。

重要的是两种不同的调用对内核中previous mode的改变,如果是从用户模式调用Native API则previous mode是用户态,如果从内核模式调用Native API则previous mode是内核态。previous为用户态时Native API将对传递的参数进行严格的检查,而为内核态时则不会。
调用Nt API时不会改变previous mode的状态,调用Zw API时会将previous mode改为内核态,因此在进行Kernel Mode Driver开发时可以使用Zw系列API可以避免额外的参数列表检查,提高效率。(Zw*会设置KernelMode已避免检查,Nt*不会自动设置,如果是KernelMode当然没问题,如果就UserMode就挂了)

我们只要把kthread中的PreviousMode值设为0就代表来自内核态

Zw*系列是通过SSDT来间接调用,同时设置Ehread->previous mode 为 kernelmode

Nt*系列是直接调用函数,但是却不设置Ehread->previous mode

所以如果是在内核mode当然没问题,同时还可以跳过SSDT HOOK  ps:当然Inline Hook肯定不行

但是内核组件可能运行在任意进程的上下文中 所以Nt*可能在usermode中,这是就会STATUS_ACCESS_VIOLATION 了

当然这是Nt*函数中检查当前线程结构的PreviousMode 来确定调用是来自用户态还是内核态 如果是来自用户态 函数会检测参数地址是否小于_MmUserProbeAddress.如果不是 将会产生一个错误..   所以我们的目标就是把PreviousMode改为Kernel Mode  这就是Zw*和Nt*的区别

内核解惑:zw函数和nt函数的区别相关推荐

  1. zw函数和nt函数的区别

    内核解惑:zw函数和nt函数的区别 lkd> u ZwOpenProcess nt!ZwOpenProcess: 804de044 b87a000000 mov eax,7Ah 804de049 ...

  2. Zw函数与Nt函数的分别与联系

    in ring3: lkd> ? ntdll!ZwOpenProcess Evaluate expression: 2089999739 = 7c92dd7b lkd> ?ntdll!Nt ...

  3. c语言中ntdll.dll,在Win32环境中从ntdll.dll调用Nt函数,C

    我想从ntdll.dll调用一些Nt函数,我就是这样做的. 对于调用:NtTestAlert(),您需要典型的ntcall内核例程,可通过int 2Eh访问. (从这里我得到Nt功能http://un ...

  4. 一种注册表沙箱的思路、实现——Hook Nt函数

    Nt函数是在Ring3层最底层的函数了,选择此类函数进行Hook,是为了提高绕过门槛.我的Hook方案使用的是微软的Detours.(转载请指明出处) Detours的Hook和反Hook的写入如下: ...

  5. 线程同步——内核对象实现线程同步——等待函数

    1 对于内核对象实现线程同步,不得不提三点: 2 1)大多数内核对象既有触发也有未触发两个状态 3 比如:进程.线程.作业.文件流.事件.可等待的计时器.信号量.互斥量 4 2)等待函数:等待函数使线 ...

  6. linux内核网络协议栈--发送流程及函数(十)

    本章会一步一步的分析,在linux内核中,数据是如何从网络中接收并最后到达应用程序的. 用户数据的发送流程如下图所示,不管是tfp,telnet,http都是类似的.当然我们在使用应用的时候,根本不会 ...

  7. linux内核网络协议栈--接收流程及函数(九)

    本章来看下,数据是如何从网络中接收并最后到达应用程序的. 网络层将数据链路层提供的帧组成数据包,包中封装有网络层包头,其中含有逻辑地址信息. 1.链路层 包到达机器的物理网卡时候触发一个中断,并将通过 ...

  8. 0.11内核rd_load@ramdisk.c中memcpy函数好像有bug

    0.11内核rd_load@ramdisk.c中memcpy函数好像有bug,如: #define memcpy(dst,src,n) \     __asm__("cld;rep;movs ...

  9. 解读鸿蒙轻内核的监控器:异常钩子函数

    摘要:本篇先介绍下支持的异常钩子函数的类型,异常钩子函数的注册.执行等内部操作API接口,并介绍下使用异常钩子函数的操作接口. 本文分享自华为云社区<鸿蒙轻内核M核源码分析系列十七(1) 异常钩 ...

最新文章

  1. STL (13) 非变动型算法
  2. php heahd,heaheader phpder 详解
  3. jquery获取select选中的值
  4. css字体的字型,CSS的字体、字型控制_css
  5. shp系列(一)——利用C++进行shp文件的读(打开)与写(创建)开言
  6. inet_ntop函数和inet_pton函数
  7. 电脑配置清单_2020电脑配置清单AMD指南
  8. 在 Windows 服务中托管 ASP.NET Core
  9. 韩信大招:一致性哈希
  10. OWASP-ZAP扫描器的使用(攻击)
  11. hbase 协处理器 部署_hbase协处理器概念及知识点总结
  12. 今天,Google 在中国终于光明正大地搞 AI 了!
  13. 寒冬之下,被cai的那些人到底去哪了?
  14. 将python打包成.so文件
  15. S71200PLC程序博图V14 西门子博图编写
  16. 网络工程师考试知识点总结
  17. 334个地级市名单_2016年最新中国地级市名单
  18. java layout各布局_java-Layout(布局管理器)
  19. 系统发育树构建算法和软件
  20. 假币问题详解(枚举的经典例题)

热门文章

  1. ubuntu rust_如何在Ubuntu Linux上安装Rust
  2. 如何打造一款好的社区产品
  3. Visual Studio调试器指南---自动启动调试器
  4. 自动化测试框架的完整指南【译】
  5. 百度云下载速度慢解决方案(仅供参考,大神请指导)
  6. 银行信贷管理系统质押信息子模块
  7. 字符编码--第3章 字符的存储--ASCII(1967年)
  8. xp系统 标题栏都是乱码,“口口口口”
  9. 大BOSS随时都会到来
  10. node的process