计算机应用 | 古代文学 | 市场营销 | 生命科学 | 交通物流 | 财务管理 | 历史学 | 毕业 | 哲学 | 政治 | 财税 | 经济 | 金融 | 审计 | 法学 | 护理学 | 国际经济与贸易
计算机软件 | 新闻传播 | 电子商务 | 土木工程 | 临床医学 | 旅游管理 | 建筑学 | 文学 | 化学 | 数学 | 物理 | 地理 | 理工 | 生命 | 文化 | 企业管理 | 电子信息工程
计算机网络 | 语言文学 | 信息安全 | 工程力学 | 工商管理 | 经济管理 | 计算机 | 机电 | 材料 | 医学 | 药学 | 会计 | 硕士 | 法律 | MBA
现当代文学 | 英美文学 | 通讯工程 | 网络工程 | 行政管理 | 公共管理 | 自动化 | 艺术 | 音乐 | 舞蹈 | 美术 | 本科 | 教育 | 英语 |

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

2013-08-09 01:05
导读:e: 0x90 LockOwner: 0x98 UniqueProcessId: 0x9c ActiveProcessLinks: 0xa0 QuotaPeakPoolUsage[0]: 0xa8 QuotaPoolUsage[0]: 0xb0 PagefileUsage: 0xb8 CommitCharge: 0xbc PeakPagefileUsage: 0xc0 PeakVirtualSiz
e:                          0x90

    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

    ForkWasSuccessful:                 0x182

    ExitProcessCalled:                 0x1aa

    CreateProcessReported:             0x1ab

    SectionHandle:                     0x1ac

    Peb:                               0x1b0

    SectionBaseAddress:                0x1b4

    QuotaBlock:                        0x1b8

    LastThreadExitStatus:              0x1bc

    WorkingSetWatch:                   0x1c0

    InheritedFromUniqueProcessId:      0x1c8

    GrantedAccess:                     0x1cc

    DefaultHardErrorProcessing         0x1d0

    LdtInformation:                    0x1d4

    VadFreeHint:                       0x1d8

    VdmObjects:                        0x1dc

    DeviceMap:                         0x1e0

    ImageFileName[0]:                  0x1fc

    VmTrimFaultValue:                  0x20c

    Win32Process:                      0x214

  Win32WindowStation:                0x1c4

  3. 什么是活动进程链表

  EPROCESS块中有一个ActiveProcessLinks成员,它是一个PLIST_ENTRY机构的双向链表。当一个新进程建立的时候父进程负责完成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并没被ntoskrnl.exe 导出来,所以我们可以利用硬编码的办法,来解决这个问题。利用内核调试器livekd查得PsActiveProcessHead的地址为: 0x8046e460.(在2000 sp4中得到的值)

  kd> dd PsActiveProcessHead L 2

  dd PsActiveProcessHead L 2

  8046e460 81829780 ff2f4c80

  PLIST_ENTRY PsActiveProcessHead = (PLIST_ENTRY)0x8046e460;

void DisplayList()

{

PLIST_ENTRY List = PsActiveProcessHead->Blink;

while( List != PsActiveProcessHead )

{

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

        DbgPrint("name = %s\n",name);

        List=List->Blink;              

}

}

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

  5. 解决硬编码问题。

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

    ntoskrnl.exe导出的PsInitialSystemProcess 是一个指向system进程的EPROCESS。这个结构成员EPROCESS.ActiveProcessLinks.Blink就是指向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

上一篇:工业计算机等级考试对实验教学改革的影响 下一篇:没有了