Windows内核分析索引目录:https://www.cnblogs.com/onetrainee/p/11675224.html
进程的本质
1. 进程的本质
2. _EPROCESS的重要数据结构
3. 保护进程
4. _PEB+0x10 _RTL_USER_PROCESS_PARAMETERS
分析
5.几个比较重要的知识点:
1. 进程的本质
该结构有两种:微内核(KPROCESS)/执行体(EPROCESS)。
其中执行体包含着微内核这个结构(有过之前基础很好理解)。
2. _EPROCESS的重要数据结构
+0x000 Header 可等待对象
+0x018 DirectoryTable 页目录表基址(进程最重要的地址)
+0x038 KernelTime 该进程在零环运行的时间
+0x03c UserTime 该进程在三环用到的时间
+0x05c Affinity 规定进程里的线程可以在哪个CPU跑(详细细节查询)
+0x062 BasePriority 该进程中的所有线程中最起始的优先级
+0x078 CreateTime 当前进程的创建时间
+0x078 ExitTime 当前进程的退出时间
+0x084 UniqueProcessId 进程编号,进程管理器的编号
+0x088 ActiveProcessLink 当前系统活动进程的编号(进程管理器就是查找该链表)
+0x090 QuotaUsage / +0x09c QuotaPeak 物理页统计的相关信息
+0x0a8 CommitCharge / +0x0ac PeakVirtualSize / +0x0b0 VirtualSize 虚拟内存相关的统计信息
+0x11c VadRoot 标识0-2G哪些地址被占用了
+0x0bc DebugPort / +0x0c0ExceptionPort 调试相关
+0x0c4 ObjectTable 句柄表
+0x174 ImageFileName 进程镜像文件名(最多16个字节)
+0x1a0 ActiveThreads 活动线程的数量
+0x1b0 PEB 在三环描述了相关信息
3. 保护进程
CreateProcessA 其中存在一个参数 CREATE_PROTECTED_PROCESS,该参数保护进程。
比如在最新Win10操作系统,当你远线程注入计算机等系统进程时会失败,原因就是其开启了这个进程保护。
在内核层直接修改其进程的有关标志位即可解决。
4. _PEB+0x10 _RTL_USER_PROCESS_PARAMETERS
分析
其包含进程的各种信息,比如用户加载DLL的路径、用户启动参数、窗口标题等各种信息。
这里存在一种反调试,如果正常启动不会带参数,但如果OD启动,肯定会附带参数,我们可以通过检查这个参数来判断是否处于被调试状态。
5.几个比较重要的知识点:
1)_KPROCESS+0x174 进程名称
注意,其是UCHAR[16]直接是16个字节,而不是一个指向字符串的指针,因此我们在输出时直接 pEprocess+0x174即可,而不是 *(pEprocess+0x174),前期不注意很容易犯错。
// 遍历全部进程获取名称 VOID TraverseList() { PEPROCESS Process; ULONG pId = PsGetCurrentProcessId(); // 得到当前进程的id PsLookupProcessByProcessId(pId, &Process); // 获取EPROCESS结构体 PEPROCESS p = Process; do { DbgPrint("进程名:%s\r\n", (PUCHAR)p + 0x174); p = MACRO_GetNextProcess(p); } while (p != Process); }
2)_KPROCESS+0x88 双向链表
struct _LIST_ENTRY ActiveProcessLinks; //0x88
我们通过这条线路可以找到所有的驱动,当然,我们可以通过将这条链断开而达到驱动隐藏的效果,其效果如下
3)_KPROCESS+0xbc DebugPort清零反调试
之后的调试体系会讲到被调试进程通过DebugPort与调试器建立关系,简单的可以看一下这里《软件调试》。
我们可以通过编写驱动将该位清零,这样我们可以达到反调试目的,效果如下:
可以看到即使打开之后,也没有其信息,过一段时间就可以看到被调试程序并没有反应,询问是否继续调试。