CPU控制块结构,每一个逻辑核都有一个KPCR结构描述当前CPU的各种信息。全局变量“KeNumberProcessors”中保存了当前机器的CPU核数。在系统调用章节我们初步了解了KPCR的部分成员。KPCR结构成员列表:CPU控制块扩展块。全局变量“KiProcessorBlock”中保存了KPRCB的地址。KPRCB结构成员列表:其余字段在后续分析内核代码时再了解。在3环下,每个进程都有一个PEB结构用来描述这个进程的一些信息。这些信息仅是为了3环更好的操作进程。而在0环,每个进程又有一个结构体用于描述该进程的所有信息:EPROCESS。结构体成员列表:+0 Pcb:Kprocess结构体。参考下文。+98 ProcessLock:进程锁。修改EPROCESS结构存放锁结构,防止同时修改。改完了置0.+A0 CreateTime:进程的创建时间。+A8 ExitTime:进程的退出时间。+B0 RundownProtect:进程锁。该字段置值后,进程无法被访问、打开、结束,相当于保护。但是会容易卡死。+B4 UniqueProcessId:进程ID。任务管理器中显示的进程ID就是这个。+B8 ActiveProcessLinks:双向链表。包括了windows中所有活动的进程。全局变量“PsActiveProcessHead”指向了这个链表的头部。通过该全局变量可以遍历整条链表。+C0 ProcessQuotaUsage:进程物理页相关统计信息。+C8 ProcessQuotaPeak:进程物理页相关统计信息。+D0 CommitCharge:进程虚拟内存相关统计信息。+D4 QuotaBlock:进程虚拟内存相关统计信息。+D8 CpuQuotaBlock:进程虚拟内存相关统计信息。+E4 SessionProcessLinks:会话进程链表。保存了当前登录的用户的所有进程。+EC DebugPort:调试相关。如果该进程处于调试状态,这里会有值(一个结构体),该结构体用于进程与调试器之间通信。通过循环清0可以达到反调试效果。+F0 ExceptionPortData:调试相关。+F4 ObjectTable:进程的句柄表。句柄相关章节再学。+F8 Token:进程Token。+FC WorkingSetPage:表明当前进程用了多少个物理页。+16C ImageFileName:当前进程的进程名。+188 ThreadListHead:当前进程内所有线程的链表。+198 ActiveThreads:当前进程内活动的线程数量。+1A8 Peb。就是3环下该进程的PEB。(PEB结构此处不赘述了,网上有非常多的PEB结构说明。)+1EC SeAuditProcessCreationInfo:当前进程完整路径。+26C Flags2:一个联合体,每个位影响该进程的一些属性。ProtectedProcess:进程保护位。该位置1后该进程被保护。CE看不到图片,打不开了进程。OD附加进程列表遍历不到。一个最简单的进程保护。+270 Flags:一个联合体,每个位影响该进程的一些属性。ProcessExiting:进程退出标志位。置1后表明该进程已退出,但实际还在运行。可以达到反调试的效果。同时进程无法使用任务管理器结束。ProcessDelete:进程退出标志位。置1后表明该进程已退出,但实际还在运行。可以达到反调试的效果。同时进程无法使用任务管理器结束。BreakOnTermination:该位置1后,任务管理器结束进程时将提示“是否结束系统进程XXX”。结束后windbg将会断下。VmTopDown:该位置1时,VirtualAlloc一类的申请内存函数将会从大地址开始申请。ProcessInserted:该位置0后,OD附加进程列表找不到该进程。任务管理器结束不掉该进程。CE打不开该进程,无图标。+274 ExitStatus:进程退出状态码。进程创建时默认值是250(0x103)。如果不是这个值基本上就是进程退出了。+278 VadRoot:标识当前进程用户空间(低2G)中哪些地址没被分配。该成员指向了一个二叉树。Eprocess第一个成员是一个Kprocess结构。Kprocess结构成员列表:+0 Header:可等待对象头部。所有0环结构体只要以_DISPATCHER_HEADER结构开头的,都可以使用WaitForSingleObject等待。如互斥体、事件。+10 ProfileListHead:性能分析相关,任务管理器,性能栏那些数据。+18 DirectoryTableBase:页目录表基址。物理地址,指向页目录表,CR3中的值就从这里获取。+2C ThreadListHead:当前进程的所有线程结构体链表。+38 Affinity:亲核性。规定了当前进程内的所有线程可以在哪些CPU上跑,4字节,共32位,每一位对应一个CPU核。如000000A1,转换为二进制为1010 0001,则该进程中的线程只能在0、5、7号CPU上运行。因此32位系统最多支持32核CPU,64位系统支持64核CPU。该值仅为线程结构中的亲核性做初始化赋值使用,没有实际的限制功能。如果只有1个CPU,但此处值为2(0010),则该进程为一个“死”了的进程。+44 ReadyListHead:当前进程内的就绪线程链表。+4C SwapListEntry:交换到文件磁盘上时使用该链表。记录了哪些内存被交换到文件里。+50 ActiveProcessors:当前进程内正在运行的线程运行在哪些CPU上。+5C AutoAlignment:强制内存对齐。一般为0。+5C DisableBoost:置1为关闭当前进程内所有线程的时间碎片。(置1后,不会由于时间中断触发线程切换)+60 BasePriority:基础优先级。该进程内所有线程最初的优先级。+61 QuantumReset:当前进程内线程的初始时间碎片。每一次时钟中断会将线程中的时间碎片减6,为0时,切换线程。线程从就绪变为运行时,会从这个值中取到初始的时间碎片。改大这个值会让该进程内的线程跑的更久。+78 ProcessListEntry:系统内所有进程的链表。win7及以上此处为空,已弃用。+80 CycleTime:当前进程执行了多少个指令周期。当进程结束时才会被赋值,指明了该进程存活了多久。+88 KernelTime:(统计信息)当前进程在0环的运行时间。当进程结束时才会被赋值,指明了该进程存活了多久。+8C UserTime:(统计信息)当前进程在3环的运行时间。当进程结束时才会被赋值,指明了该进程存活了多久。+90 VdmTrapcHandler:虚拟8086模式时使用。与进程一样, 3环下有TEB描述某个线程。在0环,也有一个ETHREAD描述某个线程的所有信息。ETHREAD结构成员列表:与进程一样,第一个成员为KTHREAD结构。KTHREAD结构成员列表:每一个内核对象都有一个OBJECT_HEADER结构,大小为0x18。将某个内核
...(已截断)
---
来源: 看雪论坛
原文链接: https://bbs.kanxue.com/thread-270660.htm
X86内核笔记_4_进程和线程
351 浏览
8 回复
Win7系统不存在PG??? 你确定???
fengyunabc
Win7系统不存在PG??? 你确定???
32位
Win7系统不存在PG??? 你确定???
32位
请问你是看的滴水的教程吗?
ezre
请问你是看的滴水的教程吗?
滴水+火哥
请问你是看的滴水的教程吗?
滴水+火哥
SSH山水画
滴水+火哥
大佬, 是滴水初级+火哥中级么
滴水+火哥
大佬, 是滴水初级+火哥中级么
好啊好啊,海哥子弟
这是火哥的盗版弟子
老师踩大便
这是火哥的盗版弟子[em_48]
什么意思
这是火哥的盗版弟子[em_48]
什么意思