Питання # 5 376 ... сперте! Потрібно написати подобу сніффер, програма повинна пасивно ін ... (робота з

Вітаю, шановні експерти!
Потрібно написати подобу сніффер, програма повинна пасивно прослуховувати певний порт (він заздалегідь відомий, стежити куди підключається прога не потрібно), бути максимально простий і не підвисає. Зберігати вона нічого нікуди не повинна. За допомогою сніффер була отримана інформація що настроїтися програма спілкується з сервером використовуючи HTTP і UDP, захоплювати потрібно і те і те.
Як простіше реалізувати таке на Делфі?
Дякую за помощ.

Че за дебільна система? Довелося акк створювати щоб відповісти на своє ж запитання.
Типу предпологается що якщо людина задав питання то він сам рішення ну аж ніяк не знайде.
Ну ви приколісти.

  1. Uses
  2. .
  3. const
  4. sHEADER = '[TIME] [Prot Plen] [Source IP: Port] [Dest IP: Port] [Service] [Dlen] [Packet] [Data]';
  5. sPl = '% -12s% -4s% 4d% -20s>% -20s% -12s% 4d% s';
  6. type
  7. TForm1 = class (TForm)
  8. RichEdit1: TRichEdit;
  9. Memo1: TMemo;
  10. Label1: TLabel;
  11. procedure FormCreate (Sender: TObject);
  12. procedure FormDestroy (Sender: TObject);
  13. private
  14. _monRawSocket: TMonitorSocket;
  15. procedure Initialize ();
  16. procedure GetPacket (Sender: TObject; PacketInfo: TPacketInfo);
  17. public
  18. end;
  19. var
  20. Form1: TForm1;
  21. implementation
  22. procedure TForm1.FormCreate (Sender: TObject);
  23. begin
  24. Initialize ();
  25. Memo1.Lines.Clear;
  26. Memo1.Lines.Add (LocalIpList [0]);
  27. end;
  28. procedure TForm1.FormDestroy (Sender: TObject);
  29. begin
  30. _monRawSocket.Free;
  31. end;
  32. procedure TForm1.Initialize;
  33. begin
  34. _monRawSocket: = TMonitorSocket.Create (self);
  35. _monRawSocket.OnPacketEvent: = GetPacket;
  36. _monRawSocket.StartMonitor;
  37. RichEdit1.Lines.Clear;
  38. RichEdit1.SelAttributes.Color: = clMaroon;
  39. RichEdit1.Lines.Add (sHEADER);
  40. end;
  41. procedure TForm1.GetPacket (Sender: TObject; PacketInfo: TPacketInfo);
  42. var
  43. _srcIP, _distIP. String;
  44. _a, _b: string;
  45. begin
  46. SetLength (PacketInfo.DataBuf, 96);
  47. _b: = PacketInfo.DataBuf;
  48. StringRemCntls (_b);
  49. if PacketInfo.EtherProto = PROTO_IP then
  50. begin
  51. _srcIp: = IPToStr (PacketInfo.AddrSrc) + ':' + IntToStr (PacketInfo.PortSrc);
  52. _distip: = IPToStr (PacketInfo.AddrDest) + ':' + IntToStr (PacketInfo.PortDest);
  53. if PacketInfo.ProtoType = IPPROTO_ICMP then
  54. _a: = Format (sPL,
  55. [TimeToZStr (PacketInfo.PacketDT),
  56. GetIPProtoName (PacketInfo.ProtoType),
  57. sPL,
  58. _srcIp,
  59. _distIp,
  60. lowercase (GetICMPType (PacketInfo.IcmpType)),
  61. PacketInfo.DataLen, _b])
  62. else
  63. begin
  64. if (PacketInfo.DataLen = 0) then
  65. _b: = GetFlags (PacketInfo.TcpFlags);
  66. _a: = Format (sPL,
  67. [TimeToZStr (PacketInfo.PacketDT),
  68. GetIPProtoName (PacketInfo.ProtoType),
  69. PacketInfo.PacketLen,
  70. _srcIp,
  71. _distIp,
  72. Lowercase (GetServiceNameEx (PacketInfo.PortSrc, PacketInfo.PortDest)),
  73. PacketInfo.DataLen, _b]);
  74. end;
  75. end
  76. else
  77. begin
  78. _a: = Format (sPL,
  79. [TimeToZStr (PacketInfo.PacketDT),
  80. GetEtherProtoName (PacketInfo.EtherProto),
  81. PacketInfo.PacketLen,
  82. MacToStr (PacketInfo.EtherSrc),
  83. MacToStr (PacketInfo.EtherDest),
  84. '',
  85. PacketInfo.DataLen,
  86. _b]);
  87. end;
  88. RichEdit1.Lines.Add (_a);
  89. end;

Міні-форум питання

Відгукніться хто небудь.
Підкажіть тут InDy використовувати, WinPCap як небудь прикрутити, або інші варіанти є?

ВІРИТИ ВО позаземних цивілізацій НЕ ОЗНАЧАЄ ВІРИТИ В інопланетян.

indy не допоможе. (Якщо тільки не писати свою проксі).
Якщо потрібно просто моніторити трафік - то краще скачати собі Wireshark - він все Відмоніторити і по поличках розкладе.

Галочка "підтвердження прочитання" - вселенське зло.

Ні це потрібно саме в моїй проге, Wireshark у мене є.
Також є VoicedSniffer, який виконаний на Делфі і я б не сказав що він підвисає. Драйвер WinPCap не встановлено, але він як то працює.

ВІРИТИ ВО позаземних цивілізацій НЕ ОЗНАЧАЄ ВІРИТИ В інопланетян.

Щодо інді схоже так і є. Ставив вчора на форму всі компоненти які мають відношення до UDP, HTTP, TCP, жоден ні біта не прийняв. Схоже доведеться з вінпікапом возитися.

ВІРИТИ ВО позаземних цивілізацій НЕ ОЗНАЧАЄ ВІРИТИ В інопланетян.

Посидівши пару днів в інтернеті порахував що без вінпікапа обійдуся. Викладу код, раптом знадобиться кому. Якщо у вас багато адаптерів в системі розбирайтеся самі. Сніффер простий як три копійки, виключення я не обробляв. Якщо вам потрібно реагувати (програмно природно) на події в клієнт серверному додатку то просто допишіть обмеження по IP, щоб приймати дані тільки з потрібного сервера.

ВІРИТИ ВО позаземних цивілізацій НЕ ОЗНАЧАЄ ВІРИТИ В інопланетян.

Так, до речі мало не забув пояснити початківцям Х-менам що для роботи коду потрібно додати в секцію Uses наступне:

Monsock, WSocket, Packet32, Winsock, Magsubs1, Packhdrs

Власне шукаємо потрібні файли в інтернеті кидаємо в папку з проектом, кидаємо на форму мемо і richedit, і вперед до світлого майбутнього

ВІРИТИ ВО позаземних цивілізацій НЕ ОЗНАЧАЄ ВІРИТИ В інопланетян.

І всетаки вона вийшла простий і не підвисає.

ВІРИТИ ВО позаземних цивілізацій НЕ ОЗНАЧАЄ ВІРИТИ В інопланетян.

end;
Ну тепер все база є, далі самі думаємо.

ВІРИТИ ВО позаземних цивілізацій НЕ ОЗНАЧАЄ ВІРИТИ В інопланетян.