Windows进程与线程学习笔记(一)—— 进程结构体

  • 进程结构体
    • EPROCESS
      • +0x000 Pcb : _KPROCESS
      • +0x1b0 Peb : Ptr32 _PEB
  • 练习
    • 解题步骤
      • 第一步:打开一个进程
      • 第二步:在任务管理器中找到相应进程
      • 第三步:在WinDbg中找到对应进程结构体
      • 第四步:断链
      • 第五步:再次查看任务管理器

进程结构体

EPROCESS

描述

  1. 每个windows进程在0环都有一个EPROCESS结构体
  2. 这个结构体包含了进程所有的重要信息

在WinDbg中查看

kd> dt _EPROCESS

ntdll!_EPROCESS+0x000 Pcb              : _KPROCESS+0x06c ProcessLock      : _EX_PUSH_LOCK+0x070 CreateTime       : _LARGE_INTEGER+0x078 ExitTime         : _LARGE_INTEGER+0x080 RundownProtect   : _EX_RUNDOWN_REF+0x084 UniqueProcessId  : Ptr32 Void+0x088 ActiveProcessLinks : _LIST_ENTRY+0x090 QuotaUsage       : [3] Uint4B+0x09c QuotaPeak        : [3] Uint4B+0x0a8 CommitCharge     : Uint4B+0x0ac PeakVirtualSize  : Uint4B+0x0b0 VirtualSize      : Uint4B+0x0b4 SessionProcessLinks : _LIST_ENTRY+0x0bc DebugPort        : Ptr32 Void+0x0c0 ExceptionPort    : Ptr32 Void+0x0c4 ObjectTable      : Ptr32 _HANDLE_TABLE+0x0c8 Token            : _EX_FAST_REF+0x0cc WorkingSetLock   : _FAST_MUTEX+0x0ec WorkingSetPage   : Uint4B+0x0f0 AddressCreationLock : _FAST_MUTEX+0x110 HyperSpaceLock   : Uint4B+0x114 ForkInProgress   : Ptr32 _ETHREAD+0x118 HardwareTrigger  : Uint4B+0x11c VadRoot          : Ptr32 Void+0x120 VadHint          : Ptr32 Void+0x124 CloneRoot        : Ptr32 Void+0x128 NumberOfPrivatePages : Uint4B+0x12c NumberOfLockedPages : Uint4B+0x130 Win32Process     : Ptr32 Void+0x134 Job              : Ptr32 _EJOB+0x138 SectionObject    : Ptr32 Void+0x13c SectionBaseAddress : Ptr32 Void+0x140 QuotaBlock       : Ptr32 _EPROCESS_QUOTA_BLOCK+0x144 WorkingSetWatch  : Ptr32 _PAGEFAULT_HISTORY+0x148 Win32WindowStation : Ptr32 Void+0x14c InheritedFromUniqueProcessId : Ptr32 Void+0x150 LdtInformation   : Ptr32 Void+0x154 VadFreeHint      : Ptr32 Void+0x158 VdmObjects       : Ptr32 Void+0x15c DeviceMap        : Ptr32 Void+0x160 PhysicalVadList  : _LIST_ENTRY+0x168 PageDirectoryPte : _HARDWARE_PTE_X86+0x168 Filler           : Uint8B+0x170 Session          : Ptr32 Void+0x174 ImageFileName    : [16] UChar+0x184 JobLinks         : _LIST_ENTRY+0x18c LockedPagesList  : Ptr32 Void+0x190 ThreadListHead   : _LIST_ENTRY+0x198 SecurityPort     : Ptr32 Void+0x19c PaeTop           : Ptr32 Void+0x1a0 ActiveThreads    : Uint4B+0x1a4 GrantedAccess    : Uint4B+0x1a8 DefaultHardErrorProcessing : Uint4B+0x1ac LastThreadExitStatus : Int4B+0x1b0 Peb              : Ptr32 _PEB+0x1b4 PrefetchTrace    : _EX_FAST_REF+0x1b8 ReadOperationCount : _LARGE_INTEGER+0x1c0 WriteOperationCount : _LARGE_INTEGER+0x1c8 OtherOperationCount : _LARGE_INTEGER+0x1d0 ReadTransferCount : _LARGE_INTEGER+0x1d8 WriteTransferCount : _LARGE_INTEGER+0x1e0 OtherTransferCount : _LARGE_INTEGER+0x1e8 CommitChargeLimit : Uint4B+0x1ec CommitChargePeak : Uint4B+0x1f0 AweInfo          : Ptr32 Void+0x1f4 SeAuditProcessCreationInfo : _SE_AUDIT_PROCESS_CREATION_INFO+0x1f8 Vm               : _MMSUPPORT+0x238 LastFaultCount   : Uint4B+0x23c ModifiedPageCount : Uint4B+0x240 NumberOfVads     : Uint4B+0x244 JobStatus        : Uint4B+0x248 Flags            : Uint4B+0x248 CreateReported   : Pos 0, 1 Bit+0x248 NoDebugInherit   : Pos 1, 1 Bit+0x248 ProcessExiting   : Pos 2, 1 Bit+0x248 ProcessDelete    : Pos 3, 1 Bit+0x248 Wow64SplitPages  : Pos 4, 1 Bit+0x248 VmDeleted        : Pos 5, 1 Bit+0x248 OutswapEnabled   : Pos 6, 1 Bit+0x248 Outswapped       : Pos 7, 1 Bit+0x248 ForkFailed       : Pos 8, 1 Bit+0x248 HasPhysicalVad   : Pos 9, 1 Bit+0x248 AddressSpaceInitialized : Pos 10, 2 Bits+0x248 SetTimerResolution : Pos 12, 1 Bit+0x248 BreakOnTermination : Pos 13, 1 Bit+0x248 SessionCreationUnderway : Pos 14, 1 Bit+0x248 WriteWatch       : Pos 15, 1 Bit+0x248 ProcessInSession : Pos 16, 1 Bit+0x248 OverrideAddressSpace : Pos 17, 1 Bit+0x248 HasAddressSpace  : Pos 18, 1 Bit+0x248 LaunchPrefetched : Pos 19, 1 Bit+0x248 InjectInpageErrors : Pos 20, 1 Bit+0x248 VmTopDown        : Pos 21, 1 Bit+0x248 Unused3          : Pos 22, 1 Bit+0x248 Unused4          : Pos 23, 1 Bit+0x248 VdmAllowed       : Pos 24, 1 Bit+0x248 Unused           : Pos 25, 5 Bits+0x248 Unused1          : Pos 30, 1 Bit+0x248 Unused2          : Pos 31, 1 Bit+0x24c ExitStatus       : Int4B+0x250 NextPageColor    : Uint2B+0x252 SubSystemMinorVersion : UChar+0x253 SubSystemMajorVersion : UChar+0x252 SubSystemVersion : Uint2B+0x254 PriorityClass    : UChar+0x255 WorkingSetAcquiredUnsafe : UChar+0x258 Cookie           : Uint4B

