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
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!
Gianluca
Mi sa aiutare qualcuno??? Ho sbagliato a chamare l'api?
Vi ringrazio per l'ascolto!
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
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
ps, uso vista e la classe process per ottenere l'handle!
Grazie
Gianluca
aaa