Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

2 Verschiedene Dll Injection Methoden

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Projektvorstellungen
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
C3lt1c



Anmeldungsdatum: 22.01.2012
Beiträge: 15

BeitragVerfasst am: 08.02.2012, 09:40    Titel: 2 Verschiedene Dll Injection Methoden Antworten mit Zitat

Ist zwar älterer C++ Code von mir den ich mal schnell für FB Fit gemacht habe.
Ich hoffe der ein oder andere von euch kann ihn gebrauchen.

Code:


'Einfache Dll-Injector-Methode (CreateRemoteThread)
'Benutzung: <Beispiel> dll_injector("test.exe", "Urlmon.dll") 

Function dll_injector(executable As String, inject_dll As string) As Integer

Dim inject_dll_ptr As LPCVOID = StrPtr(inject_dll)
Dim ProcessInfo As PROCESS_INFORMATION
Dim StartInfo As STARTUPINFO
Dim len_dll_name As Integer
Dim pMem As LPVOID
Dim loadLibrarya_address As FARPROC
Dim thread As HANDLE

CreateProcess executable,0,0,0,0,NORMAL_PRIORITY_CLASS,0,0,@StartInfo,@ProcessInfo
Sleep 500
len_dll_name = Len(inject_dll)
pMem = VirtualAllocEx (ProcessInfo.hProcess,0,len_dll_name,MEM_COMMIT,PAGE_READWRITE)
WriteProcessMemory ProcessInfo.hProcess,pMem,inject_dll_ptr,len_dll_name,0
loadLibrarya_address = GetProcAddress(GetModuleHandle("Kernel32"),"LoadLibraryA")
thread = CreateRemoteThread (ProcessInfo.hProcess,0,0,Cast(LPVOID,loadLibrarya_address),pMem,0,0)
WaitForSingleObject thread,INFINITE
VirtualFreeEx ProcessInfo.hProcess,pMem,len_dll_name,MEM_RELEASE
CloseHandle ProcessInfo.hProcess

Return 1

End Function



Code:


'Spezielle Dll-Injector-Methode (CodeInjection)
'Benutzung: <Beispiel> dll_injector_special("test.exe", "Urlmon.dll")

Function dll_injector_special(executable As String, inject_dll As string) As Integer

Dim inject_dll_ptr As LPCVOID = StrPtr(inject_dll)
Dim ProcessInfo As PROCESS_INFORMATION
Dim StartInfo As STARTUPINFO
Dim len_dll_name As Integer
Dim pMemDllName As LPVOID
Dim pMemCode As LPVOID
Dim pLoadLibrary As FARPROC
Dim pEIP As DWORD
Dim injectcode_ptr As Byte Ptr
Dim ctx As CONTEXT


CreateProcess executable,0,0,0,0,NORMAL_PRIORITY_CLASS,0,0,@StartInfo,@ProcessInfo
Sleep 500
len_dll_name = Len(inject_dll) + 1
inject_dll += Chr(&h00)
pMemDllName = VirtualAllocEx  (ProcessInfo.hProcess,0,len_dll_name,MEM_COMMIT,PAGE_READWRITE)
pMemCode = VirtualAllocEx  (ProcessInfo.hProcess,0,22,MEM_COMMIT,PAGE_EXECUTE_READWRITE)
SuspendThread ProcessInfo.hThread
WriteProcessMemory ProcessInfo.hProcess,pMemDllName,inject_dll_ptr,len_dll_name ,0
pLoadLibrary = GetProcAddress(GetModuleHandle("Kernel32"),"LoadLibraryA")
ctx.ContextFlags = CONTEXT_CONTROL
GetThreadContext ProcessInfo.hThread, @ctx
pEIP = ctx.Eip
ctx.Eip = Cast(DWORD,pMemCode)
ctx.ContextFlags = CONTEXT_CONTROL
SetThreadContext ProcessInfo.hThread,@ctx
GoTo get_injectcode_ptr
_return:
VirtualProtect injectcode_ptr, 22, PAGE_EXECUTE_READWRITE, 0
Asm
   mov eax,[injectcode_ptr]
   mov ebx,[pEIP]
   mov dword Ptr [eax+1],ebx
   mov ebx, [pMemDllName]
   mov dword Ptr [eax+8],ebx
   mov ebx , [pLoadLibrary]
   mov dword Ptr [eax+13],ebx