CreateTime:记录当前进程何时创建

ExitTime:记录当前进程何时退出

UniqueProcessId:存储进程PID

AtiveProcessLinks

  1. 双向链表:所有的活动进程都连接在一起,构成了一个链表
  2. PsActiveProcessHead指向全局链表头
  3. 第一个成员指向后一个进程结构体,第二个成员指向前一个进程结构体

    注意:指向的位置是进程结构体的AtiveProcessLinks成员,需要手动调整偏移

QuotaUsage&QuotaPeak物理页相关统计信息

CommitCharge/PeakVirtualSize/VirtualSize虚拟内存相关统计信息

VadRoot:标识0-2G哪些地址被占用了

DebugPort&ExceptionPort调试相关

ObjectTable

  1. 句柄表,记录了被使用句柄的地址
  2. 可以通过遍历句柄表查看哪些进程调用了某个句柄,从而达到反调试的目的

ImageFileName:进程镜像文件名,最多16个字节

ActiveThreads:活动线程的数量

Peb

  1. 全称:Process Environment Block(进程环境块)
  2. 进程在3环的一个结构体,里面包含了进程的模块列表、是否处于调试状态等信息
  3. 详情参考潘爱民老师《Windows内核原理与实现》第三章

+0x000 Pcb : _KPROCESS

