Windows 内核级进程隐藏、侦测技术(5)

Windows 内核级进程隐藏、侦测技术(5)

2023年8月1日发(作者:)

Windows 内核级进程隐藏、侦测技术(5)

Windowsxx 内核级进程隐藏、侦测技术

LockOwner: 0x98

UniqueProcessId: 0x9c

ActiveProcessLinks: 0xa0

QuotaPeakPoolUsage[0]: 0xa8

QuotaPoolUsage[0]: 0xb0

PagefileUsage: 0xb8

CommitCharge: 0xbc

PeakPagefileUsage: 0xc0

PeakVirtualSize: 0xc4

VirtualSize: 0xc8

Vm: 0xd0

DebugPort: 0x120

ExceptionPort: 0x124

ObjectTable: 0x128

Token: 0x12c

WorkingSetLock: 0x130

WorkingSetPage: 0x150

ProcessOutswapEnabled: 0x154

ProcessOutswapped: 0x155

AddressSpaceInitialized: 0x156

AddressSpaceDeleted: 0x157

AddressCreationLock: 0x158

ForkInProgress: 0x17c

VmOperation: 0x180

VmOperationEvent: 0x184

PageDirectoryPte: 0x1f0

LastFaultCount: 0x18c

VadRoot: 0x194

VadHint: 0x198

CloneRoot: 0x19c

NumberOfPrivatePages: 0x1a0

NumberOfLockedPages: 0x1a4

ForkWasSuessful: 0x182

ExitProcessCalled: 0x1aa

CreateProcessReported: 0x1ab

SectionHandle: 0x1ac

Peb: 0x1b0

SectionBaseAddress: 0x1b4

QuotaBlock: 0x1b8

LastThreadExitStatus: 0x1bc

WorkingSetWatch: 0x1c0

InheritedFromUniqueProcessId: 0x1c8

GrantedAess: 0x1

DefaultHardErrorProcessing 0x1d0

LdtInformation: 0x1d4

VadFreeHint: 0x1d8

VdmObjects: 0x1dc

DeviceMap: 0x1e0

ImageFileName[0]: 0x1fc

VmTrimFaultValue: 0x20c

Win32Process: 0x214

Win32WindowStation: 0x1c4

3. 什么是活动进程链表

EPROCESS块中有一个ActiveProcessLinks成员,它是一个PLISTENTRY机构的双向链表。当一个新进程建立的时候父进程负责完成EPROCESS块,然后把ActiveProcessLinks链接到一个全局内核变量PsActiveProcessHead链表中。

在PspCreateProcess内核API中能清晰的找到:

InsertTailList(&PsActiveProcessHead,&Process->ActiveProcessLinks);

当进程结束的时候,该进程的EPROCESS结构当从活动进程链上摘除。(但是EPROCESS结构不一定就马上释放)。

在PspExitProcess内核API中能清晰的找到:

RemoveEntryList(&Process->ActiveProcessLinks);

所以我们完全可以利用活动进程链表来对进程进行枚举。

4. 进程枚举检测Hook SSDT隐藏的进程。

事实上Nactive API ZwQuerySystemInformation 对进程查询也是找到活动进程链表头,然后遍历活动进程链。最后把每一个EPROCESS中包含的根本信息返回(包括进程ID名字等)。所以用遍历活动进程链表的方法能有效的把Hook SSDT进行隐藏的进程轻而易举的查出来。但是PsActiveProcessHead并没被

导出来,所以我们可以利用硬编码的方法,来解决这个问题。利用内核调试器livekd查得PsActiveProcessHead的地址为:

0x8046e460.(在2000 sp4中得到的值)

kd> dd PsActiveProcessHead L 2

dd PsActiveProcessHead L 2

8046e460 81829780 ff2f4c80

PLISTENTRY PsActiveProcessHead = (PLISTENTRY)0x8046e460;

void DisplayList()

PLISTENTRY List = PsActiveProcessHead->Blink;

while( List != PsActiveProcessHead )

char* name = ((char*)List-0xa0)+0x1fc;

DbgPrint("name = %sn",name);

List=List->Blink;

首先把List指向表头后的第一个元素。然后减去0xa0,因为这个时候List指向的并不是EPROCESS块的头,而是指向的它的ActiveProcessLinks成员结构,而ActiveProcessLinks在EPROCESS中的偏移量是0xa0,所以需要减去这么多,得到EPROCESS的头部。在EPROCESS偏移0x1fc处是进程的名字信息,所以再加上0x1fc得到进程名字,并且在Dbgview中打印出来。利用Hook SSDT隐藏的进程很容易就被查出来了。

5. 解决硬编码问题。

在上面我们的PsActiveProcessHead是通过硬编码的形式得到的,在不同的系统中这值不一样。在不同的SP版本中这个值一般也不一样。这就给程序的通用性带来了很大的问题。下面就来解决这个PsActiveProcessHead的硬编码的问题。

导出的PsInitialSystemProcess 是一个指向system进程的EPROCESS。这个结构成员就是指向PsActiveProcessHead的.

kd> dd PsInitialSystemProcess L 1

dd PsInitialSystemProcess L 1

8046e450 818296e0

kd> !process 818296e0 0

!process 818296e0 0

PROCESS 818296e0 SessionId: 0 Cid: 0008 Peb: 00000000

ParentCid: 0000

DirBase: 00030000 ObjectTable: 8185d148 TableSize: 141.

Image: System

可以看出由PsInitialSystemProcess得到的818296e0正是指向System的EPROCESS.

kd> dd 818296e0+0xa0 L 2

dd 818296e0+0xa0 L 2

81829780 814d1a00 8046e460

上面又可以看出S

发布者:admin,转转请注明出处:http://www.yc00.com/news/1690873900a452172.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信