 |
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
C3lt1c

Anmeldungsdatum: 22.01.2012 Beiträge: 15
|
Verfasst am: 08.02.2012, 09:40 Titel: 2 Verschiedene Dll Injection Methoden |
|
|
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 |
|
 |
Cherry
Anmeldungsdatum: 20.06.2007 Beiträge: 249
|
Verfasst am: 15.02.2012, 13: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.
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 |
|
 |
C3lt1c

Anmeldungsdatum: 22.01.2012 Beiträge: 15
|
Verfasst am: 16.02.2012, 15:51 Titel: |
|
|
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
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 |
|
 |
|
|
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.
|
|