|
|
[bgcolor=#ffffff]我们知道每个进程都有一个EPROCESS结构。。。 这个结构存了此进程的所有信息 进程路径进程名称 进程PID 创建时间 结束时间等等很多多在这结构里面。。。 进程的结束时间都是0,PEB的高16位也是不会变的,所以可以通过这些特征来暴力搜索eprocess结构。[/bgcolor]
[bgcolor=#ffffff]include<ntddk.h>[/bgcolor]
[bgcolor=#ffffff]///////////////////////////不同的windows版本下面的偏移值不同[/bgcolor]
[bgcolor=#ffffff]#define EPROCESS_SIZE 0x25C //EPROCESS结构大小[/bgcolor]
[bgcolor=#ffffff]#define PEB_OFFSET 0x1B0[/bgcolor]
[bgcolor=#ffffff]#define FILE_NAME_OFFSET 0x174[/bgcolor]
[bgcolor=#ffffff]#define PROCESS_LINK_OFFSET 0x088[/bgcolor]
[bgcolor=#ffffff]#define PROCESS_ID_OFFSET 0x084[/bgcolor]
[bgcolor=#ffffff]#define EXIT_TIME_OFFSET 0x078[/bgcolor]
[bgcolor=#ffffff]#define OBJECT_HEADER_SIZE 0x018[/bgcolor]
[bgcolor=#ffffff]#define OBJECT_TYPE_OFFSET 0x008[/bgcolor]
[bgcolor=#ffffff]#define PDE_INVALID 2 [/bgcolor]
[bgcolor=#ffffff]#define PTE_INVALID 1 [/bgcolor]
[bgcolor=#ffffff]#define VALID 0 [/bgcolor]
[bgcolor=#ffffff]ULONG pebAddress; //PEB地址的前半部分[/bgcolor]
[bgcolor=#ffffff]PEPROCESS pSystem; //system进程[/bgcolor]
[bgcolor=#ffffff]ULONG pObjectTypeProcess; //进程对象类型[/bgcolor]
[bgcolor=#ffffff]ULONG VALIDpage(ULONG addr) ; //该函数直接复制自 Ring0下搜索内存枚举隐藏进程[/bgcolor]
[bgcolor=#ffffff]BOOLEAN IsaRealProcess(ULONG i); //该函数复制自 Ring0下搜索内存枚举隐藏进程[/bgcolor]
[bgcolor=#ffffff]VOID WorkThread(IN PVOID pContext);[/bgcolor]
[bgcolor=#ffffff]ULONG GetPebAddress(); //得到PEB地址前半部分[/bgcolor]
[bgcolor=#ffffff]VOID EnumProcess(); //枚举进程[/bgcolor]
[bgcolor=#ffffff]ULONG GetExitTime(ULONG pEProcess);[/bgcolor]
[bgcolor=#ffffff]ULONG GetObjectTypeProcess(ULONG pEProcess);[/bgcolor]
[bgcolor=#ffffff]VOID OnUnload(IN PDRIVER_OBJECT DriverObject)[/bgcolor]
[bgcolor=#ffffff]{[/bgcolor]
[bgcolor=#ffffff]}[/bgcolor]
[bgcolor=#ffffff]NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject,IN PUNICODE_STRING RegistryPath)[/bgcolor]
[bgcolor=#ffffff]{[/bgcolor]
[bgcolor=#ffffff] ULONG Address;[/bgcolor]
[bgcolor=#ffffff] PEPROCESS pEProcess;[/bgcolor]
[bgcolor=#ffffff] pSystem = PsGetCurrentProcess();[/bgcolor]
[bgcolor=#ffffff] pEProcess = (PEPROCESS)((ULONG)((PLIST_ENTRY)((ULONG)pSystem + PROCESS_LINK_OFFSET))->Flink - PROCESS_LINK_OFFSET);[/bgcolor]
[bgcolor=#ffffff] Address = *(PULONG)((ULONG)pEProcess + PEB_OFFSET);[/bgcolor]
[bgcolor=#ffffff] pebAddress= Address & 0xFFFF0000;[/bgcolor]
[bgcolor=#ffffff] DbgPrint("驱动安装成功\n");[/bgcolor]
[bgcolor=#ffffff] pObjectTypeProcess = GetObjectTypeProcess(pSystem); [/bgcolor]
[bgcolor=#ffffff] DriverObject -> DriverUnload = OnUnload;[/bgcolor]
[bgcolor=#ffffff] EnumProcess();[/bgcolor]
[bgcolor=#ffffff] return STATUS_SUCCESS;[/bgcolor]
[bgcolor=#ffffff]}[/bgcolor]
[bgcolor=#ffffff]ULONG GetObjectTypeProcess(ULONG pEProcess)[/bgcolor]
[bgcolor=#ffffff]{[/bgcolor]
[bgcolor=#ffffff]return *((ULONG*)(pEProcess-OBJECT_HEADER_SIZE+OBJECT_TYPE_OFFSET)) ;[/bgcolor]
[bgcolor=#ffffff]}[/bgcolor]
[bgcolor=#ffffff]ULONG GetPebAddress( ULONG pEProcess)[/bgcolor]
[bgcolor=#ffffff]{[/bgcolor]
[bgcolor=#ffffff] ULONG Address;[/bgcolor]
[bgcolor=#ffffff] __try[/bgcolor]
[bgcolor=#ffffff]{[/bgcolor]
[bgcolor=#ffffff] Address = *(PULONG)(pEProcess + PEB_OFFSET);[/bgcolor]
[bgcolor=#ffffff]}[/bgcolor]
[bgcolor=#ffffff]__except(1)[/bgcolor]
[bgcolor=#ffffff]{[/bgcolor]
[bgcolor=#ffffff] KdPrint(("eprocess=%x\n",pEProcess));[/bgcolor]
[bgcolor=#ffffff]}[/bgcolor]
[bgcolor=#ffffff] return (Address & 0xFFFF0000); [/bgcolor]
[bgcolor=#ffffff]}[/bgcolor]
[bgcolor=#ffffff]ULONG GetExitTime(ULONG pEProcess)[/bgcolor]
[bgcolor=#ffffff]{[/bgcolor]
[bgcolor=#ffffff]return *((ULONG*)(pEProcess+EXIT_TIME_OFFSET));[/bgcolor]
[bgcolor=#ffffff]}[/bgcolor]
[bgcolor=#ffffff]///////////////////////////////////////////////////////[/bgcolor]
[bgcolor=#ffffff]VOID EnumProcess()[/bgcolor]
[bgcolor=#ffffff]{[/bgcolor]
[bgcolor=#ffffff]//MmIsAddressValid[/bgcolor]
[bgcolor=#ffffff]//MmSystemRangeStart[/bgcolor]
[bgcolor=#ffffff]ULONG i=MmSystemRangeStart;[/bgcolor]
[bgcolor=#ffffff]while(i<pSystem)[/bgcolor]
[bgcolor=#ffffff]{[/bgcolor]
[bgcolor=#ffffff] if (MmIsAddressValid(i+EXIT_TIME_OFFSET)&&MmIsAddressValid(i - OBJECT_HEADER_SIZE +OBJECT_TYPE_OFFSET)&&MmIsAddressValid(i+PEB_OFFSET))[/bgcolor]
[bgcolor=#ffffff] {[/bgcolor]
[bgcolor=#ffffff] // DbgPrint("eprocess=%x\n",i);[/bgcolor]
[bgcolor=#ffffff] if (GetExitTime(i)==0&&GetObjectTypeProcess(i)==pObjectTypeProcess&&GetPebAddress(i)==pebAddress)[/bgcolor]
[bgcolor=#ffffff] {[/bgcolor]
[bgcolor=#ffffff] DbgPrint("找到一个进程eprocess=%x,name=%s\n",i,(i+0x174));[/bgcolor]
[bgcolor=#ffffff] }[/bgcolor]
[bgcolor=#ffffff] }[/bgcolor]
[bgcolor=#ffffff] i++;[/bgcolor]
[bgcolor=#ffffff]}[/bgcolor]
[bgcolor=#ffffff]DbgPrint("找到一个进程eprocess=%x,name=%s\n",pSystem,((ULONG)pSystem+0x174));[/bgcolor]
[bgcolor=#ffffff]}[/bgcolor] |
|