Func InjectDLL($sDLLPath, $sProcess)
Const $PROCESS_ALL_ACCESS = 0x1F0FFF
Const $MEM_RESERVE = 0x00001000
Const $PAGE_READWRITE = 0x40
;Obtenemos el PID del proceso a injectar
Local $sProcessID = ProcessExists($sProcess)
;Si el PID es 0, ejecutamos el proceso y obtenemos el PID de este
if $sProcessID = 0 then
ShellExecute($sProcess)
$sProcessID = ProcessExists($sProcess)
EndIf
;Damos tiempo para que se abra el proceso, si no se da el tiempo de espera el proceso se cuelga
Sleep(500)
;Abrimos el objeto del proceso existente
Local $sOpen = DllCall('Kernel32.dll', 'handle', 'OpenProcess', 'dword', $PROCESS_ALL_ACCESS, 'bool', False, 'dword', $sProcessID)
;depuramos para saber si existe algun error
if @error then
MsgBox(64, 'ERROR', 'Hubo un error abriendo el proceso ' & $sProcess)
EndIf
;Reservamos memoria en el objeto del proceso que abrimos anteriormente
Local $sStruct = DllStructCreate('byte[' & BinaryLen($sDLLPath) & ']')
Local $sMemory = DllCall('Kernel32.dll', 'handle', 'VirtualAllocEx', 'handle', $sOpen[0], 'ptr', 0, 'ULONG_PTR', DllStructGetSize($sStruct), 'dword', $MEM_RESERVE, 'dword', $PAGE_READWRITE)
;depuramos para saber si existe algun error
if @error then
MsgBox(64, '', 'Hubo un error reservando memoria')
EndIf
;Escribimos en el espacio de memoria obtenido anteriormente la ruta de la DLL
DllCall('Kernel32.dll', 'int', 'WriteProcessMemory', 'handle', $sOpen[0], 'ptr', $sMemory[0], 'str', $sDLLPath, 'ULONG_PTR',DllStructGetSize($sStruct), 'ULONG_PTR', 0)
;depuramos para saber si existe algun error
if @error then
MsgBox(64, '', 'Hubo un error en la escritura en memoria')
EndIf
;Obtenemos la direccion de LoadLibrary, para ello utilizamos GetProcAdress.
Local $sGetModuleHandle = DllCall('Kernel32.dll', 'handle', 'GetModuleHandle', 'str', 'Kernel32.dll')
Local $sGetProcAdress = DllCall('Kernel32.dll', 'handle', 'GetProcAddress', 'dword', $sGetModuleHandle[0], 'str', 'LoadLibrary')
;depuramos para saber si existe algun error
if @error then
MsgBox(64, '', 'Hubo un error obteniendo la direccion de LoadLibrary')
EndIf
;Lanzamos un hilo con CreateRemoteThread, dando como punto de entrada la direccion de LoadLibrary
Local $sRemoteThread = DllCall('Kernel32.dll', 'Bool', 'CreateRemoteThread', 'int', $sOpen[0], 'ptr', 0, 'ULONG_PTR', 0, 'ptr', $sGetProcAdress[0], 'ptr',$sMemory[0], 'dword', 0, 'dword', 0)
;depuramos para saber si existe algun error
if @error then
MsgBox(64, '', 'Hubo un error lanzando el hilo')
EndIf
if $sRemoteThread = False then
MsgBox(64, '', 'Error Injectando la DLL')
Else
MsgBox(64, '', 'DLL Injectada con exito')
EndIf
EndFunc
SaludosBueno ando unos días con la inyección DLL en autoit, he visto varios sources y papers que hay sobre el funcionamiento y he conseguido este code. El problema es que no encuentro el problema de porque no inyecta la DLL, la API "GetLastError" me da un error 127 (Creo) en el WriteProcessMemory, pero aun así no encuentro el problema.
Skype: naker.noventa