描述EPROCESS结构体成员之一

结构体

Header

  1. 可等待对象,可以作为 WaitForSingleObject 等类似函数的参数
  2. 常用于Mutex互斥体Event事件

DirectoryTableBase

  1. 页目录表基址,一个进程结构体最重要的成员
  2. 控制了页目录表,就相当于控制了所有的物理页
  3. 它存储的值就是Cr3的值

KernelTime:进程在0环运行的时间

UserTime:进程在3环运行的时间

Affinity

  1. 规定进程里面的所有线程能在哪个CPU上跑,如果值为1,那这个进程的所以线程只能在0号CPU上跑(00000001)
  2. 如果值为3,那这个进程的所以线程能在0、1号CPU上跑(000000011)
  3. 如果值为4,那这个进程的所以线程能在2号CPU上跑(000000100)
  4. 如果值为5,那这个进程的所以线程能在0、2号CPU上跑(000000101)
  5. 4个字节共32位,所以最多32核;如果是Windows64位,最多64核
  6. 如果只有一个CPU 把这个设置为4,那么这个进程就死了

BasePriority:基础优先级或最低优先级,该进程中的所有线程最起码的优先级

+0x1b0 Peb : Ptr32 _PEB

描述

  1. EPROCESS结构体成员之一
  2. 全称:Process Environment Block(进程环境块)
  3. 进程在3环的一个结构体,里面包含了进程的模块列表、是否处于调试状态等信息
  4. 详情参考潘爱民老师《Windows内核原理与实现》第三章

在WinDbg中查看

kd>dt _PEB

ntdll!_PEB+0x000 InheritedAddressSpace : UChar+0x001 ReadImageFileExecOptions : UChar+0x002 BeingDebugged    : UChar+0x003 SpareBool        : UChar+0x004 Mutant           : Ptr32 Void+0x008 ImageBaseAddress : Ptr32 Void+0x00c Ldr              : Ptr32 _PEB_LDR_DATA+0x010 ProcessParameters : Ptr32 _RTL_USER_PROCESS_PARAMETERS+0x014 SubSystemData    : Ptr32 Void+0x018 ProcessHeap      : Ptr32 Void+0x01c FastPebLock      : Ptr32 _RTL_CRITICAL_SECTION+0x020 FastPebLockRoutine : Ptr32 Void+0x024 FastPebUnlockRoutine : Ptr32 Void+0x028 EnvironmentUpdateCount : Uint4B+0x02c KernelCallbackTable : Ptr32 Void+0x030 SystemReserved   : [1] Uint4B+0x034 AtlThunkSListPtr32 : Uint4B+0x038 FreeList         : Ptr32 _PEB_FREE_BLOCK+0x03c TlsExpansionCounter : Uint4B+0x040 TlsBitmap        : Ptr32 Void+0x044 TlsBitmapBits    : [2] Uint4B+0x04c ReadOnlySharedMemoryBase : Ptr32 Void+0x050 ReadOnlySharedMemoryHeap : Ptr32 Void+0x054 ReadOnlyStaticServerData : Ptr32 Ptr32 Void+0x058 AnsiCodePageData : Ptr32 Void+0x05c OemCodePageData  : Ptr32 Void+0x060 UnicodeCaseTableData : Ptr32 Void+0x064 NumberOfProcessors : Uint4B+0x068 NtGlobalFlag     : Uint4B+0x070 CriticalSectionTimeout : _LARGE_INTEGER+0x078 HeapSegmentReserve : Uint4B+0x07c HeapSegmentCommit : Uint4B+0x080 HeapDeCommitTotalFreeThreshold : Uint4B+0x084 HeapDeCommitFreeBlockThreshold : Uint4B+0x088 NumberOfHeaps    : Uint4B+0x08c MaximumNumberOfHeaps : Uint4B+0x090 ProcessHeaps     : Ptr32 Ptr32 Void+0x094 GdiSharedHandleTable : Ptr32 Void+0x098 ProcessStarterHelper : Ptr32 Void+0x09c GdiDCAttributeList : Uint4B+0x0a0 LoaderLock       : Ptr32 Void+0x0a4 OSMajorVersion   : Uint4B+0x0a8 OSMinorVersion   : Uint4B+0x0ac OSBuildNumber    : Uint2B+0x0ae OSCSDVersion     : Uint2B+0x0b0 OSPlatformId     : Uint4B+0x0b4 ImageSubsystem   : Uint4B+0x0b8 ImageSubsystemMajorVersion : Uint4B+0x0bc ImageSubsystemMinorVersion : Uint4B+0x0c0 ImageProcessAffinityMask : Uint4B+0x0c4 GdiHandleBuffer  : [34] Uint4B+0x14c PostProcessInitRoutine : Ptr32     void +0x150 TlsExpansionBitmap : Ptr32 Void+0x154 TlsExpansionBitmapBits : [32] Uint4B+0x1d4 SessionId        : Uint4B+0x1d8 AppCompatFlags   : _ULARGE_INTEGER+0x1e0 AppCompatFlagsUser : _ULARGE_INTEGER+0x1e8 pShimData        : Ptr32 Void+0x1ec AppCompatInfo    : Ptr32 Void+0x1f0 CSDVersion       : _UNICODE_STRING+0x1f8 ActivationContextData : Ptr32 Void+0x1fc ProcessAssemblyStorageMap : Ptr32 Void+0x200 SystemDefaultActivationContextData : Ptr32 Void+0x204 SystemAssemblyStorageMap : Ptr32 Void+0x208 MinimumStackCommit : Uint4B

