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));
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.