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
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
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.