BeingDebugged:若进程处于被调试状态,置1

Ldr_PEB_LDR_DATA结构体

在WinDbg中查看:

kd>dt _PEB_LDR_DATA

ntdll!_PEB_LDR_DATA+0x000 Length           : Uint4B+0x004 Initialized      : UChar+0x008 SsHandle         : Ptr32 Void+0x00c InLoadOrderModuleList               : _LIST_ENTRY   模块加载的顺序+0x014 InMemoryOrderModuleList          : _LIST_ENTRY   模块在内存中的顺序+0x01c InInitializationOrderModuleList    : _LIST_ENTRY   模块初始化的顺序: 断掉这三个链表可以达到模块隐藏的目的+0x024 EntryInProgress  : Ptr32 Void

练习

要求:对进程进行断链

解题步骤

第一步:打开一个进程

例:记事本(notepad.exe)

第二步:在任务管理器中找到相应进程

第三步:在WinDbg中找到对应进程结构体

注意:由于进程和任务管理器是最后打开的,因此极可能在链表最后一个位置,因此建议从后往前找

前一个 EPROCESS 地址:0x8619f0a8 - 0x88
后一个 EPROCESS 地址:0x860000a8 - 0x88

第四步:断链

将前一个节点->next值改为 0x860000a8

kd>ed 8619f0a8 860000a8

将后一个节点->pre值改为 0x8619f0a8

kd>ed 860000a8+4 8619f0a8

第五步:再次查看任务管理器

此时在任务管理器进程列表中已经找不到notepad.exe

