Ir al contenido



Foto

¿Protegernos contra inyecciones dll?


  • Por favor identifícate para responder
15 respuestas en este tema

#1 escafandra

escafandra

    Advanced Member

  • Moderadores
  • PipPipPip
  • 3.773 mensajes
  • LocationMadrid - España

Escrito 01 noviembre 2016 - 12:35

Para confeccionar un sistema que proteja a nuestras aplicaciones de las inyecciones dll no deseadas de código hay que entender cómo se realiza el proceso de inyección. Todo proceso de inyección precisa de varias acciones comunes como son abrir un proceso externo, escribir en su espacio de direcciones de memoria, crear un hilo remoto en dicho proceso y obligarle con ello a cargar una dll no deseada. Existe otro tipo de inyección, más sofisticada, que no necesita crear un hilo remoto sino que suspende un hilo ya existente para inyectarle de forma directa  un pequeño shellcode que se encargará de cargar la dll. Ambas inyecciones han sido tratadas en el foro en diversas ocasiones. Las API implicadas en estas técnicas son varias pero las más importantes son:

 

OpenProcess
WriteProcessMemory
CreateRemoteThread
OpenThread
LoadLibrary
SetWindowsHookEx
 
Conocidas estas bases, la forma de evitar la inyección, requeriría del bloqueo del uso de esas APIs, pero nos encontramos con un problema, son legales. De todas ellas, quizás CreateRemoteThread es la más sospechosa, ¿Qué hace un proceso externo tratando de ejecutar un hilo en mi aplicación? Es por eso que muchos antivirus la consideran heurísticamente perniciosa.

 

La inyección dll siempre termina provocando una llamada a LoadLibrary en el proceso atacado, si la bloqueamos, bloqueamos la inyección, pero también impediremos la carga dinámica de APIs, costumbre que muchas aplicaciones tienen.

 

Quizás la mejor forma de protegerse contra inyecciones de código sea en el mismo momento de escribir nuestra nueva aplicación, sabiendo de antemano cuantas y cuales dlls han de cargarse y evitar el resto.
En definitiva, el asunto no es fácil de manejar, sobre todo cuando tratamos de proteger aplicaciones de terceros.

La siguiente pregunta que nos hacemos es como conseguimos bloquear las APIs, la respuesta es mediante un Hook a las mismas y la inyección a todos los procesos del sistema y los nacientes. Además deberemos intentar discernir cuando su uso es legal y cuando es un ataque.
 
Otra cuestión es si la protección la queremos a nivel usuario o Kernel, En el segundo caso precisamos de un driver para cada versión de S.O. que realice el Hook a las Apis que queremos controlar. Sobre este tema ya publique alguna cosa en el foro platino y la necesidad de ser muy cuidadosos, no solo para no provocar la caída del S.O. sino para evitar los propios A.V. También os mostré una técnica para ello.
 
Lo que ahora os voy a mostrar es una prueba de concepto de un sistema de protección general que inyecta una dll a todos los procesos del sistema y a los nacientes para realizar un hook a tres APIs: OpenProcess, CreateRemoteThread y LdrLoadDll. La última API es donde termina cualquier llamada a LoadLibrary y últimamente puesta de moda por ser indocumentada, se está usando para saltarse cualquier control de LoadLibrary. También incluiré un sistema de control que informará del proceso sobra el que esas APIs no tienen permiso de actuación, dejándolas libres para el resto. Esto es así para evitar el bloqueo en acciones legales.
 
Ya publiqué como realizar un Hook a la API y las diferentes técnicas, en este caso hay que hacerlo mediante un trampolín.
 
El sistema de comunicación entre la dll que inyectaremos y el proceso de control, será la memoria compartida, enviando el Pid del proceso que queremos proteger.
 


