Ring0的“消息”——IRP
IRP由IO管理器创建用来代表一个IO操作,它在ring0的地位类似消息于win32应用程序的意义,是信息交互的单位。IRP是学习Windows驱动开发的基础,这里介绍一下IRP的结构、请求方式以及IRP在分层驱动中的传递。
Ma' in wojel ba'ax ka lelo' u k'áat u ya'al
IRP由IO管理器创建用来代表一个IO操作,它在ring0的地位类似消息于win32应用程序的意义,是信息交互的单位。IRP是学习Windows驱动开发的基础,这里介绍一下IRP的结构、请求方式以及IRP在分层驱动中的传递。
上回提到过,用户模式Hook功能有限,而且容易被发现。到了ring0,Hook仍然是很多技术的基础。这里简单介绍几种常见的内核hook:SSDT Hook、IDT Hook、SYSENTER Hook、IAT Hook、导出表Hook、IRP Hook、Inline Hook和几种门的添加。这并不是很严格的分类方式,各种技术也可能会交叉灵活使用。
接着说内核Hook中的IAT Hook、导出表Hook、IRP Hook、Inline hook和几种门的添加。
内核模式的IAT Hook要比在ring3下实现方便很多,PsSetImageLoadNotifyRoutine注册一个回调函数,进程加载dll时会调用该函数。函数原型如下:
写了几个简单程序,用于实现用户模式IAT Hook和dll注入,方便初学者学习。学东西的时候没有代码简直痛苦,看半天感觉无从下手,希望能帮助到大家。
Intel x86通过环实现访问控制,ring0~ring3四个级别,不同特权的程序运行在不同的环,高环程序不能访问低环数据,强行访问可能产生中断;同样,有些指令只能在特定环执行,如cli、sti、in、out只能运行在ring0。这是在硬件层面的权限控制,但是Windows直到NT系列内核才真正将CPU环机制利用起来,为了兼容,只使用ring0和ring3,内核模式在ring0,用户模式在ring3。操作系统以Intel X86环机制为基础,实现自己的访问控制,只允许某些特定ring3代码访问ring0。
对Windows系统结构做个总结,主要写整体结构,并不涉及各个组件的具体实现和其他细节。
Windows可以分为用户模式和内核模式。
用户模式主要包括四个部分:系统进程、服务进程、用户应用程序和环境子系统。系统进程包括登录进程、会话管理器等;服务进程为Windows服务提供寄宿;用户应用程序是最常见的进程,通过调用环境子系统提供的子系统dll间接调用内部函数;环境子系统实现操作系统对外接口等。
现在的操作系统大多使用分页机制和分段机制实现虚拟内存管理。具体来说分段机制实现了段地址到线性地址的转换,而分页机制则实现了线性地址到物理地址的转换。
Windows xp平台的虚拟地址就是线性地址,可以自己去看看GDT中第CS项的段描述符的基地址,是0。本文通过逆向MmGetPhysicalAddress来学习Windows和X86的分页机制,平台是windows xp sp2,使用windbg。
Access Control Module,访问控制模型。是Windows用来约束线程对安全对象访问的控制模型。可以分为两部分,线程的访问令牌access token和安全对象的安全描述符security descriptor。