Windows进程与线程学习笔记(一)—— 进程结构体相关推荐

  1. Windows进程与线程学习笔记(九)—— 线程优先级/进程挂靠/跨进程读写

    Windows进程与线程学习笔记(九)-- 线程优先级/进程挂靠/跨进程读写 要点回顾 线程优先级 调度链表 分析 KiFindReadyThread 分析 KiSwapThread 总结 进程挂靠 ...

  2. Windows进程与线程学习笔记(八)—— 线程切换与TSS/FS

    Windows进程与线程学习笔记(八)-- 线程切换与TSS/FS 要点回顾 线程切换与TSS 内核堆栈 调用API进0环 实验:分析SwapContext 线程切换与FS 段描述符结构 分析Swap ...

  3. Windows进程与线程学习笔记(七)—— 时间片管理

    Windows进程与线程学习笔记(七)-- 时间片管理 要点回顾 基本概念 CPU时间片 分析 KeUpdateRunTime 分析 KiDispatchInterrupt 备用线程 总结 要点回顾 ...

  4. Windows进程与线程学习笔记(六)—— 线程切换

    Windows进程与线程学习笔记(六)-- 线程切换 主动切换 分析KiSwapContext 分析SwapContext 分析KiSWapThread 总结 时钟中断切换 系统时钟 分析INT 0x ...

  5. Windows进程与线程学习笔记(五)—— 模拟线程切换

    Windows进程与线程学习笔记(五)-- 模拟线程切换 ThreadSwitch代码分析 ThreadSwitch.cpp ThreadCore.h ThreadCore.cpp 总结 Thread ...

  6. Windows进程与线程学习笔记(四)—— 等待链表调度链表

    Windows进程与线程学习笔记(四)-- 等待链表&调度链表 要点回顾 33个链表 等待链表 实验:分析等待链表中的线程所属的进程 第一步:查看所属线程结构体: 第二步:查看所属进程结构体 ...

  7. Windows进程与线程学习笔记(三)—— KPCR

    Windows进程与线程学习笔记(三)-- KPCR KPCR +0x000 NtTib : _NT_TIB +0x120 PrcbData : _KPRCB KPCR 描述:CPU控制区(Proce ...

  8. Windows进程与线程学习笔记(二)—— 线程结构体

    Windows进程与线程学习笔记(二)-- 线程结构体 线程结构体 ETHREAD +0x000 Tcb : _KTHREAD 练习 线程结构体 ETHREAD 描述: 每个windows线程在0环都 ...

  9. # 遍历结构体_C#学习笔记05--枚举/结构体

    一.枚举 当变量的取值范围是固定的几个, 例如性别--男,女; 英雄类型 -- 法师, 刺客.战士, 射手等等. 这时就可以使用枚举类型, 会更加简洁方便. 1.1.定义: 访问修饰符 enum 枚举 ...

最新文章

  1. python 信号捕获处理 异常终止
  2. Grails示例程序-导出Excel文档
  3. unicode 版本 delphi (如XE2)的 TBytes 转换为 AnsiString
  4. Rancher upgrade webhook之CI/CD
  5. Android NDK 内存泄露检测
  6. Python实训day10pm【os模块-处理Excel统计学生观看直播时长】
  7. c++ string 删除字符_算法笔记|(5)第二章C、C++的快速入门字符数组的存放方式string.h文件...
  8. C++之invalid initialization of non-const reference of type ‘int’ from an rvalue of type ‘int’
  9. 美国五家科技巨头十年并购616家小型公司,引发并购审查
  10. 排列组合在计算机科学的应用,数学在计算机科学的应用.doc
  11. 银行代码就是银行行号吗?
  12. 计算机网络攻防技术的分析与研究
  13. 网络安全等级测评师培训(初级)----2021.6.6
  14. QQ游戏大厅产品体验报告
  15. 99%的手机Root方法都在这里
  16. 估值调整 - 凸性调整
  17. 诠释绿色科技 Laedana荣获2022国际CMF设计奖
  18. 数据人之苦,你造吗?(转自知乎)
  19. 利用clipboardJs 点击按钮复制文本
  20. 【逗老师带你学IT】PRTG获取HUAWEI FusionServer iBMC传感器状态

热门文章

  1. AI:2020年6月22日北京智源大会演讲分享之《语音与自然语言处理》09:10-09:40 Christopher 教授《基于深度上下文词表征的语言结构的发现》
  2. 成功解决\PyInstaller\compat.py, line 378  out = out.decode(encoding) UnicodeDecodeError: utf-8 codec c
  3. ML之相似度计算:图像数据、字符串数据等计算相似度常用的十种方法简介、代码实现
  4. ML与math:机器学习与高等数学基础概念、代码实现、案例应用之详细攻略——进阶篇
  5. Py之matplotlib:matplotlib绘图自定义函数总结
  6. CV:基于Keras利用CNN主流架构之mini_XCEPTION训练性别分类模型hdf5并保存到指定文件夹下
  7. 蓝桥杯_算法训练_动态数组使用
  8. 数据结构实验之链表一:顺序建立链表(SDUT 2116)
  9. 子串字谜substring anagrams
  10. 老王Python-进阶篇4-面向对象第三节