//******************************************************************************
//功能:声明变量
//******************************************************************************
#define EPROCESS_SIZE 0x258 //EPROCESS结构大小
#define PEB_OFFSET 0x1B0 //Peb
#define FILE_NAME_OFFSET 0x174 //ImageFileName
#define PROCESS_LINK_OFFSET 0x088 //ActiveProcessLinks
#define PROCESS_ID_OFFSET 0x084 //UniqueProcessId
#define EXIT_TIME_OFFSET 0x078 //ExitTime
#define OBJECT_HEADER_SIZE 0x018 //_OBJECT_HEADER 0X018
#define OBJECT_TYPE_OFFSET 0x008 //dt nt!_OBJECT_HEADER -b
#define PDE_INVALID 2
#define PTE_INVALID 1
#define VALID 0
ULONG pebAddress; //PEB地址的前半部分
PEPROCESS pSystem; //system进程
ULONG pObjectTypeProcess; //进程对象类型
HANDLE hThread;
//******************************************************************************
//功能:声明函数
//******************************************************************************
ULONG VALIDpage(ULONG addr) ; //该函数直接复制自 Ring0下搜索内存枚举隐藏进程
BOOLEAN IsaRealProcess(ULONG i); //该函数复制自 Ring0下搜索内存枚举隐藏进程
VOID WorkThread(IN PVOID pContext);
ULONG GetPebAddress(); //得到PEB地址前半部分
VOID EnumProcess(); //枚举进程
VOID ShowProcess(ULONG pEProcess); //显示结果
NTSTATUS GetEnumProcess()
{
pebAddress = GetPebAddress();
pObjectTypeProcess = *(PULONG)((ULONG)SystemProcess - OBJECT_HEADER_SIZE +OBJECT_TYPE_OFFSET);
PsCreateSystemThread(&hThread,
(ACCESS_MASK)0,
NULL,
(HANDLE)0,
NULL,
WorkThread,
NULL
);
return STATUS_SUCCESS;
}
//**************************************************************************************
//**************************************************************************************
//模块名字:
//模块功能:
//返回数值:
//**************************************************************************************
//参数说明:参数名 | 输入/输出 | 参数说明
// | |
// | |
// | |
//**************************************************************************************
//**************************************************************************************
VOID WorkThread(IN PVOID pContext)
{
EnumProcess();
PsTerminateSystemThread(STATUS_SUCCESS);
}
//**************************************************************************************
//**************************************************************************************
//模块名字:ULONG GetPebAddress()
//模块功能:得到PEB地址前半部分
//返回数值:
//**************************************************************************************
//参数说明:参数名 | 输入/输出 | 参数说明
// | |
// | |
// | |
//**************************************************************************************
//**************************************************************************************
ULONG GetPebAddress()
{
ULONG Address;
PEPROCESS pEProcess;
//由于system进程的peb总是零 我们只有到其他进程去找了
pEProcess = (PEPROCESS)((ULONG)((PLIST_ENTRY)((ULONG)SystemProcess + PROCESS_LINK_OFFSET))->Flink - PROCESS_LINK_OFFSET);
Address = *(PULONG)((ULONG)pEProcess + PEB_OFFSET);
return (Address & 0xFFFF0000);
}
//**************************************************************************************
//**************************************************************************************
//模块名字:VOID EnumProcess()
//模块功能:枚举进程
//返回数值:
//**************************************************************************************
//参数说明:参数名 | 输入/输出 | 参数说明
// | |
// | |
// | |
//**************************************************************************************
//**************************************************************************************
VOID EnumProcess()
{
ULONG uSystemAddress = (ULONG)SystemProcess;
ULONG i;
ULONG Address;
ULONG ret;
DbgPrint("-------------------------------------------");
DbgPrint("EProcess PID ImageFileName");
DbgPrint("---------------------------------");
for(i = 0x80000000; i < uSystemAddress; i += 4)
{//system进程的EPROCESS地址就是最大值了
ret = VALIDpage(i);
if (ret == VALID)
{
Address = *(PULONG)i;
if (( Address & 0xFFFF0000) == pebAddress)
{//每个进程的PEB地址都是在差不多的地方,地址前半部分是相同的
if(IsaRealProcess(i))
{
ShowProcess(i - PEB_OFFSET);
i += EPROCESS_SIZE;
indexProcess = indexProcess + 1;
}
}
}
else if(ret == PTE_INVALID)
{
i -=4;
i += 0x1000;//4k
}
else
{
i-=4;
i+= 0x400000;//4mb
}
}
ShowProcess(uSystemAddress);//system的PEB总是零 上面的方法是枚举不到的 不过我们用PsGetCurrentProcess就能得到了
DbgPrint("index:%d\n",indexProcess);
DbgPrint("-------------------------------------------");
}
//**************************************************************************************
//**************************************************************************************
//模块名字:VOID ShowProcess(ULONG pEProcess)
//模块功能:显示结果
//返回数值:
//**************************************************************************************
//参数说明:参数名 | 输入/输出 | 参数说明
// | |
// | |
// | |
//**************************************************************************************
//**************************************************************************************
VOID ShowProcess(ULONG pEProcess)
{
PLARGE_INTEGER ExitTime;
ULONG PID;
PUCHAR pFileName;
ExitTime = (PLARGE_INTEGER)(pEProcess + EXIT_TIME_OFFSET);
if(ExitTime->QuadPart != 0) //已经结束的进程的ExitTime为非零
return ;
PID = *(PULONG)(pEProcess + PROCESS_ID_OFFSET);
pFileName = (PUCHAR)(pEProcess + FILE_NAME_OFFSET);
DbgPrint("0x%08X %04d %s\n",pEProcess,PID,pFileName);
}
//**************************************************************************************
//**************************************************************************************
//模块名字:ULONG VALIDpage(ULONG addr)
//模块功能:该函数直接复制自 Ring0下搜索内存枚举隐藏进程
//返回数值:
//**************************************************************************************
//参数说明:参数名 | 输入/输出 | 参数说明
// | |
// | |
// | |
//**************************************************************************************
//**************************************************************************************
ULONG VALIDpage(ULONG addr)
{
ULONG pte;
ULONG pde;
pde = 0xc0300000 + (addr>>22)*4;
if((*(PULONG)pde & 0x1) != 0)
{
if((*(PULONG)pde & 0x80) != 0)
{
return VALID;
}
pte = 0xc0000000 + (addr>>12)*4;
if((*(PULONG)pte & 0x1) != 0)
{
return VALID;
}
else
{
return PTE_INVALID;
}
}
return PDE_INVALID;
}
//**************************************************************************************
//**************************************************************************************
//模块名字:BOOLEAN IsaRealProcess(ULONG i)
//模块功能:该函数复制自 Ring0下搜索内存枚举隐藏进程
//返回数值:
//**************************************************************************************
//参数说明:参数名 | 输入/输出 | 参数说明
// | |
// | |
// | |
//**************************************************************************************
//**************************************************************************************
BOOLEAN IsaRealProcess(ULONG i)
{
NTSTATUS STATUS;
PUNICODE_STRING pUnicode;
UNICODE_STRING Process;
ULONG pObjectType;
ULONG ObjectTypeAddress;
if (VALIDpage(i- PEB_OFFSET) != VALID)
{
return FALSE;
}
ObjectTypeAddress = i - PEB_OFFSET - OBJECT_HEADER_SIZE + OBJECT_TYPE_OFFSET ;
if (VALIDpage(ObjectTypeAddress) == VALID)
{
pObjectType = *(PULONG)ObjectTypeAddress;
}
else
{
return FALSE;
}
if(pObjectTypeProcess == pObjectType)
{ //确定ObjectType是Process类型
return TRUE;
}
return FALSE;
}
这个是堕落天才的隐藏进程代码,真是奇怪,在虚拟机上 能显示搜索到的进程,在我的电脑上无法
搜索到进程,WINDBG 看了下偏移地址,都正确,不禁如此,我还找了一个VB的内存枚举进程
基本跟堕落天才的一样,也是虚拟机好用,我的电脑不好用,都是winxp3...
帮帮忙,我都快疯了。。。。
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!