Oppure

Loading
19/06/09 12:37
gianluca
Ciao a tutti! :D Sto tentando di fare 1 exe in vb.net che mi carichi 1 dll in un altro processo! Ho trovato 1 esempio(mesi fa) fatto in vb6(funzionante) ma solo ora ho avuto tempo di provare a tradurlo in .net! ho fatto anke 1 dll(messa nella stessa cartella dell'exe .net) ke se viene caricata fa apre 1 msgbox per capire ke è funzionato!! è tutta la mattina che voglio vedere quella msgbox ma nn viene fuori! ufffff! :(
chi mi da 1 manooo???


Grazie 1000 in anticipo

Gianluca
Ultima modifica effettuata da gianluca 19/06/09 15:07
aaa
19/06/09 15:29
gianluca
Ah, giusto! ho messo anche 2 Label che se finisce tutto con successo mi scrive che è stata caricata! bene, le label mi scrivono che la dll è stata caricata ma in realta non è vero!
xke quello in vb6 funziona e questo in vb.net no?

ps, questo è il modulo in vb6

'VB DLL injector
'By Reckless Youth

'All the shit it takes to make VB to inject dlls...
Private Declare Function GetProcAddress Lib "kernel32" (ByVal hModule As Long, ByVal lpProcName As String) As Long
Private Declare Function GetModuleHandle Lib "kernel32" Alias "GetModuleHandleA" (ByVal lpModuleName As String) As Long
Private Declare Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" (ByVal lpLibFileName As String) As Long
Private Declare Function VirtualAllocEx Lib "kernel32" (ByVal hProcess As Long, lpAddress As Any, ByVal dwSize As Long, ByVal fAllocType As Long, FlProtect As Long) As Long
Public Declare Function WriteProcessMemory Lib "kernel32" (ByVal hProcess As Long, ByVal lpBaseAddress As Any, lpBuffer As Any, ByVal nSize As Long, lpNumberOfBytesWritten As Long) As Long
Private Declare Function CreateRemoteThread Lib "kernel32" (ByVal ProcessHandle As Long, lpThreadAttributes As Long, ByVal dwStackSize As Long, ByVal lpStartAddress As Any, ByVal lpParameter As Any, ByVal dwCreationFlags As Long, lpThreadID As Long) As Long
Public ProsH As Long

'The Injection Function
Public Function InjectDll(DllPath As String, ProsH As Long)
Dim DLLVirtLoc As Long, DllLength, Inject As Long, LibAddress As Long
Dim CreateThread As Long, ThreadID As Long

'STEP 1 -  The easy part...Putting the bitch in the process' memory
Form1.Label1.Caption = "Injecting......"
'Find a nice spot for your DLL to chill using VirtualAllocEx
DllLength = Len(DllPath)
DLLVirtLoc = VirtualAllocEx(ProsH, ByVal 0, DllLength, &H1000, ByVal &H4)
If DLLVirtLoc = 0 Then Form1.Label1.Caption = "VirtualAllocEx API failed!" & Form1.Timer1.Enabled = True: Exit Function
'Inject the Dll into that spot
Inject = WriteProcessMemory(ProsH, DLLVirtLoc, ByVal DllPath, DllLength, vbNull)
If Inject = 0 Then Form1.Label1.Caption = "Failed to Write DLL to Process!"
Form1.Label1.Caption = "Dll Injected...Creating Thread....."


'STEP 2 - Loading it in the process
'This is where it gets a little interesting....
'Just throwing our Dll into the process isnt going to do shit unless you
'Load it into the precess address using LoadLibrary.  The LoadLibrary function
'maps the specified executable module into the address space of the
'calling process.  You call LoadLibrary by using CreateRemoteThread to
'create a thread(no shit) that runs in the address space of another process.
'First we find the LoadLibrary API function and store it
LibAddress = GetProcAddress(GetModuleHandle("kernel32.dll"), "LoadLibraryA")
If LibAddress = 0 Then Form1.Label1.Caption = "Can't find LoadLibrary API from kernel32.dll": Exit Function
'Next, the part the took me damn near 2 hours to figure out - using CreateRemoteThread
'We set a pointer to LoadLibrary(LibAddress) in our process, LoadLibrary then puts
'our Dll(DLLVirtLoc) into the process address.  Easy enough right?
CreateThread = CreateRemoteThread(ProsH, vbNull, 0, LibAddress, DLLVirtLoc, 0, ThreadID)
If CreateThread = 0 Then
Form1.Label1.Caption = "Failed to Create Thead!"
Form1.Timer1.Enabled = True
Else
Form1.Label1.Caption = "Dll Injection Successful!"
End
End If
End Function


aaa
21/06/09 11:43
gianluca
Ho fatto un po di passi avanti! anzi, direi un bel po! Mi sono bloccato sul createRemoteTread! Questa funzione dovrebbe ritornare il numero del tread ke ha creato, bene, mi torna 0!!! vuol dire ke non ha creato un bel niente difatti non mi esce la msgbox della dll!

Mi sa aiutare qualcuno??? Ho sbagliato a chamare l'api?

Vi ringrazio per l'ascolto! :D

Gianluca
aaa
21/06/09 11:51
Il Totem
A me restituisce un risultato diverso da 0. Penso che il tuo errore dipenda dal fatto che la funzione LoadLibrary richieda un entry point nella dll, ossia una dllmain che contenga il codice da eseguire quando la dll viene caricata. Negli assembly .net non c'è modo di creare librerie con entry point.
aaa
22/06/09 16:39
gianluca
a me va a momenti in verita! l'ho notato ora, cmq la dll è fatta in c++ e con vb6 funziona tutto bene! xo dato ke l'applicazione devo farla in vb.net volevo fare anke l'injector... cmq anke nei momenti ke mi da CreateThread != 0 non mi esce la msgbox e attaccandomi con ollydbg al processo non la vedo iniettata!


Grazie intanto per l'interessamento!

Gianluca
aaa
23/06/09 7:32
Il Totem
Ah, se la dll è in c++ allora non può essere l'entry point. Se usi Vista e la classe process per ottenere l'handle del processo è possibile che si verifichi un errore non segnalato (Win32Exception). Prova a controllare nella finestra di debug, lì dovrebbe venire fuori la scritta.
aaa
23/06/09 13:21
gianluca
Se la finestra di debug che mi dici è quella che si chiama Output(View->Other Windows->Output) allora non mi dice niente... xo ho provato con l'api GetLastError() è mi da l'errore N°87... puo avere qualche utilita? cmq se fosse Win32Exception come potrei risolvere?

ps, uso vista e la classe process per ottenere l'handle!

Grazie

Gianluca
aaa