delphi
  1. //----------------------------------------------------------------------------
  2. // La APIs Hookeadas
  3. function NewOpenProcess(dwDesiredAccess: DWORD; bInheritHandle: BOOL; dwProcessId: DWORD): THANDLE; stdcall;
  4. begin
  5.   Result:= THANDLE(0);
  6.   if (dwProcessId = PDWORD(Memory.Buffer)^) and (dwDesiredAccess and PROCESS_VM_WRITE = PROCESS_VM_WRITE) then
  7.     LockMessage('OpenProcess')
  8.   else
  9.     Result:= OldOpenProcess(dwDesiredAccess, bInheritHandle, dwProcessId);
  10. end;
  11.  
  12. function NewCreateRemoteThread(hProcess: THandle; lpThreadAttributes: Pointer;
  13.                                dwStackSize: DWORD; lpStartAddress: TFNThreadStartRoutine; lpParameter: Pointer;
  14.                                dwCreationFlags: DWORD; var lpThreadId: DWORD): THandle; stdcall;
  15. begin
  16.   Result:= THANDLE(0);
  17.   LockMessage('CreateRemoteThread');
  18. end;
  19.  
  20. function NewLdrLoadDll(PathToFile: PWCHAR; Flags: ULONG; ModuleFileName: PUNICODE_STRING; ModuleHandle: PHANDLE): DWORD; stdcall;
  21. begin
  22.   Result:= ERROR_ACCESS_DENIED;
  23.   if GetCurrentProcessId = PDWORD(Memory.Buffer)^ then
  24.     LockMessage('LdrLoadDll')
  25.   else
  26.     Result:= OldLdrLoadDll(PathToFile, Flags, ModuleFileName, ModuleHandle);
  27. end;

Este código forma parte de la dll que inyectaremos en todos los procesos. Como podéis observar, el bloqueo de  CreateRemoteThread es total para todos los procesos, el bloqueo de OpenProcess se circunscribe al permiso de escritura sobre el proceso a proteger y  LdrLoadDll se bloquea totalmente para el proceso a proteger, esto le va a impedir la carga dinámica de funciones en dlls aunque sea legal. Solo sabiendo previamente que dll necesita, o conociendo la dll maligna podríamos hacer un control selectivo.
 
LockMessage se encarga de avisar del bloqueo informando del proceso inyector, en este punto se pueden añadir acciones como matar dicho proceso.
 
La técnica del Hook a las APIs es la misma que usé en el tutorial HOOK a la API en delphi y en C (trampolín). Se tata se un sistema automatizado para realizar un hook a cualquier API en modo usuario, no sirve para Ring0.
 
La forma de conseguir una inyección en todos los procesos se la vamos a dejar al mismo Windows realizando un hook global. La dll también incorpora un sistema de liberación. Puede cambiarse por inyección individualizada con un código como este, pero deberemos conocer que proceso nos ataca:


