今天在读书的时候<<ROOTKITS Windows内核的安全防护>>时候看到了关于进程隐藏的
一些内容,感觉跟不错,就用他的思想和提供的部分代码代码,综合了综合试验一下,不过我不是做进程的隐藏只是用他的思路和实例代码来实现了一个“枚举系统的所以进程”的功能,可是在枚举完成的时候发现了一个小问题,
出现了一个这样的信息:
第 34 个进程 ImageName = , PID = 0x80882080
正常的信息因该是:
第 0 个进程 ImageName = smss.exe , PID = 0x270
第 1 个进程 ImageName = csrss.exe , PID = 0x2a8
...
第 32 个进程 ImageName = hh.exe , PID = 0xe78
第 33 个进程 ImageName = dexplore.exe , PID = 0xcd4
我感觉这个奇怪的信息应该是:Idle Process 这个虚拟进程,用windbg看了一下,的却是。
lkd> !process 0x80882080
PROCESS 80882080 SessionId: none Cid: 0000 Peb: 00000000 ParentCid: 0000
DirBase: 00039000 ObjectTable: e1001c28 HandleCount: 932.
Image: Idle
VadRoot 00000000 Vads 0 Clone 0 Private 0. Modified 0. Locked 0.
DeviceMap 00000000
Token e1000790
ElapsedTime 00:00:00.000
UserTime 00:00:00.000
KernelTime 00:21:18.593
QuotaPoolUsage[PagedPool] 0
QuotaPoolUsage[NonPagedPool] 0
Working Set Sizes (now,min,max) (4, 50, 450) (16KB, 200KB, 1800KB)
PeakWorkingSetSize 0
VirtualSize 0 Mb
PeakVirtualSize 0 Mb
PageFaultCount 0
MemoryPriority BACKGROUND
BasePriority 0
CommitCharge 0
虽然是一个虚拟的进程,我为什么得不到他的名字呢??
现在的是我想在我的程序里面能判断出来是这个进程的话显示的时候做一下处理:
pList_active_proc=(LIST_ENTRY*)(eproc+FLINKOFFSET);
eproc=(DWORD)pList_active_proc->Flink;
eproc-=FLINKOFFSET;
CurrentPID=*((int*)(eproc+PIDOFFSET));
if(!(CurrentPID & 0xf0000000))
{
DbgPrint("第 %d 个进程 ImageName = %s , PID = 0x%x\n",nCount,(char*)(eproc+ImageOffset),CurrentPID);
}
else
{
DbgPrint("第 %d 个进程 ImageName = %S , PID = 0x%x\n",nCount,L"[System Idle Process]",0);
}
上面是我自己写的,很牵强
感觉不好,不知大家有没有好的办法。
/***************************************************************/
一下为我的测试程序代码
/***************************************************************/
#ifdef __cplusplus
extern "C"
{
#endif
#include "ntddk.h"
typedef unsigned long DWORD;
VOID
xxDriverUnload(IN PDRIVER_OBJECT DriverObject);
VOID
EnumPID();
DWORD
GetImageOffset(DWORD PID);
#ifdef __cplusplus
}
extern "C"
#endif
NTSTATUS
DriverEntry(IN PDRIVER_OBJECT DriverObject,
IN PUNICODE_STRING RegistryPath)
{
NTSTATUS ntStatus=STATUS_SUCCESS;
ULONG i=0;
DbgPrint(__TIME__ __FILE__" >>> DriverEntry function...\n");
DriverObject->DriverUnload=xxDriverUnload;
EnumPID();
return ntStatus;
}
VOID
xxDriverUnload(IN PDRIVER_OBJECT DriverObject)
{
DbgPrint(__TIME__ __FILE__" >>> xxDriverUnload function...\n");
return;
}
VOID
EnumPID()
{
DWORD eproc=0x00000000;
int CurrentPID;
int StartPID;
int nCount=0;
PLIST_ENTRY pList_active_proc;
DWORD PIDOFFSET=0x84;
DWORD FLINKOFFSET=0x88;
DWORD ImageOffset=0x0000;
DWORD oldeproc=0x00000000;
eproc=(DWORD)PsGetCurrentProcess();
StartPID=*((int*)(eproc+PIDOFFSET));
CurrentPID=StartPID;
DbgPrint(__TIME__" >> CurrentPID=0x%x\n",CurrentPID);
ImageOffset=GetImageOffset(eproc);
while(1)
{
if((nCount>=1) && (StartPID == CurrentPID))
{
return;
}
else
{
pList_active_proc=(LIST_ENTRY*)(eproc+FLINKOFFSET);
eproc=(DWORD)pList_active_proc->Flink;
eproc-=FLINKOFFSET;
CurrentPID=*((int*)(eproc+PIDOFFSET));
if(!(CurrentPID & 0xf0000000))
{
DbgPrint("第 %d 个进程 ImageName = %s , PID = 0x%x\n",nCount,(char*)(eproc+ImageOffset),CurrentPID);
}
else
{
DbgPrint("第 %d 个进程 ImageName = %S , PID = 0x%x\n",nCount,L"[System Idle Process]",0);
}
nCount++;
}
}
}
DWORD
GetImageOffset(DWORD PID)
{
DWORD offset=0x0000;
ULONG i=0;
for(i=0;i<PAGE_SIZE;i++)
{
if(!strncmp("System",(PCHAR)(PID+i),strlen("System")))
{
return i;
}
}
return offset;
}
/************************************************/
sources文件内容
/************************************************/
TARGETNAME=GetPID
TARGETPATH=obj
TARGETTYPE=DRIVER
SOURCES = GetPID.cpp
/************************************************/
makefile文件内容
/************************************************/
#
# DO NOT EDIT THIS FILE!!! Edit .\sources. if you want to add a new source
# file to this component. This file merely indirects to the real make file
# that is shared by all the driver components of the Windows NT DDK
#
!INCLUDE $(NTMAKEENV)\makefile.def
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)