holaaa que tal, queria preguntar una cosita...
Yo tengo programada una aplicacion que funciona como proxy, pero resulta que al pasar todo el flujo de paquetes de entradas y de salidas, y a su vez la misma aplicacion estar haciendo bastantes cosas (como readprocessmemory, etc etc) al parecer genera un poco de LAG entre la comunicacion...
Lo que queria saber es si es posible evitar que dependa de mi aplicacion, es decir, hacer un api hook al winsock e interceptar send y recv para mandarlos al handledata de mi aplicacion...
Estuve buscando por internet, hace unos dias encontre un articulo de unclose de cobain si no me equivoco, pero lo mire en ese momento y no pude entenderlo, resulta que ahora no logro encontrarlo!
Otra cosa que vi es el post:
http://foro.elhacker.net/analisis_y_diseno_de_malware/api_hook_delphi_espiar_las_comunicaciones_de_otros_procesos-t263615.0.html
Pero esta el delphi y por desgracia no se convertirlo, y creo que tampoco sea tan facil...
Gracias!!!
edit: ya encontre el unclose de cobain, pero no logre nada :(
.
No se delphi, pero lo que si se es identificar las apis y hay hay apis mas que nada; usa el buscador y veras unas ligas a unos proyectos que hookean apis ( puse las ligas anteriormente ).
Dulces Lunas!¡.
.
HOLA!!!
Mira, te lo traduje lo mejor que pude, no se como usar pointers en vb6 asique eso lo cas a tener que hacer vos.
Te dejo el codigo del formulario, la Dll la podes compilar calculo.
Y usa una libreria psApi, encontre una para vb6 pero no tiene todas las funciones fijate si la encontras. Entonces tambien te queda por ponerle psapi. a todas sus funciones.
*Ahh, el codigo esta traducido, no esta funcional para nada, aviso.
Dim psAPI As New mPSAPI 'con esto tenes que hacer psapi.funcion
'NOTAS: NIL ES PARA VACIAR LOS POINTERS, NO SE ESO EN VB6
Private Sub btnInyectar_Click()
Dim Procesos(1 To 1024) As Long
Dim Needed As Long
Dim i As Long
Dim Process As Long ' aca no se me ocurio que poner \\ Process, Thread: THandle;
Dim Thread As Long ' aca no se me ocurio que poner \\ Process, Thread: THandle;
Dim ModName(0 To Max_Path) As Byte
'RemLibPath : PChar; \\aca un pointer a un caracter de alguna variable
Dim ExitCode As Long
Dim LibPath As String
Dim Target As String
If lsbMain.ListIndex >= 0 Then
Target = lsbMain.List(lsbMain.ListIndex)
LibPath = App.Path & "\Hook.dll"
If EnumProcesses(Procesos, LenB(Procesos), Needed) Then
For i = 1 To (Needed \ LenB(DWORD))
Process = OpenProcess(PROCESS_ALL_ACCESS, False, Procesos(i))
If Process <> 0 Then
If GetModuleFileNameEx(Process, 0, ModName, LenB(ModName) - 1) > 0 Then
If AnsiStrPos(ModName, PChar(Target)) <> nil Then
RemLibPath = VirtualAllocEx(Process, nil, Len(LibPath) + 1, MEM_COMMIT, PAGE_READWRITE)
If RemLibPath <> nil Then
If WriteProcessMemory(Process, RemLibPath, PChar(LibPath), Len(LibPath), PDWORD(nil)) Then ' no se si esta bien la ultima parte
'If WriteProcessMemory(Process, RemLibPath, PChar(LibPath), Len(LibPath), PDWORD(nil)^) Then
Thread = CreateRemoteThread(Process, nil, 0, GetProcAddress(GetModuleHandle("Kernel32"), "LoadLibraryA"), RemLibPath, 0, PDWORD(nil)) ' no se si esta bien la ultima parte
'Thread = CreateRemoteThread(Process, nil, 0, GetProcAddress(GetModuleHandle('Kernel32'), 'LoadLibraryA'), RemLibPath, 0, PDWORD(nil)^)
If Thread <> 0 Then
'WaitForSingleObject(Thread,INFINITE ); NOSE
'GetExitCodeThread(Thread,ExitCode); NOSE
CloseHandle (Thread)
End If
End If
'VirtualFreeEx(Process,RemLibPath,Length(LibPath)+1,MEM_RELEASE); ¿? NOSE
End If
End If
End If
CloseHandle (Process)
End If
Next
End If
End If
End Sub
Private Sub btnRefrescar_Click()
Dim Procesos(1 To 1024) As Long
Dim Needed As Long
Dim i As Long
Process As Long ' aca no se me ocurio que poner \\ Process: THandle
ModName(0 To Max_Path) As Byte
lsbMain.Clear
If EnumProcesses(Procesos, UBound(Procesos), Needed) Then
For i = 1 To (Needed \ LenB(DWORD))
Process = OpenProcess(PROCESS_QUERY_INFORMATION Or PROCESS_VM_READ, False, Procesos(i))
If Process <> 0 Then
If GetModuleFileNameEx(Process, 0, ModName, LenB(ModName) - 1) > 0 Then
lsbMain.Add ModName
End If
CloseHandle (Process)
End If
Next
End If
End Sub
GRACIAS POR LEER!!!
Hola!! Gracias 79137913 por tomarte la molestia!
Les comento, con mucha busqueda y ayuda logre compilar una dll en DEV C++, que hookea connect send y recv, y la pude inyectar perfectamente en el proceso que queria, la misma dll guarda en un archivo .txt todos los paquetes enviados y recibidos, lo que me faltaria, es enviar ese flujo de paquetes a vb, estuve investigando pero solo encontre formas de interactuar desde vb a c++ enviandole comandos, pero no alrevez, es decir, que todos los eventos de la funcion send de la dll los mande a vb automaticamente, quizas tenga que preguntar en el foro de d/c++
Gracias!!
HOLA!!!
Con command$ no podes?
Cuando llamas a un ejecutable hecho en vb6 "ejecutable.exe parametros"
En command$ aparecen los parametros.
Sino...
Podes hacer que el programa en c++ mande una pulsacion al form de vb6 entonces cuando este la pulsacion vos abris el archivo de texto (la pulsacion te indicaria que se modifico el archivo de texto).
GRACIAS POR LEER!!!
claro pero creo q command$ enviaria los parametros solo al abrirlo (corregime)...
Lo que quiero hacer es hacerlo funcionar como un proxy, es decir, tiene que estar abierta mi aplicacion vb, inyectada la dll en el proceso que quiera, y la dll enviar la entrada y salida de paquetes a vb...
Como dije, por ahora ya logre inyectar la dll, hookear connect, send y recv, y guardar logs de estas 3 funcione (entrada y salida de paquetes) en un archivo de texto, la dll esta en c++...
Pero bueno no se como transferir esa informacion a vb para plasmarla en un richtextbox por ejemplo... Leer el archivo de log que guarda la dll seria medio "trucho" (no me mal interpretes no va contra vos, es que no encontre otra manera de decirlo :P, en otro caso seria una buena alternativa) ya que seria lento al estar todo el tiempo modificando el log la dll y yo leyendolo, SUPONGO...
Si alguien tiene algun tutorial de comunicacion entre dll c++ y vb me puede tirar una mano y pasarmelo porfavor :P
Los que encontre en internet solo me muestran como enviar una accion desde vb a dll pero no desde la dll a vb directamente....
Gracias!
.
* Pchar si no mal recuerdo en vb6 es strptr(). aun que debes manejar los byval...
* ^ me parece que se interpreta como en C/C++ es decir un Xor
* PDWORD() no es necesario. se hace un Casting interno en el api (es solo una suposicion ya que no veo que se este ahciendo algo mas con las variables involucraas). pero en dado caso que lo requieras aqui tienes:
Private Function LoWord(ByVal Numero As Long) As Long
LoWord = Numero And &HFFFF&
End Function
Private Function HiWord(ByVal Numero As Long) As Long
HiWord = Numero \ &H10000 And &HFFFF&
End Function
Private Function MakeDWord(ByVal LoWord As Integer, ByVal HiWord As Integer) As Long
MakeDWord = (HiWord * &H10000) Or (LoWord And &HFFFF&)
End Function
Temibles Lunas!¡.
.
check this
http://files.codes-sources.com/fichier_fullscreen.aspx?id=26027&f=1-Sniffer%5CfrmMain.frm&lang=en