Windows内核基础
参考:加密与解密(从文章题目应该可以看出来),逆向工程核心原理
我只写一些我觉得有用或者有趣的东西.
内核基础理论
权限级别:R0-3,Intel CPU的四个级别.原本是打算让R0运行内核,让R1,R2运行设备驱动的,结果Win和Linux都直接拿R0了.现在为了方便只有R0和R3,我估计就是内核态和用户态.
内核和用户通信:API底层的函数实际在ntdll.dll中,成为Native API,名字以Nt
(直接调用对应函数)或者Zw
(通过KiSystemService最终跳转到对应函数,而且会修改Previous Mode为内核态)开头,两个往往成对出现,实际上一样的.这些底层API再通过syscall到内核.
Native API会检查Previous Mode,如果会用户态会严格检查参数,如果是内核态就不会,所以Zw
API可以提高效率.
内核主要是由一堆驱动组成的
Windows内核部分会调用一些内核层的函数。这些函数都以固定的前缀开始,分别属于内核中不同的管理模块。通过这些前缀,根据函数名就可以大致知道这个函数所属的层次和模块了。这些主要的前缀如下:
- Ex:管理层。“Ex”是“Executive”的开头两个字母。
- Ke:核心层。“Ke”是“Kermel”的开头两个字母。
- HAL:硬件抽象层。“HAL”是“HardwareAbstractionLayer”的缩写。
- Ob:对象管理。“Ob”是“Obiect”的开头两个字母。
- MM:内存管理。“MM”是“MemoryManager”的缩写。
- Ps:进程(线程)管理。“Ps”表示“Process”
- Se:安全管理。“Se”是“Security”的开头两个字母。
- Io:IO管理。
- Fs:文件系统。“Fs”是“FileSystem”的缩写。
- Ce:文件缓存管理。“Ce”表示“Cache"。
- Cm:系统配置管理。“Cm”是“ConfigurationManager”的缩写。
- Pp:即插即用管理。“Pp”表示“PnP”。
- Rtl:运行时程序库。“Rtl”是“RuntimeLibrary”的缩写。
- Zw/Nt:对应于SSDT中的服务函数,例如与文件或者注册表相关的操作函数。
- Flt:Minifilter文件过滤驱动中调用的函数。
- Ndis:Ndis网络框架中调用的函数
与应用层函数不同的是,在调用内核函数的时候需要注意它的IRQL(InterruptRequestLevel 中断请求级别)要求。
重要内核数据结构
这里东西太多了,着重说明重要的.
TEB(Thread Environment Block 线程环境块)
NtCurrentTeb()
或者__readfsdword()
可获取teb位置,实际就是读取fs:[0]
,32位下fs只有16位,它持有SDT(段描述符)的索引,进而可以获得TEB的内存地址
第一个成员NT_TIB Tib
,异常处理用,详情看异常处理的文章.
一个公式 FS:0x18 = TEB.NtTib.Self = address of TIB = address of TEB = FS:0 7FFDF000
*FS:0是段内存的起始地址,FS寄存器指向(Indexing)一个段描述符,而该描述符又指向段内存的起始地址。
FS:[0x30]是PEB
PEB
PEB+0x2 = BeingDebugged 检测是否被调试 1为是,IsDebuggerPresent
就是这个返回这个值
PEB+0x8 = ImageBaseAddress 进程基址, GetModuleHandle
就是返回这个值
PEB+0xC = LDR, LDR从图中可以看出_LDR_DATA_TABLE_ENTRY
结构,存放着已加载模块链表,从上到下分别存放着不同顺序存储的:加载顺序,内存位置,初始化顺序
剩下的看结构体吧,可以通过这个获取到各个系统dll的基址
还有ProcessHeap与NtGlobalFlag,详情看反调试.
内核6的会话
WindowsOSKernel6(Vista、7、8等)开始采用一种新的“会话”(Session)管理机制.
简单地说,会话指的是登录后的用户环境。大部分OS允许多个用户同时登录,并为每个登录的用户提供独立的用户环境。以Windows操作系统为例,“切换用户”可以创建本地用户会话, “远程桌面连接”可以创建远程用户会话。
Windows7与WindowsXP有1个非常大的不同。两个操作系统中都登录了2个用户,但Windows7中共有3个会话(0、1、2),而WindowsXP中只有2个会话(0、1)。两者差别在于,第一个登录的用户的会话ID是不同的。WindoWsXP中,第一个登录系统的用户的会话ID为O;而WindoWs7中,第一个登录系统的用户的会话ID为1,非系统会话。这种细微的差别使在XP系统中可以使用的技术在Windows7中无法正常使用。