Oh, oh, mal empezamos, si
seoane no alcanza a comprender el código, es que es muy malo (el código
), o me he explicado mal, luego... veamos a ver si podemos explicarlo y de paso ayudamos a
Avellas.
Hace mucho, mucho tiempo, prácticamente me vi en la misma situación que
Avellas, por donde empezar ?? y como viene siendo muy común, este tipo de preguntas, suelen suscitar muchos resquemores y cuestiones éticas, pero lo cierto y verdad, es que al final tienes que dedicar tiempo a investigar por otros medios... y mira por donde, al parecer, ese fue
mi primer mensaje en el foro....
Comencé por cosas esenciales tales como la estructura de un paquete TCP para ver que tecla tocar o donde mirar
(Cabecera del paquete
RFC 790).
Código:
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|Versión| IHL |Tipo de Servic.| Tamaño Total |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Identificación |Flags| Desplaz. del Fragmento |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|Tiempo de Vida | Protocolo | Checksum de la cabecera |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Dirección de Origen |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Dirección de Destino |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Una vez teniendo claros algunos conceptos, empecé a meterle mano al asunto.
Obviamente, para "escuchar un puerto", primeramente debemos saber que puerto escuchar, yo para ello utilizé el NETSTAT, redireccionado mediante un pipe, buscando la aplicación que deseamos "fiscalizar", este asunto también lo comenté en
este hilo, y vuelvo a reiterar ahora, que por desgracia
seoane aun no había publicado
su código citado en ese mismo post.
Una vez que tenemos el puerto lo que hacemos es interceptarlo para ver todo lo que entra y sale. En mi caso solamente me interesaba la información que entraba, pues la que salía, se la suministraba yo por otro procedimiento. y este es esto justamente lo que hace el procedimiento que antes he insertado.
Todas las funciones utilizadas con sockets, están documentadas en la ayuda, asi como el modo de parametrizarlas, aunque reconozco que no son funciones fáciles y las cito según están en el código.
Paso a comentar mas o menos el código insertado anteriormente, primero que nada decir que hace falta el
uses WinSock2 para tener acceso a algunas de las funciones socket. (ya comenta algo
jhonny)
CheckConexion -> Es un procedimiento simplemente informativo, y chequea mediante un
FindAWindow si el programa a controlar se está ejecutando, de no ser así, todo lo demás no tendría sentido...
WSAStartup -> Inicializa el sistema de sockets
WSASocket -> Crea el socket
Las funciones
GetHostName, gethostbyname,ntoa son para obtener el nombre y la IP de la máquina local, las utilizo para ir plasmando información en un RichEdit, y es obvio que el maestro
seoane las conoce
muy bien....
Memo1Write-> Es un procedimiento que escribe en el RichEdit, en diferentes colores...
Seguidamente suministramos datos a la estructura
SockInterface, la cual será utilizada por la función
Bind para asociar la IP local al socket creado.
Si todo ha ido bien, utilizamos la función
WSAIoctl que será la encargada de controlar el modo o comportamiento del socket, pasándole el parámetro
SIO_RCVALL que habilita el socket para recibir todos los paquetes, remarcando que para utilizar este parámetro, hay que tener privilegios de administrador, o en caso contrario fallará. Además comentar que está disponible a partir de windows 2000 y superiores y hay que definirlo previamente: (sudores....
)
Código Delphi
[-]const
SIO_RCVALL = $98000001;
Finalmente con
WSAAsyncSelect indicamos al socket nos trasmita los paquetes recibidos (FD_READ) en forma de mensaje windows.
Código Delphi
[-]const
WM_NETEVENT = WM_USER + 103;
Mensajes que recibiremos en el procedimiento creado al efecto:
Código Delphi
[-] procedure NetEvent(var NetMessage: TMessage); message WM_NETEVENT;
En este procedimiento es donde haremos la lectura de los datagramas. Esto no lo he comentado anteriormente, pero en esencia es leer y procesar:
Código Delphi
[-]
if WSARecv(Socket, @wbuf, 1, BytesRet, dwFlags, nil, nil) = 0 then
y por último, decir que me creé una estructura para filtrar la información de los paquetes recibidos....
Código Delphi
[-]
type
PHeader = ^THeader;
THeader = record
Version_IHL : Byte; Tipo_Servicio : Byte ; Longitud_Total: Word; Identificacion: Word; Flag_Offset : Word; Tiempo_Vida : Byte; Protocolo : Byte; Checksum : Word;
IP_Source : LongInt;
IP_Destino : LongInt;
End;
Creo que mas o menos he explicado el procedimiento, aunque debo aclarar, que lo mio no es la docencia, pues mas que explicar las cosas, que por cierto se me da bastante mal, prefiero ponerlas en práctica, y eso se consigue indagando y programando.
Cita:
Empezado por Avellas
mejor dicho, me da pena pero es posible que me ayudes con el codigo completo.
|
Amigo
Avellas, sin ánimo de ofenderte, creo que fuiste un poco "alegre", pensando que tras compilar el código propuesto, tendrías resuelto algunas o todas tus inquietudes. Mi intención era/es orientarte como empezar y en un momento, además de orientaciones, se pueden resolver dudas puntuales, de otro modo esto se podría convertir en un servicio técnico gratuito, y creo que esa no es la filosofía de los foros.
Cita:
Empezado por Avellas
error: Undeclared identifier Crazy
|
Es obvio que obtengas este tipo de mensajes, dado que en mi post, no puse la totalidad de código. En este caso por ejemplo era una variable que no viene a cuento de todo lo comentado.
Cita:
Empezado por seoane
Por último, si no me equivoco, el messenger tiene la opción de registrar las conversaciones
|
Como ya hace tiempo comenté, es un programa que no utilizo, pero creo que esta opción si existe, y tal vez, para resolver esta cuestión, esta también sería una opción a tener en cuenta, aunque a mi personalmente, me parece mas "fascinante" la forma que propongo, de este modo, te apartas un poco de la programación convencional.
Cita:
Empezado por seoane
Por cierto ArdiIIa, el código que pusiste ¿que hace?, porque no lo tengo claro
|
Espero que ahora te quede, aunque solo sea un
poquito mas claro...
Saludos