Bueno 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.
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
Saludos
Skype: naker.noventa
Proba asi e nos cuenta , Buen code Naker90

Saludos

Mostrar/Ocultar

Indetectables RAT v.0.9.5

@Indetectables Team
Depuras mal :S estas depurando la llamada a dllcall no el funcionamiento del API.

para saber si fallo el API tienes que obtener el valor de retorno. por ejemplo en OpenProcess
;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 Usando DllCall")
;Para el API en si se hace así:
    if  not ($sOpen[0])  then
        MsgBox(64, 'ERROR', 'Hubo un error abriendo el proceso ' & $sProcess)
    EndIf

Saludos
Imagen
Gracias Bros, M3 aun sigue sin inyectar pero ya no se me cuelga el proceso.
Pink no sabia eso de la depuración, Gracias a los dos por la ayuda. Seguiré investigando a ver por que coño no me inyecta....tal vez sea mi pc... aunque no creo.

Así se me quedo con la corrección, cambio en la depuración y un "WaitForSingleObject" que le añadí al final.
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  not ($sOpen[0])  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 not ($sMemory[0]) then
		MsgBox(64, '', 'Hubo un error reservando memoria')
	EndIf

	;Escribimos en el espacio de memoria obtenido anteriormente la ruta de la DLL
	Local $sWriteMemory = 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 not ($sWriteMemory[0]) 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', 'GetModuleHandleA', 'str', 'Kernel32.dll')
	Local $sGetProcAdress = DllCall('Kernel32.dll', 'handle', 'GetProcAddress', 'dword', $sGetModuleHandle[0], 'str', 'LoadLibraryA')
	;depuramos para saber si existe algun error
	if not ($sGetProcAdress[0]) 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 not ($sRemoteThread[0]) then
		MsgBox(64, '', 'Hubo un error lanzando el hilo')
	EndIf

	;Esperamos hasta que el objeto este señalado (0x7FFFFFFF = INFINITE)
	Local $sWait = DllCall('Kernel32.dll', 'ptr', 'WaitForSingleObject', 'handle', $sRemoteThread[0], 'dword', 0x7FFFFFFF)

	if $sRemoteThread[0] = False then
		MsgBox(64, '', 'Error Injectando la DLL')
	Else
		MsgBox(64, '', 'DLL Injectada con exito')
	EndIf
EndFunc
Saludos
Skype: naker.noventa
Aun que siga con pequenos errores en el code , no esta nada malo para empezar compadre , te felicito tio

Podes utilizar mejor el manejo de Apis , pero todo a su tiempo , luego verás

A mi me injecta perfecto la dll que utilizo , tengo Win_7 32 Ultimate

Saludos e buen code hermano

Indetectables RAT v.0.9.5

@Indetectables Team
Responder

Volver a “Autoit”