Windows内核

类似于进程的创建过程:进程创建过程分析NtCreateProcess-NtCreateProcessEx-PspCreateProcess。 线程的创建是从NtCreateThread函数开始的。NtCreateThread所做的事很简单,首先,对于非内核模式传递过来的调用,检查参数是否可写。处理InitialTeb参数,将它放到局部变量CapturedInitialTeb中。这些操作都是在try […]

我们前面说过几种隐藏进程的方法: 遍历进程活动链表(ActiveProcessLinks) 遍历PspCidTable表检测隐藏进程 但还是不能防止别人通过各种方法来隐藏进程,所以下面来介绍一种通过暴力搜索内存枚举进程的方法。 一个进程要运行,必然会加载到内存中。基于这个事实,隐藏进程要在目标机运行,在内存中一定会存在对应的EPROCESS结构体。基于系统内存搜索的进程监测技术利用EPROCESS […]

一、PspCidTable概述 PspCidTable也是一个句柄表,其格式与普通的句柄表是完全一样的,但它与每个进程私有的句柄表有以下不同: 1.PspCidTable中存放的对象是系统中所有的进程线程对象,其索引就是PID和TID。 2.PspCidTable中存放的直接是对象体(EPROCESS和ETHREAD),而每个进程私有的句柄表则存放的是对象头(OBJECT_HEADER)。 3.P […]

前面我们在TerminateProcess流程追踪、PspTerminateThreadByPointer的实现这篇文章中讲到,TerminateProcess其实是通过遍历进程的线程链表,然后调PspTerminateThreadByPointer这个函数来结束进程的。 但是我们前面也说到可以hook NtTerminateProcess来实现进程防杀,如果我们直接使用PspTerminateT […]

1.EPROCESS结构体 EPROCESS块来表示。EPROCESS块中不仅包含了进程相关了很多信息,还有很多指向其他相关结构数据结构的指针。例如每一个进程里面都至少有一个ETHREAD块表示的线程。进程的名字,和在用户空间的PEB(进程环境)块等等。EPROCESS中除了PEB成员块在是用户空间,其他都是在系统空间中的。 2.查看EPROCESS结构 kd> dt_eprocessntd […]

TerminateProcess通过本机系统服务接口进入核心态,随后调用ntoskrnl的NtTerminateProcess。这部分细节我就不详述了,大家可以去看我写的《重要》从用户模式切换到内核模式的完整过程分析。 大概的流程是这样的: ①判断句柄是否为空 ②通过句柄得到进程对象 ③判断是否为临界进程 ④锁住进程 ⑤遍历进程的线程链表 ⑥调用PspTerminateThreadByPointe […]

前面我在《重要》从用户模式切换到内核模式的完整过程分析这篇文章中,已经把OpenProcess怎么从R3进入R0已经说的很详细了。 R3状态下调用OpenProcess,实际调用的是ntdll.dll中的ZwOpenProcess/NtOpenProcess。通过查看可以得知ntdll.dll中ZwOpenProcess/NtOpenProcess是对应同一个地址。通过sysenter进入R0.在 […]

我们知道ShadowSSDT的实现存在于win32k.sys中,所以我们只要分析win32k.sys文件就能获取原始的ShadowSSDT地址。 A primary default array table, KeServiceDescriptorTable, defines the core executive system services implemented in Ntosrknl.exe […]

一、获取ShadowSSDT 好吧,我们已经在R3获取SSDT的原始地址及SDT、SST、KiServiceTbale的关系里面提到:所有的SST都保存在系统服务描述表(SDT)中。系统中一共有两个SDT,一个是ServiceDescriptorTable,另一个是ServiceDescriptorTableShadow。ServiceDescriptor中只有指向KiServiceTable的S […]