一段搜索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;
   
}
//--------------------------------------------------------------------
 

你可能感兴趣的:(一段搜索EPROCESS来列进程的代码)