先分析一下 ZwQuerySystemInformaition 这个函数,它提供给桌面app 使用。他用来检索指定的系统信息。看非文档化的资料说明: 它的一个参数的类型是:SYSTEM_INFORMATION_CLASS 是一个枚举类型,定义了许多系统设置信息。它被用在NtQuerySystemInfomation 和 NtSetSystemInformaiton. 如:这个枚举类型包含: SystemBasicInformation, SystemProcessInformaion.等枚举类型。 所以当我们进行改写的时候,这个类型可以设置为ULONG型的。在wrk的public\sdk\inc\ntexapi.h中有具体的定义。
函数指针: //指针
typedef NTSTATUS (*ZWQUERYSYSTEMINFORMATION)(
ULONG SystemInformationCLass,
PVOID SystemInformation,
ULONG SystemInformationLength,
PULONG ReturnLength
);
ZWQUERYSYSTEMINFORMATION OldZwQuerySystemInformation;
SystemInformationClass == 5 表示SystemProcessInformation.
参看非文档列表:
typedef enum _SYSTEM_INFORMATION_CLASS {
SystemBasicInformation,
SystemProcessorInformation,
SystemPerformanceInformation,
SystemTimeOfDayInformation,
SystemPathInformation,
SystemProcessInformation,
SystemCallCountInformation,
SystemDeviceInformation,
SystemProcessorPerformanceInformation,
SystemFlagsInformation,
SystemCallTimeInformation,
SystemModuleInformation,
SystemLocksInformation,
SystemStackTraceInformation,
SystemPagedPoolInformation,
SystemNonPagedPoolInformation,
SystemHandleInformation,
SystemObjectInformation,
SystemPageFileInformation,
SystemVdmInstemulInformation,
SystemVdmBopInformation,
SystemFileCacheInformation,
SystemPoolTagInformation,
SystemInterruptInformation,
SystemDpcBehaviorInformation,
SystemFullMemoryInformation,
SystemLoadGdiDriverInformation,
SystemUnloadGdiDriverInformation,
SystemTimeAdjustmentInformation,
SystemSummaryMemoryInformation,
SystemNextEventIdInformation,
SystemEventIdsInformation,
SystemCrashDumpInformation,
SystemExceptionInformation,
SystemCrashDumpStateInformation,
SystemKernelDebuggerInformation,
SystemContextSwitchInformation,
SystemRegistryQuotaInformation,
SystemExtendServiceTableInformation,
SystemPrioritySeperation,
SystemPlugPlayBusInformation,
SystemDockInformation,
SystemPowerInformation,
SystemProcessorSpeedInformation,
SystemCurrentTimeZoneInformation,
SystemLookasideInformation
} SYSTEM_INFORMATION_CLASS, *PSYSTEM_INFORMATION_CLASS;
当SYSTEM_INFORMATION_CLASS == 5的时候,表示请求进程列表。
我们需要在这个时候,查询以进程名 '_root_' 开始的进程,并过滤掉它,就实现了进程的隐藏。
#define SYSTEMSERVICE(_function) KeServiceDescriptorTable.ServiceTableBase[ *(PULONG)((PUCHAR)_function+1)]
这个结构体,在前面接触过,着是第二次碰见:OldZwQuerySystemInformation =(ZWQUERYSYSTEMINFORMATION)(SYSTEMSERVICE(ZwQuerySystemInformation))
战斗一: 什么是MDL?
Memory Discription List 一个MDL会描述一块虚拟地址空间,该空间肯能在用户空间,也肯能在系统空间。在进行IO操作时,如果采用DEVICE_IN_DIRECT 和DEVICE_OUT_DIRECT,将一块用户空间在系统空间建立映射.就是用户虚拟地址空间和系统虚拟地址空间都同时指向一块物理内存,然后锁定该内存不允许其换出,这样就能够在系统内核中操作用户空间了. namelcx的专栏中有这方面的描述: http://blog.csdn.net/namelcx/article/details/6833519 以及 http://blog.csdn.net/kaizitop/article/details/2231056 .
破解SSDT的原理,无非就是使用MDL使得SSDT的只读内存的虚拟地址重新映射一次,这样MDL这个内存页和原先的SSDT内存实际指向的物理地址是一样的,但是MDL内存并没有写保护!
http://topic.csdn.net/u/20090701/15/d3df62cb-c455-412a-91ef-b757cec42869.html
MmBuildMdlForNonPagedPool : routine receives an MDL that specifies a virtural memeory buffer in nonpaged pool,and updates it to describe the underlying physical pages. MmBuildMdlForNonPagedPool( IN OUT PMDL MemoryDescriptorList );
算是知道了怎样hook SSDT的流程: 使用映射的方式,突破SSDT的保护,将原来的API地址改写为我们的函数地址,重写我们的函数。 将自己消耗的时间+ Idl的时间中。响应和进行相关的请求。
由于我们是在驱动程序中使用这些函数,故要重新定义,如果直接包含SDK头文件会出现问题。 当SystemInformationClass取值SytemProcessInformation时,SystemInformation对应地指向一个SYSTEM_PROCESS_INFORMATION结构的数组,这个数组的每个结构元素代表一个正在运行的进程:
typedef struct _SYSTEM_PROCESS_INFO
{
ULONG NextEntryOffset;
ULONG NumberOfThreads;
ULONG Reserved [6] ;
LARGE_INTEGER CreateTime;
LARGE_INTEGER UserTime;
LARGE_INTEGER KernelTime;
UNICODE_STRING ProcessName;
KPRIORITY BasePriority;
HANDLE UniqueProcessID;
PVOID Reserved3;
ULONG HandleCount;
BYTE Reserved4{4] ;
PVOID ReservedS [11] ;
SIZE_T PeakPagefileUsage;
SIZE_T PrivatePageCount;
LARGE_INTEGER Reserved6[ 6] ;
}SYSTEM_ROCESS_INFO,*PSYSTEM_ROCESS_INFO;
当当SystemInformationClass取值SytemProcessorPerformationInformation时,SystemInformation对应地指向一个如下结构的数组:
typedef struct _SYSTEM]ROCESSOR]ERFORMANCE_INFO
{
LARGE_INTEGER IdleTime;
LARGE_INTEGER KernelTime;
LARGE_INTEGER UserTime;
LARGE_INTEGER Reservedl[2];
ULONG Reserved2;
}SYSTEM_ROCESSOR_ERFORMANCE_INFO, *PSYSTEM_ROCESSOR_ERFORMANCE_INFO;