Siempre esta el problema de querer usar CreateRemoteThread en una aplicacion (no malware precisamente) y los antivirus suelen marcar ya el programa como peligroso. ahora bien, CreateThread no es detectado como algo peligroso, pero ¿quien es realmente CreateThread?. Esta funcion es un wrapper, alias o como quieras llamarlo de CreateRemoteThread, aceptando 1 parametro menos ya que si se desensambla la funcion se ve claramente que dentro de esta marca el handle del proceso a -1, o lo que es lo mismo a el proceso que a llamado a la funcion. La cosa es simple, necesitamos un puntero a CreateThread y buscar el call a CreateRemoteThread dentro de la funcion, meter los parametros de la funcion en la pila y hacer un jmp a dicho call. de este modo se a injectado la dll "sin" tener que usar la maldita funcion.
El codigo es una chorrada, es expresamente para poner un ejemplo de la idea en codigo. a la hora de usarlo en una aplicacion real se tienen que tener algunas cosas en cuenta.
Código:
format PE GUI 4.0
entry Main
include 'win32a.inc'
section '.data' data readable writeable
cPtr dd 0
section '.idata' import data readable writeable
library kernel32,'KERNEL32.DLL',\
user32,'USER32.DLL'
include 'api\kernel32.inc'
include 'api\user32.inc'
section '.text' code readable writeable executable
Main:
push 0
push 0
push 0
push InjectaDll
push 0
push 0
call [CreateThread]
push 6h ;Esto es solo para la prueba.
call [Sleep]
push 0
call [ExitProcess]
proc InjectaDll
push edi
mov eax,0E8h
mov edi,dword [CreateThread]
S:
repne scasb
jnz S
dec edi
mov [cPtr],edi
pop edi
push 3532 ;Process Id
push 1
push PROCESS_ALL_ACCESS
call [OpenProcess]
or eax,eax
jz Fin
push 0
push 0
push 0
push 41414141h
push 0
push 0
push eax
jmp [cPtr] ;CreateRemoteThread
Fin:
; En caso de error
endp