delphi
  1. function InjectCRT(Pid: integer; dll: PCHAR): BOOL;
  2. var
  3.    hThread:  THANDLE;
  4.    ExitCode: DWORD;
  5.    hLib:     Pointer;//LPTHREAD_START_ROUTINE;
  6.    hProc:    THANDLE;
  7.    Buffer:   Pointer;
  8. begin
  9.    Result:= false;
  10.    if(dll^ = #0) then exit;
  11.  
  12.    hThread:= 0;
  13.    ExitCode:= 0;
  14.    hProc:= OpenProcess(PROCESS_ALL_ACCESS, false, Pid);
  15.    if hProc<>0 then
  16.    begin
  17.      Buffer:= VirtualAllocEx(hProc, nil, lstrlen(dll)+1, MEM_COMMIT or MEM_RESERVE, PAGE_READWRITE);
  18.      if Buffer<>nil then
  19.      begin
  20.        if WriteProcessMemory(hProc, Buffer, dll, lstrlen(dll)+1, PDWORD(0)^) then
  21.        begin
  22.          hLib:= GetProcAddress(GetModuleHandle('Kernel32.dll'), 'LoadLibraryA');
  23.          if hLib <> nil then
  24.          begin
  25.            hThread:= CreateRemoteThread(hProc, nil, 0, hLib, Buffer, 0, PDWORD(0)^);
  26.            if hThread <> 0 then
  27.            begin
  28.              // libero la memoria localizada...
  29.              WaitForSingleObject(hThread, INFINITE);  // Espero a que se cree y termine el Thread
  30.              GetExitCodeThread(hThread, ExitCode);    // Extraigo el código de terminación del Thread
  31.              CloseHandle(hThread);                    // Cierro el Handle hThread
  32.            end;
  33.          end;
  34.        end;
  35.        VirtualFreeEx(hProc, Buffer, 0, MEM_RELEASE);  // Libero memoria
  36.      end;
  37.      CloseHandle(hProc);                       // Cierro el Handle hProc
  38.    end;
  39.    Result:= (ExitCode <> 0);
  40. end;

He de decir que la inyección solo se va a producir en procesos de 32 bits si nuestro código se escribe en esa plataforma. También he de decir que a la hora de desinstalar el sistema puede haber problemas con alguna aplicación, en concreto Acrobat Reader se cae porque tiene un sistema de protección anti hook, también Firefox puede caer en la batalla por su costumbre de cargar APIs de forma dinámica, son daños colaterales que se evitan seleccionando un poco mejor nuestro ataque defensivo y según la circunstancia particular, puede que no importe mucho.
 
He probado la protección con una aplicación inyectora de mi autoría que nunca he publicado y que me permite seleccionar la inyección o liberarla. No estaría de más usar otro tipo de inyectores que pueden encontrarse en la web y cuya seguridad en cuanto a portar malware es dudosa.
 
Subo el código completo y funcional, con un programita control que se encarga de realizar la inyección global, cuya funcionalidad está en la propia dll y de la comunicación con la misma. En principio solo protege a un proceso, pero nada nos impide enviar un array de procesos.
 
El tema queda abierto a sugerencias, ya que alguien me pidió que lo tratara en el foro.
 
 
Espero que sea de utilidad.
 
 
Saludos.

Archivos adjuntos


  • 2

#2 escafandra

escafandra

    Advanced Member

  • Moderadores
  • PipPipPip
  • 3.773 mensajes
  • LocationMadrid - España

Escrito 01 noviembre 2016 - 01:15

Como complemento subo un programita que va a usar las APIs bloqueadas contra si mismo para que comprobéis el resultado.

 

 

Saludos.

Archivos adjuntos


  • 2

#3 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.385 mensajes
  • LocationRepública Dominicana

Escrito 01 noviembre 2016 - 05:12

Eres un crack!! como dicen la juventud de ahora jajaja


  • 1

#4 retxel

retxel

    Newbie

  • Miembros
  • Pip
  • 2 mensajes

Escrito 08 noviembre 2016 - 01:18

Increible aporte, gran solución contra las inyecciones, funciona perfecto a nivel de usuario... Sin palabrasssssss. (y)


  • 0

#5 Dante

Dante

    Advanced Member

  • Miembros
  • PipPipPip
  • 87 mensajes

Escrito 11 noviembre 2016 - 09:06

eso esta ultra ya lo estoy probando


  • 0

#6 Dante

Dante

    Advanced Member

  • Miembros
  • PipPipPip
  • 87 mensajes

Escrito 11 noviembre 2016 - 09:07

escafandra me podrias mandar los parametros para agregar WriteProcessMemory


  • 0

#7 escafandra

escafandra

    Advanced Member

  • Moderadores
  • PipPipPip
  • 3.773 mensajes
  • LocationMadrid - España

Escrito 11 noviembre 2016 - 11:37

Quizás sea más interesante que estudies NtWriteVirtualMemory.
 
 
Saludos.
  • 0

#8 Dante

Dante

    Advanced Member

  • Miembros
  • PipPipPip
  • 87 mensajes

Escrito 11 noviembre 2016 - 01:49

e intentedo agregar la aip NtWriteVirtualMemory


delphi
  1. library Hookdll;
  2.  
  3. uses
  4. SysUtils, Windows, APIHook, SharedMemory;
  5.  
  6. function GetProcessId(hProcess: THANDLE): DWORD; stdcall; external Kernel32;
  7.  
  8. type
  9. PUNICODE_STRING = ^UNICODE_STRING;
  10. UNICODE_STRING = record
  11. Length: WORD; //USHORT;
  12. MaximumLength: WORD; //USHORT;
  13. Buffer: PWCHAR; //PWSTR;
  14. end;
  15.  
  16. POpenProcess = function(dwDesiredAccess: DWORD; bInheritHandle: BOOL; dwProcessId: DWORD): THANDLE; stdcall;
  17. PCreateRemoteThread = function(hProcess: THandle; lpThreadAttributes: Pointer;
  18. dwStackSize: DWORD; lpStartAddress: TFNThreadStartRoutine; lpParameter: Pointer;
  19. dwCreationFlags: DWORD; var lpThreadId: DWORD): THandle; stdcall;
  20. PLdrLoadDll = function(PathToFile: PWCHAR; Flags: ULONG; ModuleFileName: PUNICODE_STRING; ModuleHandle: PHANDLE): DWORD; stdcall;
  21. PNtWriteVirtualMemory = function(ProcessHandle: THandle; BaseAddress: Pointer; Buffer: Pointer;
  22. NumberOfBytesToWrite: ULONG ; NumberOfBytesWritten: PULONG): DWORD; stdcall;
  23. var
  24. OldOpenProcess: POpenProcess = nil;
  25. OldCreateRemoteThread: PCreateRemoteThread = nil;
  26. OldLdrLoadDll: PLdrLoadDll = nil;
  27. OldNtWriteVirtualMemory: PNtWriteVirtualMemory = nil;
  28. WinHook: HHOOK = 0;
  29. Module: HMODULE = 0;
  30. Memory: TSharedMemory;
  31.  
  32.  
  33.  
  34. //----------------------------------------------------------------------------
  35.  
  36.  
  37. // Mensaje de bloqueo
  38. procedure LockMessage(APIName: PCHAR); stdcall;
  39. var
  40. AppName: array[0..259] of CHAR;
  41. begin
  42.  
  43. SetLastError(5);
  44. GetModuleFileNameA(0, AppName, 260);
  45. MessageBox(0, PCHAR('No se permiten inyecciones '+#13+#10 + String(AppName)), PCHAR('Error ' + String(APIName)), MB_ICONEXCLAMATION)
  46.  
  47. end;
  48.  
  49. //----------------------------------------------------------------------------
  50. // La APIs Hookeadas
  51. function NewOpenProcess(dwDesiredAccess: DWORD; bInheritHandle: BOOL; dwProcessId: DWORD): THANDLE; stdcall;
  52. begin
  53.  
  54. Result:= THANDLE(0);
  55. if (dwProcessId = PDWORD(Memory.Buffer)^) and (dwDesiredAccess and PROCESS_VM_WRITE = PROCESS_VM_WRITE) then
  56. LockMessage('OpenProcess')
  57. else
  58. Result:= OldOpenProcess(dwDesiredAccess, bInheritHandle, dwProcessId);
  59.  
  60. end;
  61.  
  62. function NewCreateRemoteThread(hProcess: THandle; lpThreadAttributes: Pointer;
  63. dwStackSize: DWORD; lpStartAddress: TFNThreadStartRoutine; lpParameter: Pointer;
  64. dwCreationFlags: DWORD; var lpThreadId: DWORD): THandle; stdcall;
  65. begin
  66.  
  67. Result:= THANDLE(0);
  68. LockMessage('CreateRemoteThread');
  69. {
  70.   if (GetProcessId(hProcess) <> 0) and (GetProcessId(hProcess) = PDWORD(Memory.Buffer)^) then
  71.   MessageBox(0, 'No se permiten inyecciones', 'Error', MB_ICONEXCLAMATION)
  72.   else if lpStartAddress <> nil then
  73.   try
  74.   Result:= OldCreateRemoteThread(hProcess, lpThreadAttributes, dwStackSize, lpStartAddress, lpParameter, dwCreationFlags, lpThreadId);
  75.   finally
  76.   end;
  77. }
  78. end;
  79.  
  80. function NewLdrLoadDll(PathToFile: PWCHAR; Flags: ULONG; ModuleFileName: PUNICODE_STRING; ModuleHandle: PHANDLE): DWORD; stdcall;
  81. begin
  82. Result:= ERROR_ACCESS_DENIED;
  83. if GetCurrentProcessId = PDWORD(Memory.Buffer)^ then
  84. LockMessage('LdrLoadDll')
  85. else
  86. Result:= OldLdrLoadDll(PathToFile, Flags, ModuleFileName, ModuleHandle);
  87. end;
  88.  
  89. function NewNtWriteVirtualMemory(ProcessHandle: THandle; BaseAddress: Pointer; Buffer: Pointer;
  90. NumberOfBytesToWrite: ULONG ; NumberOfBytesWritten: PULONG): DWORD; stdcall;
  91. begin
  92. Result:= ERROR_ACCESS_DENIED;
  93. if GetCurrentProcessId = PDWORD(Memory.Buffer)^ then
  94. LockMessage('NtWriteVirtualMemory')
  95. else
  96. Result:= OldNtWriteVirtualMemory(ProcessHandle, BaseAddress, Buffer, NumberOfBytesToWrite,NumberOfBytesWritten);
  97. end;
  98.  
  99.  
  100.  
  101.  
  102.  
  103.  
  104.  
  105.  
  106. //----------------------------------------------------------------------------
  107. // Instalando los Hooks a las API
  108. procedure InstallHooks;
  109. begin
  110. InstallHook(@NewOpenProcess, @OldOpenProcess, 'Kernel32.dll', 'OpenProcess', true);
  111. InstallHook(@NewCreateRemoteThread, @OldCreateRemoteThread, 'Kernel32.dll', 'CreateRemoteThread', true);
  112. InstallHook(@NewLdrLoadDll, @OldLdrLoadDll, 'ntdll.dll', 'LdrLoadDll', true);
  113. InstallHook(@NewNtWriteVirtualMemory, @OldNtWriteVirtualMemory, 'ntdll.dll', 'NewNtWriteVirtualMemory', true);
  114. end;
  115.  
  116. //----------------------------------------------------------------------------
  117. // Desinstalando todos los Hooks
  118. procedure UnInstallHooks;
  119. begin
  120. UnInstallHook(@OldOpenProcess, 'Kernel32.dll', 'OpenProcess');
  121. UnInstallHook(@OldCreateRemoteThread, 'Kernel32.dll', 'CreateRemoteThread');
  122. UnInstallHook(@OldLdrLoadDll, 'ntdll.dll', 'LdrLoadDll');
  123. UnInstallHook(@OldNtWriteVirtualMemory, 'ntdll.dll', 'NewNtWriteVirtualMemory');
  124. end;

me compila bien pero cuando lo voy a usar me da error


  • 0

#9 escafandra

escafandra

    Advanced Member

  • Moderadores
  • PipPipPip
  • 3.773 mensajes
  • LocationMadrid - España

Escrito 11 noviembre 2016 - 04:15

Varias cosas:


delphi
  1. InstallHook(@NewNtWriteVirtualMemory, @OldNtWriteVirtualMemory, 'ntdll.dll', 'NewNtWriteVirtualMemory', true);

1. La API que pretendes enganchar es NtWriteVirtualMemory no NewNtWriteVirtualMemory. No la encuentra en ntdll.dll y tienes un error de ejecución. Lo mismo pasa con la linea que libera el Hook.
2. NewNtWriteVirtualMemory nunca hará el trabajo que deseas con ese código, debes encontrar el PId del proceso donde pretende escribir y compararlo que el que pretendes proteger.
3. Fue un error mío sugerirte NtWriteVirtualMemory, sería correcto para WinXP pero no en Win10, al memos. Así que el hook debe hacerse a WriteProcessMemory que está en Kernel32.dll


delphi
  1. PWriteProcessMemory = function(ProcessHandle: THandle; BaseAddress: Pointer; Buffer: Pointer;
  2.                             NumberOfBytesToWrite: ULONG; var NumberOfBytesWritten: ULONG): BOOL; stdcall;
  3.  
  4. .....................
  5.  
  6.  
  7. InstallHook(@NewWriteProcessMemory, @OldWriteProcessMemory, 'Kernel32.dll', 'WriteProcessMemory', true);


delphi
  1. function NewWriteProcessMemory(ProcessHandle: THandle; BaseAddress: Pointer; Buffer: Pointer;
  2. NumberOfBytesToWrite: ULONG; var NumberOfBytesWritten: ULONG): BOOL; stdcall;
  3. begin
  4. Result:= FALSE;
  5. if GetProcessId(ProcessHandle) = PDWORD(Memory.Buffer)^ then
  6. LockMessage('NtWriteVirtualMemory')
  7. else
  8. Result:= OldWriteProcessMemory(ProcessHandle, BaseAddress, Buffer, NumberOfBytesToWrite,NumberOfBytesWritten);
  9. end;

Además de las protecciones con Hooks, se debe considerar un sistema que evite la ejecución de determinados programas prohibidos, en este sentido, recordar este tema: TerminateMD5_Process, a la caza de un virus...
Otra posibilidad es bloquearlos en el Registro de Windows o implementar un escritorio que no permita hacer nada más que lo que queramos, claro, que eso altera totalmente la funcionalidad del PC que pretende la inyección.
 
Se debe recordar que esto no protege frente una escritura desde el Kernel mediante la API KeStackAttachProcess
 
 
Saludos.


  • 0

#10 Dante

Dante

    Advanced Member

  • Miembros
  • PipPipPip
  • 87 mensajes

Escrito 30 noviembre 2016 - 03:40

tengo un grabe problema ahora:

esta ultima dll   Client+Hook.rar pincho demasido bien tanto q ve a  todo el sistema corrupto, trate de quitarle el GlobalDllInject para que me hookeara solo a la proceso q deseo pero me da error, entonces trate de hardcodeada la del zip.gif  AntiInject.rar  pero no me trabaja, comproble q se ejecutaba el procedimiento GlobalHook con un mensaje pero no me hookea nada, ahora la ejecuto sin hardcodeada y me funciona de maravilla


  • 0

#11 escafandra

escafandra

    Advanced Member

  • Moderadores
  • PipPipPip
  • 3.773 mensajes
  • LocationMadrid - España

Escrito 30 noviembre 2016 - 06:27

tengo un grabe problema ahora:

esta ultima dll   Client+Hook.rar pincho demasido bien tanto q ve a  todo el sistema corrupto, trate de quitarle el GlobalDllInject para que me hookeara solo a la proceso q deseo pero me da error, entonces trate de hardcodeada la del zip.gif  AntiInject.rar  pero no me trabaja, comproble q se ejecutaba el procedimiento GlobalHook con un mensaje pero no me hookea nada, ahora la ejecuto sin hardcodeada y me funciona de maravilla

 

No entiendo bien lo que quieres decir.

 

Si cambias el código de la dll, ten en cuenta:

1.- Que su nombre está encriptado

2.- Que usa MD5 para comprobar su integridad, con lo que deberás cambiar su valor o el cliente se interrumpe impidiendo que el jugador conecte al servidor.

3.- Que deberás hardcodear el nuevo binario de la dll.

4.- Para los puntos 2 y 3 usa FileToCode.exe

 

 

Saludos.


  • 0

#12 Dante

Dante

    Advanced Member

  • Miembros
  • PipPipPip
  • 87 mensajes

Escrito 02 diciembre 2016 - 07:23

comprobe que la dll se desencriptaba bien poniendole un mensage en el procedimiento GlobalHook y cuando invoco este procedimiento me mostro el mensage pero no me hookio las apis, q otra cosa podria estar haciendo mal, sin hardcodeada la dll me funciona de maravilla.


  • 0

#13 escafandra

escafandra

    Advanced Member

  • Moderadores
  • PipPipPip
  • 3.773 mensajes
  • LocationMadrid - España

Escrito 02 diciembre 2016 - 12:36

Tendrás que poner el código para ver que pasa. El de mi ejemplo me funciona Ok.

 

Saludos.


  • 0

#14 Dante

Dante

    Advanced Member

  • Miembros
  • PipPipPip
  • 87 mensajes

Escrito 02 diciembre 2016 - 02:16

este es el codigo de la dll


delphi
  1. library Hookdll;
  2.  
  3. uses
  4. APIHook,
  5. SharedMemory,
  6. winapi.Windows;
  7.  
  8. function GetProcessId(hProcess: THANDLE): DWORD; stdcall; external Kernel32;
  9.  
  10. type
  11. PUNICODE_STRING = ^UNICODE_STRING;
  12. UNICODE_STRING = record
  13. Length: WORD; //USHORT;
  14. MaximumLength: WORD; //USHORT;
  15. Buffer: PWCHAR; //PWSTR;
  16. end;
  17.  
  18. POpenProcess = function(dwDesiredAccess: DWORD; bInheritHandle: BOOL; dwProcessId: DWORD): THANDLE; stdcall;
  19. PCreateRemoteThread = function(hProcess: THandle; lpThreadAttributes: Pointer;
  20. dwStackSize: DWORD; lpStartAddress: TFNThreadStartRoutine; lpParameter: Pointer;
  21. dwCreationFlags: DWORD; var lpThreadId: DWORD): THandle; stdcall;
  22. PLdrLoadDll = function(PathToFile: PWCHAR; Flags: ULONG; ModuleFileName: PUNICODE_STRING; ModuleHandle: PHANDLE): DWORD; stdcall;
  23.  
  24. var
  25. OldOpenProcess: POpenProcess = nil;
  26. OldCreateRemoteThread: PCreateRemoteThread = nil;
  27. OldLdrLoadDll: PLdrLoadDll = nil;
  28.  
  29. WinHook: HHOOK = 0;
  30. Module: HMODULE = 0;
  31. Memory: TSharedMemory;
  32.  
  33. //----------------------------------------------------------------------------
  34.  
  35.  
  36. // Mensaje de bloqueo
  37. procedure LockMessage(APIName: PCHAR); stdcall;
  38. var
  39. AppName: PAnsichar;
  40. begin
  41. SetLastError(5);
  42. GetModuleFileNameA(0,AppName , 260);
  43. MessageBox(0, PCHAR('No se permiten inyecciones '+#13+#10 + AppName), PCHAR('Error ' + String(APIName)), MB_ICONEXCLAMATION);
  44.  
  45. end;
  46.  
  47. //----------------------------------------------------------------------------
  48. // La APIs Hookeadas
  49. function NewOpenProcess(dwDesiredAccess: DWORD; bInheritHandle: BOOL; dwProcessId: DWORD): THANDLE; stdcall;
  50. begin
  51. Result:= THANDLE(0);
  52. if (dwProcessId = PDWORD(Memory.Buffer)^) and (dwDesiredAccess and PROCESS_VM_WRITE = PROCESS_VM_WRITE) then
  53. LockMessage('OpenProcess')
  54. else
  55. Result:= OldOpenProcess(dwDesiredAccess, bInheritHandle, dwProcessId);
  56. end;
  57.  
  58. function NewCreateRemoteThread(hProcess: THandle; lpThreadAttributes: Pointer;
  59. dwStackSize: DWORD; lpStartAddress: TFNThreadStartRoutine; lpParameter: Pointer;
  60. dwCreationFlags: DWORD; var lpThreadId: DWORD): THandle; stdcall;
  61. begin
  62. Result:= THANDLE(0);
  63. LockMessage('CreateRemoteThread');
  64. {
  65.   if (GetProcessId(hProcess) <> 0) and (GetProcessId(hProcess) = PDWORD(Memory.Buffer)^) then
  66.   LockMessage('CreateRemoteThread')
  67.   else if lpStartAddress <> nil then
  68.   try
  69.   Result:= OldCreateRemoteThread(hProcess, lpThreadAttributes, dwStackSize, lpStartAddress, lpParameter, dwCreationFlags, lpThreadId);
  70.   finally
  71.   end;
  72.   }
  73. end;
  74.  
  75. function NewLdrLoadDll(PathToFile: PWCHAR; Flags: ULONG; ModuleFileName: PUNICODE_STRING; ModuleHandle: PHANDLE): DWORD; stdcall;
  76. begin
  77. Result:= ERROR_ACCESS_DENIED;
  78. if GetCurrentProcessId = PDWORD(Memory.Buffer)^ then
  79. LockMessage('LdrLoadDll')
  80. else
  81. Result:= OldLdrLoadDll(PathToFile, Flags, ModuleFileName, ModuleHandle);
  82. end;
  83.  
  84. //----------------------------------------------------------------------------
  85. // Instalando los Hooks a las API
  86. procedure InstallHooks;
  87. begin
  88. InstallHook(@NewOpenProcess, @OldOpenProcess, 'Kernel32.dll', 'OpenProcess', true);
  89. InstallHook(@NewCreateRemoteThread, @OldCreateRemoteThread, 'Kernel32.dll', 'CreateRemoteThread', true);
  90. InstallHook(@NewLdrLoadDll, @OldLdrLoadDll, 'ntdll.dll', 'LdrLoadDll', true);
  91. end;
  92.  
  93. //----------------------------------------------------------------------------
  94. // Desinstalando todos los Hooks
  95. procedure UnInstallHooks;
  96. begin
  97. UnInstallHook(@OldOpenProcess, 'Kernel32.dll', 'OpenProcess');
  98. UnInstallHook(@OldCreateRemoteThread, 'Kernel32.dll', 'CreateRemoteThread');
  99. UnInstallHook(@OldLdrLoadDll, 'ntdll.dll', 'LdrLoadDll');
  100. end;
  101.  
  102. //----------------------------------------------------------------------------
  103. // Provocamos el Hook Global. La dll se inyectará en todo el sistema de ventanas
  104. function HookPorc(nCode: integer; wParam, lParam: DWORD): DWORD; stdcall;
  105. begin
  106. Result:= CallNextHookEx(WinHook, nCode, wParam, lParam);
  107. end;
  108.  
  109. procedure GlobalHook; stdcall;
  110. begin
  111. MessageBox(0,'Prueba','Prueba',MB_OK);
  112. if WinHook = 0 then
  113. WinHook:= SetWindowsHookEx(WH_CALLWNDPROC, @HookPorc, Module, 0);
  114.  
  115. end;
  116.  
  117. procedure GlobalUnHook; stdcall;
  118. begin
  119. if WinHook <> 0 then
  120. UnhookWindowsHookEx(WinHook);
  121. end;
  122.  
  123. //----------------------------------------------------------------------------
  124. procedure DllMain(reason: integer);
  125. begin
  126. case reason of
  127. DLL_PROCESS_ATTACH:
  128. begin
  129. Memory:= TSharedMemory.Create('_AntiInjector_', 32);
  130. InstallHooks;
  131. end;
  132. DLL_PROCESS_DETACH:
  133. begin
  134. UnInstallHooks;
  135. Memory.Free;
  136. end;
  137. end;
  138. end;
  139.  
  140. //----------------------------------------------------------------------------
  141. exports
  142. GlobalHook,
  143. GlobalUnHook;
  144.  
  145. //----------------------------------------------------------------------------
  146. begin
  147. Module:= GetModuleHandle('Hookdll.dll');
  148. DllProc := @DllMain;
  149. DllProc(DLL_PROCESS_ATTACH);
  150.  
  151. end.


  • 0

#15 Dante

Dante

    Advanced Member

  • Miembros
  • PipPipPip
  • 87 mensajes

Escrito 02 diciembre 2016 - 02:16

esa es una de las primeras q subistes pues la ultima me bloquea todo


  • 0

#16 escafandra

escafandra

    Advanced Member

  • Moderadores
  • PipPipPip
  • 3.773 mensajes
  • LocationMadrid - España

Escrito 02 diciembre 2016 - 03:14

GlobalDllInject es la causante de que se inyecte en todos los procesos y se ejecuta en un thread:
 


delphi
  1. function ThInyect(Param: Pointer): DWORD; stdcall;
  2. begin
  3.   repeat
  4.     GlobalDllInject(FulDllName);
  5.     Sleep(30000);
  6.   until Terminated;
  7.   Result:= 0;
  8. end;

GlobalHook provoca también la inyección en todo el sistema de ventanas. ThInyect está de apoyo.

GlobalHook inyecta automáticamente y no se ejecuta al iniciar la dll, al contrario que ThInyect. Para que se ejecute debes llamarla una vez cargada la dll en el proceso que la porta, eso solo puede ocurrir tras liberala, esperar a que esté liberada y hacer un LoadLibrary. En los ejemplos que subí, así lo hace. Si tratas de cargarla antes, no funcionará.

Si solo quieres inyectar en procesos determinados, debes hacerlo con InjectCRT, pero OJO, puede bloquear la inyección si el PID del proceso que trata de hacerlo está en la lista de procesos a proteger, pues esa es la verdadera función de la dll, bloqueando la inyección.

 

Posiblemente no estés esperando bien a que la dll hardcodeada esté escrita correctamente en el HD y por eso te falla.

 

Este es el código que la libera y arranca:


delphi
  1. Crypt(@DllName[0], sizeof(DllName)-1, Clave, 0);
  2. if ExtractHookdll then
  3. begin
  4. hLib:= LoadLibrary(DllName);
  5. if hLib <> 0 then
  6. begin
  7. GlobalHook:= GetProcAddress(hLib, 'GlobalHook');
  8. if @GlobalHook <> nil then
  9. begin
  10. GlobalHook;
  11. Client;
  12. end;
  13. end;
  14. end;

Si no está liberada, hLib:= LoadLibrary(DllName); hLib será 0. Juega con esa parte del código. Un truco es meter hLib:= LoadLibrary(DllName) en un bucle que se repita unas cuantas veces con un sleep de 100 ms, por ejemplo. Pero debería cargar a la primera.

 

Saludos.


  • 0