Windows XP/2003 系统调用(一)

    今天在这里主要想了解一下Windows如何从ring3下的Win32 API转到ring0下的Kernel Routine。

以NtReadFile为例:

kd> u ntdll!NtReadFile (Win 2003 SP1)
ntdll!ZwReadFile:
7c821b78 b8bf000000      mov     eax,0BFh;(系统调用号)
7c821b7d ba0003fe7f      mov     edx,offset SharedUserData!SystemCallStub (7ffe0300)
7c821b82 ff12            call    dword ptr [edx]

 

可以看到NtReadFile被WinDBG自动转成了ZwReadFile,其实这两个函数都在ntdll中导出,实际指向的是同一个地址(7c821b78)。在kernel模式下对应的Routine也叫NtReadFile

kd> u nt!NtReadFile
nt!NtReadFile [e:/windowsresearchkernel-wrk/wrk-v1.2/base/ntos/io/iomgr/read.c @ 90]:
808e8552 6a58            push    58h
808e8554 68b8318080      push    offset nt!GUID_DOCK_INTERFACE+0x34c (808031b8)
808e8559 e852c9f8ff      call    nt!__SEH_prolog (80874eb0)
808e855e 33f6            xor     esi,esi
808e8560 8975e0          mov     dword ptr [ebp-20h],esi
808e8563 8975d0          mov     dword ptr [ebp-30h],esi
…………

 

但是kernel中也有一个叫ZwReadFile的函数
kd> u nt!ZwReadFile
nt!ZwReadFile [E:/WindowsResearchKernel-WRK/WRK-v1.2/base/ntos/ke/i386/sysstubs.asm @ 1644]:
8082cbd4 b8bf000000      mov     eax,0BFh;(系统调用号)
8082cbd9 8d542404        lea     edx,[esp+4]
8082cbdd 9c              pushfd
8082cbde 6a08            push    8
8082cbe0 e8a55b0500      call    nt!_KiSystemService (8088278a)
8082cbe5 c22400          ret     24h

这个函数其实是个stub,不做真正的事情,最终仍然要调用NtReadFile,所以内核中的NtReadFile才是真正干活的有用的函数!!

回到ntdll下的NtReadFile(ZwReadFile),0BFh是win 2003下的系统调用号(系统调用号其实就是一个索引,后面会讲到)。SharedUserData 是操作系统为每个进程提供的个共享数据结构,里面存放有很多重要的系统信息,如TickCount、系统时间、SystemRoot等……
其在DDK定义为:
#define KI

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值