一段搜索EPROCESS来列进程的代码

//findprocess.c
//        by uty@uaty
//
#include <ntddk.h>

#define PDE_INVALID 2
#define PTE_INVALID 1
#define VALID        0

#define PEB_OFFSET                    0x1b0
#define OBJECT_HEADER_SIZE            0x18
#define OBJECT_TYPE_OFFSET            0x8
#define EPROCESS_NAME_OFFSET        0x174

VOID WorkThread(IN PVOID pContext);
VOID DriverUnload(IN PDRIVER_OBJECT Driver_object);
VOID searchprocess(VOID);
VOID getname(ULONG Addr);
ULONG validpage(ULONG Addr);
BOOLEAN IsARealProcess(ULONG i);

NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject,IN PUNICODE_STRING RegistryPath)
{
   
NTSTATUS    dwStatus;
   
HANDLE        hThread;
   
DbgPrint("i'm coming :>\n");
   
   
DriverObject->DriverUnload = DriverUnload;
   
   
dwStAtus = PsCreateSystemThread(&hThread,
        (
ACCESS_MASK)0,
        
NULL,
        (
HANDLE)0,
        
NULL,
        
WorkThread,
        
NULL
        
);
   
   
   
return STATUS_SUCCESS;
}
//--------------------------------------------------------------------
VOID DriverUnload(IN PDRIVER_OBJECT Driver_object)
{
}
//--------------------------------------------------------------------
VOID WorkThread(IN PVOID pContext)
{
   
searchprocess();
   
   
PsTerminateSystemThread(STATUS_SUCCESS);
   
DbgPrint("Never be here ?\n");
}
//--------------------------------------------------------------------
VOID searchprocess(void)
{
   
ULONG    i;
   
ULONG    result;
   
   
for (i = 0x80000000 ;i<0x90000000;i+=4){
        
result = validpage(i);
        
if (result == VALID){
            
if (*(PULONG)i == 0x7ffdf000){
               
if(IsARealProcess(i)){
                    
DbgPrint("EPROCESS: 0x%x  ",i-PEB_OFFSET);
                    
getname(i);
                }
            }
        }
        
else if(result == PTE_INVALID){
            
i -=4;
            
i += 0x1000;
//4k
        
}
        
else{
            
i-=4;
            
i+= 0x400000;
//4mb
        
}
        
    }

   
for (i = 0xf0000000 ;i<0xffbe0000;i+=4){
        
result = validpage(i);
        
if (result == VALID){
            
if (*(PULONG)i == 0x7ffdf000){
               
if(IsARealProcess(i)){
                    
DbgPrint("EPROCESS: 0x%x  ",i-PEB_OFFSET);
                    
getname(i);
                }
            }
        }
        
else if(result == PTE_INVALID){
            
i -=4;
            
i += 0x1000;
//4k
        
}
        
else{
            
i-=4;
            
i+= 0x400000;
//4mb
        
}        
    }

   
DbgPrint("searching finish \n");
}
//--------------------------------------------------------------------
VOID getname(ULONG Addr)
{
   
DbgPrint("process name: %s\n",(PCHAR)(Addr-PEB_OFFSET+EPROCESS_NAME_OFFSET));
}
//--------------------------------------------------------------------
ULONG validpage(ULONG Addr)
{
   
ULONG    pte;
   
ULONG    pde;
   
   
pde = 0xc0300000 + (Addr>>22)*4;
   
if((*(PULONG)pde & 0x1) != 0){
        
//lArge pAge
        
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)
{
   
NTSTATUS            status;
   
PUNICODE_STRING        pUnicode;
   
UNICODE_STRING        Process;
   
ULONG                pObjectType;
   
ULONG                pObjectTypeProcess;
   
   
   
pObjectTypeProcess = *(PULONG)((ULONG)PsGetCurrentProcess() -OBJECT_HEADER_SIZE +OBJECT_TYPE_OFFSET);
   
if (validpage(i-PEB_OFFSET) != VALID){
        
return FALSE;
    }
   
   
if (validpage(i-PEB_OFFSET - OBJECT_HEADER_SIZE + OBJECT_TYPE_OFFSET) == VALID){
        
pObjectType = *(PULONG)(i-PEB_OFFSET - OBJECT_HEADER_SIZE + OBJECT_TYPE_OFFSET);
    }
   
else{
        
return FALSE;
    }
   
   
if(pObjectTypeProcess == pObjectType){        
        
return TRUE;
    }
   
return FALSE;
   
}
//--------------------------------------------------------------------



[本日志由 admin 于 2011-04-08 06:11 PM 编辑]

有什么问题可以加群,100852896
点击这里加入此群 在线提问
文章来自: 本站原创
Tags: EPROCESS 列进程 代码
评论: 0 | 查看次数: 7132
博主QQ: 友情链接请找我
QQ群: 灰色档案
返回顶部 关闭