Este source es un pedazo de el código que hice para hookear a una API, inyecta código en un nuevo hilo en un proceso, en el ejemplo puse que se ejecutara un msgbox jeje lo comenté para que se entendiera mejor.
Format PE GUI 4.0
entry start
include 'win32ax.inc'
;@Inyección en memoria FASM |
; @Coder: linkgl |
;_____________________________________|
;Variables necesarias para el programa que va a inyectar
proceso db 'c:\crackme2.exe',0
linkpi PROCESS_INFORMATION <>
linksi STARTUPINFO <>
temp dd ?,0
tempu dd ?,0
tam dd ?,0
handle dd ?,0
start:
;Creamos el proceso
invoke CreateProcessA,0,addr proceso,0,0,0,CREATE_SUSPENDED,0,0,linksi,linkpi
;Cargamos user32.dll y sacamos la direccion virtual de MessageBoxA
invoke LoadLibrary,"user32.dll"
mov [tempu],eax
invoke GetProcAddress,[tempu],"MessageBoxA"
mov [msgbox],eax
;Sacamos el tamaño de la funcion a inyectar restando
;la dir en memoria de la etiqueta final menos la dir virutal
;donde comienza la funcion
;(la etiqueta final obviamente debe estar al final de la funcion)
mov ebx,final
sub ebx,inyectame
mov [tam],ebx
;Reservamos el espacio en memoria del proceso
invoke VirtualAllocEx,[linkpi.hProcess],0,[tam],MEM_COMMIT+MEM_RESERVE,PAGE_EXECUTE_READWRITE
mov [handle],eax
;Escribimos nuestra funcion en el proceso
invoke WriteProcessMemory,[linkpi.hProcess],[handle],addr inyectame,[tam],0
;Creamos un nuevo hilo donde correra nuestro programa inyectado
invoke CreateRemoteThread,[linkpi.hProcess],0,0,[handle],0,0,0
; invoke Sleep,3000
;continuamos el hilo del programa normal
invoke ResumeThread,[linkpi.hThread]
ret
proc inyectame
;EDX = OffsetDelta
call offset
offset:
pop edx
sub edx,offset
;Movemos el offset delta a edi y esi
mov edi,edx
mov esi,edx
;Obtenemos la direccion de tit y msg
;con ayuda del offsetdelta
add edi,tit
add esi,msg
;llamamos a la funcion msgbox
push 0
push edi
push esi
push 0
call [edx+msgbox]
ret
msgbox dd ? ;Dirección MessageBox
tit db "Inyectado",0
msg db "Ya me inyecte",0
endp
final:
data import
library kernel32,'kernel32.dll'
import kernel32,CreateProcessA,'CreateProcessA',\
GetProcAddress,'GetProcAddress',\
VirtualAllocEx,'VirtualAllocEx',\
WriteProcessMemory,'WriteProcessMemory',\
CreateRemoteThread,'CreateRemoteThread',\
LoadLibrary,'LoadLibraryA',\
ResumeThread,'ResumeThread'
end data
Que buen aporte man!
Te modifique un poco el post para que el code se vea mejor!
Segui asi!
Dale, edita lo que veas necesario ;), pondré las etiquetas code con el lenguaje que use desde ahora xDD
Se ve muy bonito el code, Te debe haber llevado mucho trabajo. En especial si esta en ASM...
Jeje naah, de hecho es la parte fácil lo que sí me rompió un poco las pelotas fue el API Hooking que es lo que viene después de la inyección pues jamás había hecho uno jeje luego comparto el código igual no es muy difícil de entender
Que interesante se ve, algún día quiero llegar a saber bastante sobre programación, como ustedes :)
Excelente aporte! espero que despues de completar el estudio en ASM pueda entenderlo.
Muy excelente aporte, lo probaré. Y aunque me he metido hace poco en este lenguaje, quiero ver como funciona, será muy interesante. Graciaas!