IRP拦截的三种方式、键盘IRP拦截
IRP基本数据结构: IRP是由I/O管理器发出的,I/O管理器是用户态与内核态之间的桥梁,当用户态进程发出I/O请求时,I/O管理器就捕获这些请求,将其转换为IRP请求,发送给驱动程序。I/O管理器负责所有I/O请求的调度和管理工作,根据请求内容的不同,选择相应的驱动程序对象,设备对象,并生成、发送、释放各种不同的IRP。整个I/O处理流程是在它的指挥下完成的。 一个IRP是从非分页内存中分配的 […]
IRP基本数据结构: IRP是由I/O管理器发出的,I/O管理器是用户态与内核态之间的桥梁,当用户态进程发出I/O请求时,I/O管理器就捕获这些请求,将其转换为IRP请求,发送给驱动程序。I/O管理器负责所有I/O请求的调度和管理工作,根据请求内容的不同,选择相应的驱动程序对象,设备对象,并生成、发送、释放各种不同的IRP。整个I/O处理流程是在它的指挥下完成的。 一个IRP是从非分页内存中分配的 […]
在IDT,Interrupt Descriptor Table,中断描述符表中详述了IDT的概念以及三种不同的描述符,现在用代码来实现Hook 所有IDT,代码出自combojiang大牛的文章http://bbs.pediy.com/showthread.php?t=59867。 思路是这样的: 通过修改ISR的入口地址跳转到自己写的汇编代码,然后保存当前堆栈环境,再跳转到自己的处理函数,进行完 […]
IDT,Interrupt Descriptor Table,中断描述符表是CPU用来处理中断和程序异常的。 CPU用8位的中断类型码通过中断向量表找到相应的中断处理程序的入口地址。那么什么是中断向量表呢?中断向量表就是中断向量的列表。那么什么又是中断向量呢?所谓中断向量,就是中断处理程序的入口地址。展开来讲,中断向量表,就是中断处理程序入口地址的列表。 中断向量在内存中保存,其中存放着256个中 […]
这是堕落天才原创的一种方法,其实就是改变sysenter地址里面代码的执行顺序,可以说就是inline hook。 在普通sysenter hook讲到一般的拦截方法就是通过rdmsr wrmsr两个指令把原来的sysenter地址改成自己的sysenter地址,然后再跳回原来的sysenter地址。但是,这种方法虽然使用简单,但是检测也简单。 一般的rootkit检测工具检测函数in […]
阅读WRK 源代码时,我们会频繁地看到许多有关当前线程或进程的基本操作。内核层函数KeGetCurrentThread 是一个重要的函数,它返回当前处理器上正在运行的线程的KTHREAD 结构指针。通过此结构信息,可以进一步得到KPROCESS、ETHREAD 和EPROCESS 结构。在WRK 中,KeGetCurrentThread 是这样实现的: FORCEINLINE   […]
在从用户模式切换到内核模式的完整过程分析有讲到在用户态的代码执行了SYSENTER指令之后,处理器中的控制单元将寄存器MSR_IA32_SYSENTER_EIP的值装载到指令指针寄存器eip中。 从wrk中可以看到对它的初始化 VOIDKiLoadFastSyscallMachineSpecificRegisters( IN PLONG Context  […]
Object Hook简单的来说就是Hook对象,这里拿看雪上的一个例子,因为是在win7 32位上的,有些地方做了些修改。 _OBJECT_HEADER: kd> dt _OBJECT_HEADERnt!_OBJECT_HEADER +0x000 PointerCount : Int4B +0x […]
在暴力搜索内存进程对象反隐藏进程这篇文章中,我们提到: Object Header偏移0×008处Type成员为对象类型值,相同类型的对象具有相同的值. 自Window 7开始, _OBJECT_HEADER及其之前的一些结构发生了变化. lkd> dt _object_header nt!_OBJECT_HEADER +0×000 PointerCoun […]
Inline hook通俗的说就是对函数执行流程进行修改,达到控制函数过滤操作的目的。理论上我们可以在函数任何地方把原来指令替换成我们的跳转指令,也确实有些人在inline的时候做的很深,来躲避inline 的检测,前提是必须对函数的流程和指令非常熟悉,且这种深层次的inlline 不具有通用性,稳定性也是问题。 Inline hook原理:解析函数开头的几条指令,把他们Copy到数组保存起来,然 […]
在TerminateProcess流程追踪、PspTerminateThreadByPointer的实现中讲到,进程的终止,最终都是通过PspTerminateThreadByPointer终止线程来实现的。而PspTerminateThreadByPointer不管是通过终止本身,还是通过插APC最终都是调用PspExitThread来完成终止过程。 那来分析下PspExitThread的执行流 […]