api hook

Iniciado por Cromatico, 18 Marzo 2011, 01:20 AM

0 Miembros y 1 Visitante están viendo este tema.

Cromatico

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 :(

BlackZeroX

.
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!¡.
.
The Dark Shadow is my passion.

79137913

#2
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.

Código (vb) [Seleccionar]
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!!!
"Como no se puede igualar a Dios, ya he decidido que hacer, ¡SUPERARLO!"
"La peor de las ignorancias es no saber corregirlas"

79137913                          *Shadow Scouts Team*

Cromatico

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!!

79137913

#4
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!!!
"Como no se puede igualar a Dios, ya he decidido que hacer, ¡SUPERARLO!"
"La peor de las ignorancias es no saber corregirlas"

79137913                          *Shadow Scouts Team*

Cromatico

#5
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!

BlackZeroX

#6
.
* 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:

Código (Vb) [Seleccionar]


    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!¡.
.
The Dark Shadow is my passion.