R3获取SSDT的原始地址及SDT、SST、KiServiceTbale的关系
在内核下SSDT地址,可能被ssdt hook或者是inline hook,如果我们的ssdt被别人hook了,怎么改会原来的ssdt地址呢?我们知道在内核文件中是保留了一份原始的ssdt表,所以我们只要通过解析内核文件获取到原始的ssdt地址即可。 首先我们得确认我们当前系统使用的内核文件是ntoskrnl.exe、ntkrnlmp.exe还是ntkrnlpa.exe?这个问题好解决,ZwQue […]
在内核下SSDT地址,可能被ssdt hook或者是inline hook,如果我们的ssdt被别人hook了,怎么改会原来的ssdt地址呢?我们知道在内核文件中是保留了一份原始的ssdt表,所以我们只要通过解析内核文件获取到原始的ssdt地址即可。 首先我们得确认我们当前系统使用的内核文件是ntoskrnl.exe、ntkrnlmp.exe还是ntkrnlpa.exe?这个问题好解决,ZwQue […]
有前面对SSDT的了解之后,如果还有不是很了解的同学,请参考SSDT详解及Win32 API到系统服务描述符表调用的完整过程。已经讲的很详细了。 一、SSDT HOOK原理 其实 SSDT Hook 的原理是很简单,从前篇的分析,我们可以知道在 SSDT 这个数组中呢,保存了系统服务的地址,比如对于 Ring0 下的 NtQuerySystemInformation 这个系统服务的地址,就保存在 […]
一、什么是SSDT? SSDT 的全称是 System Services Descriptor Table,系统服务描述符表。这个表就是一个把 Ring3 的 Win32 API 和 Ring0 的内核 API 联系起来。SSDT 并不仅仅只包含一个庞大的地址索引表,它还包含着一些其它有用的信息,诸如地址索引的基地址、服务函数个数等。通过修改此表的函数地址可以对常用Windows 函数及 API […]
Windows定义了两种访问模式:用户模式和内核模式。应用程序代码运行在用户模式下,操作系统代码运行在内核模式下。 内核模式对应处理器的最高权限级别。在内核模式下执行的代码可以访问所有资源并可以执行所有特权指令。用户模式具有较低的优先级,用户模式只能访问用户空间,且不能执行特权指令。 如果用户代码不慎访问了系统空间的数据或执行了特权指令将会导致保护性异常的发生。但是用户代码可以通过调用系统服务来间 […]
1.I/O定时器 I/O定时器是DDK提供的一种定时器,使用这种定时器时,每间隔1S钟系统会调用一次I/O定时器例程。 I/O定时器可以为间隔N秒做定时,但是如果要实现毫秒级别间隔,微妙级别间隔,就需要用到DPC定时器。 初始化定时器:IoInitializeTimer 开启I/O定时器:IoStartTimer 停止I/O定时器:IoStopTimer 示例代码: 123456789101112 […]
1.DeviceIoControl的同步和异步操作: IRP同步操作示意图 同步操作时,在DeviceIoControl的内部,会调用WaitForSingleObject函数去等待一个事件,这个事件知道IRP被结束时,才会被触发。DeviceIoControl会暂时进入睡眠状态,直到IRP被结束。而对于异步操作: IRP异步操作示意图 在异步操作的情况下,当DeviceIoCont […]
1.在支持多线程的操作系统下,有些函数会出现不可重入的现象。所谓“可重入”是指函数的执行结果不和执行顺序有关。反之如果执行结果和执行顺序有关,则称这个函数是“不可重入”的。 2.Windows将中断的概念进行了扩展,提出一个中断请求级(IRQL)的概念。其中规定了32个中断请求级别,分别是0~2级别为软件中断,3~31级为硬件中断,其中数字从0~31,优先级别逐次递增。 在内核模式下 […]
1.IRP的处理机制类似Windows应用程序中的 “消息处理”机制,驱动程序接受到不同的IRP后,会进入不同的派遣函数,在派遣函数中IRP得到处理。 IRP(输入输出请求包),它是输入输出相关的重要数据结构,上层应用程序与底层驱动程序通信时,应用程序会发出I/O请求。操作系统将I/O请求转化为相应的IRP数据,不同类型的IRP会根据类型传递到不同的派遣函数内。可以使用IRPTrace来跟踪IRP […]
1.PC上有三条总线,分别是数据总线、地址总线和控制总线。32位的CPU寻址能力为4GB(2^32)个字节。用户最多可以使用4GB的真实物理内存。PC中会拥有很多设备,其中很多设备提供了自己的设备内存。例如,显卡就会提供自己的显存。这部分内存会映射到PC的物理内存上,也就是读写这段物理地址,其实会读写设备的内存地址,而不会读写物理内存地址。 2.在CPU中有一个重要的寄 […]
1.驱动对象(DRIVER_OBJECT) typedef struct _DRIVER_OBJECT{ SHORT Type; SHORT Size; PDEVICE_OBJECT DeviceObject;   […]