End Asm
WriteProcessMemory ProcessInfo.hProcess,pMemCode,Cast(LPCVOID, injectcode_ptr),22,0
ResumeThread ProcessInfo.hThread
Sleep 2000
VirtualFreeEx ProcessInfo.hProcess,pMemDllName,len_dll_name,MEM_DECOMMIT
Sleep 500
VirtualFreeEx ProcessInfo.hProcess,pMemCode,22,MEM_DECOMMIT
CloseHandle ProcessInfo.hThread
CloseHandle ProcessInfo.hProcess
GoTo _end
inject_code:
Asm
   push &h11111111
   pushfd
   pushad
   push &h11111111
   mov eax, &h11111111
   Call eax
   popad
   popfd
   ret
End Asm
get_injectcode_ptr:
Asm
   lea eax,[inject_code]
   mov [injectcode_ptr],eax
End Asm
GoTo _return
_end:

Return 1

End Function




Gruss C3lt1c
_________________
+++Chars are my Color and Codes my Art+++

Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Cherry



Anmeldungsdatum: 20.06.2007
Beiträge: 249

BeitragVerfasst am: 15.02.2012, 13:37    Titel: Antworten mit Zitat

Ich glaube du vergisst CloseHandle(ProcessInfo.hThread)... und wozu ist das Sleep 500 gut? Außerdem würde ich ein If zum CreateProcess tun um festzustellen ob der Prozess überhaupt gestartet werden konnte.

Bei der zweiten Methode würde ich nicht mit VirtualProtect die eigene Page writeable machen und in ihr rumschreiben, sondern die paar Befehle im Debugger anschauen und die Opcodes in ein Array packen, dieses in den Zielprozess kopieren und dann die paar Variablen auch dort reinkopieren, ähnlich wie ich es hier gemacht habe: http://www.freebasic.net/forum/viewtopic.php?p=168156

Wenn die DLL direkt am Anfang geladen werden soll würde es sich auch anbieten, CREATE_SUSPENDED bei CreateProcess zu verwenden (anstatt nachher SuspendThread).
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
C3lt1c



Anmeldungsdatum: 22.01.2012
Beiträge: 15

BeitragVerfasst am: 16.02.2012, 15:51    Titel: Antworten mit Zitat

Zitat:
BeitragVerfasst am: 15.02.2012, 12:37 Titel:
Ich glaube du vergisst CloseHandle(ProcessInfo.hThread)... und wozu ist das Sleep 500 gut? Außerdem würde ich ein If zum CreateProcess tun um festzustellen ob der Prozess überhaupt gestartet werden konnte.


Ja gut man könnte den Code noch nachbessern.

Code:
Bei der zweiten Methode würde ich nicht mit VirtualProtect die eigene Page writeable machen und in ihr rumschreiben, sondern die paar Befehle im Debugger anschauen und die Opcodes in ein Array packen, dieses in den Zielprozess kopieren und dann die paar Variablen auch dort reinkopieren, ähnlich wie ich es hier gemacht habe: http://www.freebasic.net/forum/viewtopic.php?p=168156


Wenn man schon die möglichkeit auf Inline Asm hat brauch man sich ja nicht die Mühe mit dem Debugger machen zwinkern

Ich benutze auch fast immer Selfmodding Code falls es um AsmInjections oder Shellcode geht auch in NASM oder MASM.
Falls es um Dynamischen Shellcode geht ist deine Variante natürlich schneller aber nur solange im Shellcode selbst die Strings vorhanden sind zb als Overlay Callback.
_________________
+++Chars are my Color and Codes my Art+++

Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Projektvorstellungen Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

 Impressum :: Datenschutz