Inactivando registro de eventos.

Iniciado por APOKLIPTICO, 21 Diciembre 2011, 02:35 AM

0 Miembros y 1 Visitante están viendo este tema.

APOKLIPTICO

Hola! Como va? Me estoy carcomiendo la cabeza con un problema, estoy tratando de hacer un programa que cierre el registro de eventos (servicio eventlog) o que en su defecto, permita el acceso de escritura para los archivos de registro (.evt). Cabe aclarar que necesito eliminarlos de manera segura (con sobreescritura previa), osea que la opción de eliminar el registro de eventos no es viable.

Para esto se me ocurrieron dos maneras:

1) Cerrar el eventlog, para esto sería necesario de alguna manera cerrarlo sin matar el proceso services.exe que es escencial para windows, parece como si fuese un thread dentro del proceso services.exe. Cabe aclarar que no se puede cerrar el servicio ya que la llamada a ControlService() con la flag SERVICE_CONTROL_STOP devuelve un error ERROR_INVALID_SERVICE_CONTROL ya que el sistema lo marca como escencial.

2) Hacer una llamada a CloseHandle dentro del proceso services.exe llamando a las handles de los archivos, o desbloquear su acceso exclusivo de alguna manera. Estuve intentando con code injection pero todavía no pude hacerlo funcionar ya que crashea el proceso en el que se inyecta (en este caso estuve tratando de inyectar un winamp.exe) durante la llamada a createremotethread:

Código (cpp) [Seleccionar]

   HANDLE hProcess = OpenProcess(PROCESS_CREATE_THREAD | PROCESS_VM_OPERATION | PROCESS_VM_READ | PROCESS_VM_WRITE | PROCESS_QUERY_INFORMATION, false, 4492);
   if(!hProcess) return GetLastError();
   DWORD iFuncSize = (DWORD) test - (DWORD) UnloadEvtLog;
   void *pAddress = VirtualAllocEx(hProcess, 0, iFuncSize, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);
   if(!pAddress)
   {
       CloseHandle(hProcess);
       return GetLastError();
   }
   if (!WriteProcessMemory(hProcess, pAddress, (void *)test, iFuncSize, 0 ) )
   {
       CloseHandle(hProcess);
       VirtualFreeEx(hProcess, pAddress, 0, MEM_RELEASE);
       return GetLastError();
   }
   HANDLE hThread = CreateRemoteThread(hProcess, 0, 0, (LPTHREAD_START_ROUTINE)pAddress, 0, 0, NULL);
   WaitForSingleObject(hThread,INFINITE);
   CloseHandle(hThread);
   VirtualFreeEx(hProcess, pAddress, 0, MEM_RELEASE);
   return ERROR_SUCCESS;


La funcion de prueba es la siguiente:

Código (cpp) [Seleccionar]
void test()
{
   char szPID[1000];
   ZeroMemory(szPID, 10);
   itoa(GetCurrentProcessId(), szPID, 10);
   strcat(szPID, "\n");
   strcat(szPID, GetCommandLine());
   MessageBox(NULL, szPID , NULL, 0);
   return;
}



Esto puede ser porque no le estoy pasando parámetros a la funcion (ya que no tiene), entonces le pongo "0" en el puntero a los datos. Como debería poner cuando no hay parámetros para pasar??

Bueno, ojalá que alguien me pueda dar una mano.
Un abrazo
APOKLIPTICO.

PD: Vale aclarar que el proceso tiene el flag SE_DEBUG_PRIVILEGES activado.
AMD Phenom II 1075T X6 @ 290 Mhz x 11 (HT 2036 Mhz NB Link 2616 Mhz) 1.23 Vcore
ASUS M4A89GTD-PRO/USB3
2x2gb G-Skill RipjawsX DDR3 1600 Mhz CL7 (7-8-7-24-25-1T)
Seagate 500 Gb
XFX HD4850 512Mb GDDR3. 650 Mhz/995 Mhz 1.1 Tflops.

Eternal Idol

¿Hablamos de XP, no? En Windows 7 si se puede detener el servicio (y lo carga SVCHOST.exe).

¿Que es lo que queres hacer exactamente?

No podes usar funciones de la RTL ni de la API en el codigo inyectado directamente (nadie garantiza que la RTL este enlazada estaticamente en donde inyectas y tampoco que de estarlo sea la misma version y concuerde la direccion).
La funcion deberia ser LPTHREAD_START_ROUTINE, pasa una estructura de punteros para la API de Windows (asi no se usa el PE para nada). Si creas una DLL y simplemente llamas a LoadLibrary despues en la misma podes trabajar mas facilmente ...
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

APOKLIPTICO

Sisi, por ahora estoy en XP, pero me gustaría que fuese aplicable también en Vista y 7, pero supongo que podría hacer un check a ver si la función devuelve ERROR_SUCCESS y en caso de que no funcionase, utilizaría otro método.

Me gustaría poder abrir los archivos que tiene el eventlog (.evt si no me equivoco) y poder eliminarlos de manera segura (con una sobreescritura), pero sin tener que reiniciar la pc. Osea, se puede deshabilitar el servicio de tal manera que no se inicie en el siguiente reinicio, pero me gustaría no tener que esperar a que se reinicie el sistema.

Entonces o cierro el eventlog o cierro los handles a los archivos abiertos, osea, debería buscar los handles que corresponde (que realmente no se como) y luego hacer una llamada a CloseHandle(HANDLE hFile) y luego que mi programa los abra con acceso exclusivo para evitar que se vuelvan a abrir.

En cuanto a inyectar la DLL, es posible hacerlo utilizando mingw como compilador?? Si no me equivoco hay problemas cargando DLLs creadas con mingw. Sino debería utilizar visual studio para hacer la DLL y luego inyectarla bajo mingw, pero preferiría no tener que hacerlo.

Un saludo
APOKLIPTICO.
AMD Phenom II 1075T X6 @ 290 Mhz x 11 (HT 2036 Mhz NB Link 2616 Mhz) 1.23 Vcore
ASUS M4A89GTD-PRO/USB3
2x2gb G-Skill RipjawsX DDR3 1600 Mhz CL7 (7-8-7-24-25-1T)
Seagate 500 Gb
XFX HD4850 512Mb GDDR3. 650 Mhz/995 Mhz 1.1 Tflops.

Eternal Idol

¿Que queres borrar y para que? Tal vez sea mas simple evitar que se escriba ... todavia no nos dijiste que queres hacer realmente.
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

APOKLIPTICO

Quiero borrar de manera segura los archivos del registro de eventos, específicamente los que contienen los logs del registro de eventos, estos archivos están en "%WINDIR%\system32\config" en XP y en una carpeta adentro de system32 en Vista y 7. Quiero borrarlos de manera segura, porque es probable que el clear de windows los borre de manera insegura, quiero reescribir los archivos con "0" o con información aleatoria y luego eliminarlos.

http://es.wikipedia.org/wiki/Persistencia_de_datos

En cuanto a evitar que se escriba, también voy a hacer eso, pero los que ya están escritos, quiero eliminarlos de manera segura, no se como puedo hacerlo más claro.

Un saludo
APOKLIPTICO.
AMD Phenom II 1075T X6 @ 290 Mhz x 11 (HT 2036 Mhz NB Link 2616 Mhz) 1.23 Vcore
ASUS M4A89GTD-PRO/USB3
2x2gb G-Skill RipjawsX DDR3 1600 Mhz CL7 (7-8-7-24-25-1T)
Seagate 500 Gb
XFX HD4850 512Mb GDDR3. 650 Mhz/995 Mhz 1.1 Tflops.