三设 发表于 2011-8-7 11:41:09

基于EPROCESS结构中双向链表的进程检测方法总结

对于windows下的每一个进程windows都会给它分配一个excutive process block 。该结构包含和指向一系列其它相关的数据结构。eprocess及其所有相关数据结构都位于系统空间,只有peb是位于进程地址空间的,它包含用户模式代码所决定的信息。
下面看EPROCESS的结构为:
kd> dt _eprocess
nt!_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 //id指针
+0x088 ActiveProcessLinks : _LIST_ENTRY //活动进程链表作用是把一个个eprocess结构连载一起
+0x090 QuotaUsage      : Uint4B
+0x09c QuotaPeak      : 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
+0x168 Filler          : Uint8B
+0x170 Session          : Ptr32 Void
+0x174 ImageFileName    : 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
不同的机器会不一样,在上面的结构中,主要要注意 ActiveProcessLinks和ObjectTable,这里的ObjectTable是一个_HANDLE_TABLE 结构具体如下:
kd> dt _handle_table
nt!_HANDLE_TABLE
+0x000 TableCode      : Uint4B
+0x004 QuotaProcess    : Ptr32 _EPROCESS
+0x008 UniqueProcessId : Ptr32 Void
+0x00c HandleTableLock : _EX_PUSH_LOCK
+0x01c HandleTableList : _LIST_ENTRY //这里也是一个链表 ,活动进程也可以通过这个进行遍历。
+0x024 HandleContentionEvent : _EX_PUSH_LOCK
+0x028 DebugInfo      : Ptr32 _HANDLE_TRACE_DEBUG_INFO
+0x02c ExtraInfoPages: Int4B
+0x030 FirstFree      : Uint4B
+0x034 LastFree      : Uint4B
+0x038 NextHandleNeedingPool : Uint4B
+0x03c HandleCount      : Int4B
+0x040 Flags            : Uint4B
+0x040 StrictFIFO      : Pos 0, 1 Bit
另外0x008处的UniqueProcessId就是当前eprocess对应进程的id号,0x004处的QuotaProcess指向了当前进程的eprocess结构(system进程为空),通过它们可以获得进程id和其它的一些信息。
**** Hidden Message *****

zhangchenggu 发表于 2012-8-30 15:24:48

看看链表数据

hcz000 发表于 2013-1-21 20:11:02

看看发出常常常常常常

cooby 发表于 2013-9-28 08:47:48

好东西啊,真是好东西,感谢楼主分享!谢谢!

qq412158094 发表于 2019-3-28 15:52:04

支持楼主,支持看流星社区,以后我会经常来!

qq412158094 发表于 2019-3-28 17:48:45

支持楼主,支持看流星社区,以后我会经常来!
页: [1]
查看完整版本: 基于EPROCESS结构中双向链表的进程检测方法总结