DLL Injection with AutoIt ...

06/19/2011 22:03 Exetra#1
#old
06/21/2011 12:22 Ludder231#2
is this line correct?

PHP Code:
MsgBox(16, "Error", "Failed to inject" & @CRLF & "Error code : " &@error) 
Should that means:
PHP Code:
MsgBox(16, "Error", "Failed to inject" & @CRLF & "Error code : " &$err) 
????
06/27/2011 19:41 lautlosertot#3
geht nicht-.-
06/28/2011 14:21 Reeek#4
sag' mal, laut, gehst du in die Schule? Kannst du lesen? Das ist kein Release, der TE hat eine Frage gestellt, weil sein Script eben nicht geht >.<

#vote4IQ-Test beim Registrieren
06/28/2011 14:32 ClOuDy.#5
da war ein kurzer anflug von hackorskillz abgreifen
06/28/2011 18:57 KDeluxe#6
Das Problem mit dem Fehlercode wird wohl an der fehlenden Berechtigung fehlen. Das dürfte eigentlich kein Problem sein, wenn man die Datei als Admin ausführt.

Ich habe aber mal meine UDF genommen und ein Beispiel dafür erstellt:
PHP Code:
#AutoIt3Wrapper_UseUpx=n
#AutoIt3Wrapper_UseX64=n

#RequireAdmin
#include <GUIConstants.au3>

GUICreate("Beispiel", 275, 100)
GUISetBkColor(0xFFFFFF)
GUICtrlCreateLabel("Prozess:", 10, 10, 50, 17)
$I_ProcessName = GUICtrlCreateInput("", 65, 10, 200, 21)
GUICtrlCreateLabel("DLL:", 10, 40, 50, 17)
$I_DllPath = GUICtrlCreateInput("", 65, 40, 150, 21)
$B_SearchDll = GUICtrlCreateButton("...", 225, 40, 40, 25)
$R_Auto = GUICtrlCreateRadio("Automatisch", 10, 75, 75, 17)
GUICtrlSetState(-1, $GUI_CHECKED)
$R_Man = GUICtrlCreateRadio("Manuell", 130, 75, 55, 17)
$B_Inject = GUICtrlCreateButton("Injizieren", 190, 70, 75, 25)
GUICtrlSetState(-1, $GUI_DISABLE)
GUISetState()

$Injected = False

Do
    
$Msg = GUIGetMsg()
    Switch 
$Msg
        
Case $B_SearchDll
            GUICtrlSetData
($I_DllPath, FileOpenDialog("Dll", @HomeDrive, "Dynamic Link Library (*.dll)", 3))
        Case 
$R_Auto
            GUICtrlSetState
($B_Inject, $GUI_DISABLE)
        Case 
$R_Man
            GUICtrlSetState
($B_Inject, $GUI_ENABLE)
        Case 
$B_Inject
            _InjectDll
(ProcessExists(GUICtrlRead($I_ProcessName)), GUICtrlRead($I_DllPath))
            
_Message(@error)
    EndSwitch

    If 
BitAND(GUICtrlRead($R_Auto), $GUI_CHECKED) And Not $Injected Then
        $ProcessId 
= ProcessExists(GUICtrlRead($I_ProcessName))
        If 
$ProcessId > 0 Then
            _InjectDll
($ProcessId, GUICtrlRead($I_DllPath))
            
_Message(@error)
            
$Injected = True
            
;Exit
        EndIf
    EndIf

    
Sleep(10)
Until $Msg == $GUI_EVENT_CLOSE



Func _Message
($ErrorCode)
    If 
$ErrorCode <> 0 Then
        MsgBox
(48, "Fehler", "Es ist ein Fehler aufgetreten!" & @CRLF & "Fehlercode: " & @error)
    Else
        
MsgBox(64, "Info", "Injektion erfolgreich!")
    EndIf
EndFunc


;=================================================================================================
; Function:            
_InjectDll($ProcessId, $DllPath)
; 
Description:        Injects a .dll into a running program.
; Return 
Value(s):    On Success - Returns true
;                    On Failure - Returns false
;                    @Error - 0 = No error.
;                             
1 = Invalid ProcessId.
;                             
2 = File does not exist.
;                             
3 = File is not a .dll (invalid file).
;                             
4 = Failed to open 'Advapi32.dll'.
;                             
5 = Failed to get the full path.
;                             
6 = Failed to open the process.
;                             
7 = Failed to call 'GetModuleHandle'.
;                             
8 = Failed to call 'GetProcAddress'.
;                             
9 = Failed to call 'VirtualAllocEx'.
;                             
10 = Failed to write the memory.
;                             
11 = Failed to create the 'RemoteThread'.
; 
Author(s):        KillerDeluxe
;=================================================================================================

Func _InjectDll($ProcessId, $DllPath)
    If 
$ProcessId == 0 Then Return SetError(1, "", False)
    If 
Not(FileExists($DllPath)) Then Return SetError(2, "", False)
    If 
Not(StringRight($DllPath, 4) == ".dll") Then Return SetError(3, "", False)

    
$Kernel32 = DllOpen("kernel32.dll")
    If @
error Then Return SetError(4, "", False)

    
$DLL_Path = DllStructCreate("char[255]")
    
DllCall($Kernel32, "DWORD", "GetFullPathNameA", "str", $DllPath, "DWORD", 255, "ptr", DllStructGetPtr($DLL_Path), "int", 0)
    If @
error Then Return SetError(5, "", False)

    
$hProcess = DllCall($Kernel32, "DWORD", "OpenProcess", "DWORD", 0x1F0FFF, "int", 0, "DWORD", $ProcessId)
    If @
error Then Return SetError(6, "", False)

    
$hModule = DllCall($Kernel32, "DWORD", "GetModuleHandleA", "str", "kernel32.dll")
    If @
error Then Return SetError(7, "", False)

    
$lpStartAddress = DllCall($Kernel32, "DWORD", "GetProcAddress", "DWORD", $hModule[0], "str", "LoadLibraryA")
    If @
error Then Return SetError(8, "", False)

    
$lpParameter = DllCall($Kernel32, "DWORD", "VirtualAllocEx", "int", $hProcess[0], "int", 0, "ULONG_PTR", DllStructGetSize($DLL_Path), "DWORD", 0x3000, "int", 4)
    If @
error Then Return SetError(9, "", False)

    
DllCall("kernel32.dll", "BOOL", "WriteProcessMemory", "int", $hProcess[0], "DWORD", $lpParameter[0], "str", DllStructGetData($DLL_Path, 1), "ULONG_PTR", DllStructGetSize($DLL_Path), "int", 0)
    If @
error Then Return SetError(10, "", False)

    
$hThread = DllCall($Kernel32, "int", "CreateRemoteThread", "DWORD", $hProcess[0], "int", 0, "int", 0, "DWORD", $lpStartAddress[0], "DWORD", $lpParameter[0], "int", 0, "int", 0)
    If @
error Then Return SetError(11, "", False)

    
DllCall($Kernel32, "BOOL", "CloseHandle", "DWORD", $hProcess[0])
    
DllClose($Kernel32)

    Return 
SetError(0, "", True)
EndFunc 
Vielleicht hilft es ja.
08/26/2011 01:52 Rolandfrance#7
Very Good KillerDeluxe !!