前言
对于每天都要在windows平台上进行逆向工程任务的我们而言,稍微了解一些系统底层的机制与实现原理,用这些背景知识来武装自己总是好的。
调试器,反汇编器,加包,解包器,虚拟机,等等,无一不是运行在windows系统上,
甚至对内核调试器如SoftICE,WinDbg等工具的使用,也要求了解一些系统的内幕。
最近抽空在阅读《深入解析windows操作系统第6版上册》这本书,因此将其中与软件逆向有关的重点总结出来,部分内容加上了个人的理解进行润色,并非断章取义,而是去芜存菁。
笔记会不定期更新,对于某些作者的观点,尝试加入自己的实验过程来验证。
********************************
在windows系统架构中,运行在用户模式下的进程有4种基本类型,各自有其私有的进程地址空间:
1。固定的(或者硬性指定的)“系统支持进程“,比如登录(logon)进程,会话管理器(session manager)进程,它们并不是windows服务,也就是说,它们不是由“服务控制管理器”
来启动的。登录进程名为winlogon.exe,即“windows登录应用程序”,由此可见它是运行在用户模式下。会话管理器进程名为smss.exe,所有用户模式进程在sysinternal的进程浏览器
中,其“private bytes”列都会显示出使用的字节数;相反,内核模式组件或服务,其private bytes列中没有数据;服务控制管理器也是用户模式进程之一,其进程名为services.exe
2。服务进程,服务进程宿纳的是各种windows服务,这些服务可以通过运行services.msc来查看。windows服务往往要求独立于用户登录而运行(在用户登录前,以及用户不登录时,都
必须运行)svchost.exe就是服务进程,运行在用户模式下
3。用户应用程序
4。环境子系统服务进程
注意,服务进程与用户应用程序,并不直接调用原生的windows操作系统服务,而是先调用一个或者多个子系统DLL(动态链接库)中的A函数,
由A调用ntdll.dll中的相应B函数,B再调用原生的windows操作系统服务,后者运行在内核模式。
由此可见,子系统DLL运行在用户模式,它扮演的角色即是,通过子系统DLL中一个已经文档化的windows API函数,最终调用原生的系统服务,这些服务通常是未文档化的。
(注意这里的系统服务与前面提到的windows服务是两个不同的事物)
补充说明,关于“子系统DLL的支持DLL”:ntdll.dll
ntdll.dll是一个特殊的系统支持库,主要被其它的子系统DLL使用。应用程序调用某个子系统DLL中的windows API 函数,后者再调用ntdll.dll中的相应函数,例如NtCreateFile,
NtSetEvent等。虽然这些以Nt开头的函数仍旧是运行在用户模式,但是这些函数内部的代码包含了与处理器体系结构相关的“处理器特权模式”切换指令,通过该指令可以切换到内核模式,
从而调用内核模式下的“系统服务分发(调度)器”。系统服务分发器在检查某些参数的合法性以后,再由它调用真正的内核模式系统服务,其中包括Ntoskrnl.exe内部的实际代码。
也就是说,从用户模式到内核模式的转换点位于ntdll.dll中的函数内部。
********************************