Ver Mensaje Individual
  #6  
Antiguo 28-06-2007
Avatar de ArdiIIa
[ArdiIIa] ArdiIIa is offline
Miembro Premium
 
Registrado: nov 2003
Ubicación: Valencia city
Posts: 1.481
Reputación: 22
ArdiIIa Va por buen camino
Al margen de lo comentado, SI es posible hacer lo que te piden.
Un procedimiento válido sería hacer un packet sniffer, es decir realizar un programa que escuche o intercepte los puertos utilizados por el messenger. Esto, técnicamente no resulta difícil. Lo complicado a mi juicio, es interpretar todo lo que entra y lo que sale por los puertos, es decir el protocolo, dado que como es obvio, la trasmisión no es ASCII simplemente, sino que los paquetes de datos llevarán de todo un poco.
Hace tiempo hice un programa que utiliza esta técnica y los resultados fueron excelentes, le implementación fue mediante sockets.

Te pongo unas porciones de código para que resulte mas ilustrativo:


Código Delphi [-]
procedure TFormMain.Button1Click(Sender: TObject);
Var
HostName : Array[0..20] of Char;
HostEnt : PHostEnt;
SockInterface : TSockAddrIn;
optval: u_int;
BytesRet: DWord;
begin

    try
    CheckConexion;
    Button1.Enabled := False;
    Crazy := False;
    WSAStartup(MakeWord(2, 2),WSAData);
    Socket := WSASocket(AF_INET, SOCK_RAW, IPPROTO_IP, Nil, 0,WSA_FLAG_OVERLAPPED);


    gethostname(@Hostname, sizeof(Hostname));
    // Memo1.Lines.Add(HostName);
    Memo1Write(HostName, $00C08000 );
    LOCALHOSTNAME := HOSTNAME;

    Hostent := gethostbyname(@HostName);
    Memo1.Lines.Add(Hostent.h_name);

   while Hostent.h_addr_list^ <> nil do
   begin
    CopyMemory(@IP, Hostent.h_addr_list^, SizeOf(IP));
    
    Memo1Write('IP: ' + inet_ntoa(IP), $008000FF);
    Inc(Hostent.h_addr_list);
   end;


    if Socket <> INVALID_SOCKET then
      begin
      with SockInterface do
        begin
        sin_addr := IP ; 
        sin_family := AF_INET;
        sin_port := htons(puerto);
     end;



if Bind(Socket, @SockInterface, SizeOf(SockInterface)) <> SOCKET_ERROR
then
      begin
        BytesRet := 0;
        optval := 1;
        If WSAIoctl(Socket, SIO_RCVALL, @optval, SizeOf(optval), Nil, 0,@BytesRet, Nil, Nil) <> SOCKET_ERROR then
        Memo1.Lines.Add('Waiting reception') ;
           WSAAsyncSelect(Socket, Self.Handle, WM_NETEVENT,FD_READ);

      end;
END;
      finally
      ;
      End;


end;


En esta línea sin_port := htons(puerto); es donde defino el puerto a escuchar.

Una vez ejecutado el código, la aplicación recibe mensajes WM_NETEVENT = WM_USER + 103; en el procedimiento
procedure NetEvent(var NetMessage: TMessage); message WM_NETEVENT;
y este sería realmente el procedimiento que se tendría que discernir todos los datos que entran y/o salen, es decir, traducir los paquetes de datos para que sean legibles.
Espero que te resulte útil.
Saludos.
__________________
Un poco de tu generosidad puede salvar la vida a un niño. ASÍ DE SENCILLO
Responder Con Cita