  | 
					
						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, 08: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, 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.
 
 
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, 14: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.
  | 
   
 
     |