欢迎来到天天文库
浏览记录
ID:48314968
大小:115.92 KB
页数:4页
时间:2020-01-13
《windows系统调用》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、Windows系统调用浅析默认分类2009-11-0517:39:15阅读390评论0 字号:大中小 订阅 网上关于Linux系统调用的资料很多了,介绍都很详细。而最近需要了解下Windows系统调用,发现Windows的系统调用机制比Linux的复杂很多,可能是初次接触比较陌生的缘故。我在此只是进行简单的分析,基本上都是查看别人的资料,再加上自己的理解。(说明:毛得操老师写的关于《Windows内核源码情景分析》是本很好的参考资料,建议大家有兴趣的看看) X86体系结构提供了4个特权级(ring0,1,2,3),Wi
2、ndows只使用了其中的2个特权级,分别是ring0(内核空间),ring3(用户空间)。在默认情况下,Windows将低2GB的地址空间。 与进程相关的结构主要包括进程块(EPROCESS)、进程环境块(PEB)、线程块(ETHREAD)、线程环境块(TEB),它们之间的关系如下图: (1) 进程块(EPROCESS):每个Windows进程通过进程块来描述,其中包含于进程相关的属性,同时还指向其他的数据结构。(2) 进程环境块(PEB):存放进程信息,每个进程都有自己的PEB信息。位于用户地址空间。在Win2000下,进程环
3、境块的地址对于每个进程来说是固定的,在0x7FFDF000处,这是用户地址空间,所以程序能够直接访问。准确的PEB地址应从系统的EPROCESS结构的0x1b0偏移处获得,但由于EPROCESS在系统地址空间,访问这个结构需要有ring0的权限。还可以通过TEB结构的偏移0x30处获得PEB的位置,FS段寄存器指向当前的TEB结构:moveax,fs:[0x30]movPEB,eax在用户态下WinDbg中可用命令$proc取得PEB地址。(3) 线程块(ETHREAD):Windows线程通过线程执行体来描述,除了TEB之外的结构都
4、位于内核地址空间。(4) 线程环境块(TEB):系统在此TEB中保存频繁使用的线程相关的数据。位于用户地址空间,在比PEB所在地址低的地方。进程中的每个线程都有自己的一个TEB。一个进程的所有TEB都以堆栈的方式,存放在从0x7FFDE000开始的线性内存中,每4KB为一个完整的TEB,不过该内存区域是向下扩展的。在用户模式下,当前线程的TEB位于独立的4KB段,可通过CPU的FS寄存器来访问该段,一般存储在[FS:0]。在用户态下WinDbg中可用命令$thread取得TEB地址。FS寄存器保存了TEB结构的指针,TEB结构如下:
5、位置长度描述FS:004当前结构化异常处理帧… FS:20h4进程IDFS:24h4线程ID… FS:30h4PEB的线性地址… 在Intelx86架构上的Windows系列,Windows2000通过执行int0x2e来激活系统调用;而Windows2003/XP通过执行sysenter(Intel)/syscall(AMD)指令来进行系统调用。Windows操作系统以动态链接库的方式导出大量API供应用程序调用,主要分为2类:(1) 运行在用户态,可供应用程序直接调用。(2) 运行在内核态,需要陷入(trap)才
6、能调用,称为NativeAPI,在ntoskrnl.exe中实现,通过ntdll.dll进行调用。 在进行系统调用之前,EAX中保存系统调用服务ID,而EDX中保存了调用参数的堆栈指针,然后引发INT2Eh中断。(1)Windows2000中的系统调用执行过程:ServiceId:请求的中断服务IDParameterTable:中断服务对应的参数ParamTableBytes:参数个数信息添加Hook的过程:先在系统中找到IDT,然后确定2Eh在IDT中的地址,最后将用户定义的函数地址去取代它。当用户态进程一旦调用系统服务就会触发Hook函
7、数。(2)WindowsXP中系统调用执行流程:其中rdmsr是获取IA_SYSENTER_EIP寄存器中的地址,即中断处理程序地址,不用进行上述查找过程。
此文档下载收益归作者所有