Вітаю, шановні експерти!
Потрібно написати подобу сніффер, програма повинна пасивно прослуховувати певний порт (він заздалегідь відомий, стежити куди підключається прога не потрібно), бути максимально простий і не підвисає. Зберігати вона нічого нікуди не повинна. За допомогою сніффер була отримана інформація що настроїтися програма спілкується з сервером використовуючи HTTP і UDP, захоплювати потрібно і те і те.
Як простіше реалізувати таке на Делфі?
Дякую за помощ.
Че за дебільна система? Довелося акк створювати щоб відповісти на своє ж запитання.
Типу предпологается що якщо людина задав питання то він сам рішення ну аж ніяк не знайде.
Ну ви приколісти.
- Uses
- .
- const
- sHEADER = '[TIME] [Prot Plen] [Source IP: Port] [Dest IP: Port] [Service] [Dlen] [Packet] [Data]';
- sPl = '% -12s% -4s% 4d% -20s>% -20s% -12s% 4d% s';
- type
- TForm1 = class (TForm)
- RichEdit1: TRichEdit;
- Memo1: TMemo;
- Label1: TLabel;
- procedure FormCreate (Sender: TObject);
- procedure FormDestroy (Sender: TObject);
- private
- _monRawSocket: TMonitorSocket;
- procedure Initialize ();
- procedure GetPacket (Sender: TObject; PacketInfo: TPacketInfo);
- public
- end;
- var
- Form1: TForm1;
- implementation
- procedure TForm1.FormCreate (Sender: TObject);
- begin
- Initialize ();
- Memo1.Lines.Clear;
- Memo1.Lines.Add (LocalIpList [0]);
- end;
- procedure TForm1.FormDestroy (Sender: TObject);
- begin
- _monRawSocket.Free;
- end;
- procedure TForm1.Initialize;
- begin
- _monRawSocket: = TMonitorSocket.Create (self);
- _monRawSocket.OnPacketEvent: = GetPacket;
- _monRawSocket.StartMonitor;
- RichEdit1.Lines.Clear;
- RichEdit1.SelAttributes.Color: = clMaroon;
- RichEdit1.Lines.Add (sHEADER);
- end;
- procedure TForm1.GetPacket (Sender: TObject; PacketInfo: TPacketInfo);
- var
- _srcIP, _distIP. String;
- _a, _b: string;
- begin
- SetLength (PacketInfo.DataBuf, 96);
- _b: = PacketInfo.DataBuf;
- StringRemCntls (_b);
- if PacketInfo.EtherProto = PROTO_IP then
- begin
- _srcIp: = IPToStr (PacketInfo.AddrSrc) + ':' + IntToStr (PacketInfo.PortSrc);
- _distip: = IPToStr (PacketInfo.AddrDest) + ':' + IntToStr (PacketInfo.PortDest);
- if PacketInfo.ProtoType = IPPROTO_ICMP then
- _a: = Format (sPL,
- [TimeToZStr (PacketInfo.PacketDT),
- GetIPProtoName (PacketInfo.ProtoType),
- sPL,
- _srcIp,
- _distIp,
- lowercase (GetICMPType (PacketInfo.IcmpType)),
- PacketInfo.DataLen, _b])
- else
- begin
- if (PacketInfo.DataLen = 0) then
- _b: = GetFlags (PacketInfo.TcpFlags);
- _a: = Format (sPL,
- [TimeToZStr (PacketInfo.PacketDT),
- GetIPProtoName (PacketInfo.ProtoType),
- PacketInfo.PacketLen,
- _srcIp,
- _distIp,
- Lowercase (GetServiceNameEx (PacketInfo.PortSrc, PacketInfo.PortDest)),
- PacketInfo.DataLen, _b]);
- end;
- end
- else
- begin
- _a: = Format (sPL,
- [TimeToZStr (PacketInfo.PacketDT),
- GetEtherProtoName (PacketInfo.EtherProto),
- PacketInfo.PacketLen,
- MacToStr (PacketInfo.EtherSrc),
- MacToStr (PacketInfo.EtherDest),
- '',
- PacketInfo.DataLen,
- _b]);
- end;
- RichEdit1.Lines.Add (_a);
- end;
Міні-форум питання
Відгукніться хто небудь.
Підкажіть тут InDy використовувати, WinPCap як небудь прикрутити, або інші варіанти є?
ВІРИТИ ВО позаземних цивілізацій НЕ ОЗНАЧАЄ ВІРИТИ В інопланетян.
indy не допоможе. (Якщо тільки не писати свою проксі).
Якщо потрібно просто моніторити трафік - то краще скачати собі Wireshark - він все Відмоніторити і по поличках розкладе.
Галочка "підтвердження прочитання" - вселенське зло.
Ні це потрібно саме в моїй проге, Wireshark у мене є.
Також є VoicedSniffer, який виконаний на Делфі і я б не сказав що він підвисає. Драйвер WinPCap не встановлено, але він як то працює.
ВІРИТИ ВО позаземних цивілізацій НЕ ОЗНАЧАЄ ВІРИТИ В інопланетян.
Щодо інді схоже так і є. Ставив вчора на форму всі компоненти які мають відношення до UDP, HTTP, TCP, жоден ні біта не прийняв. Схоже доведеться з вінпікапом возитися.
ВІРИТИ ВО позаземних цивілізацій НЕ ОЗНАЧАЄ ВІРИТИ В інопланетян.
Посидівши пару днів в інтернеті порахував що без вінпікапа обійдуся. Викладу код, раптом знадобиться кому. Якщо у вас багато адаптерів в системі розбирайтеся самі. Сніффер простий як три копійки, виключення я не обробляв. Якщо вам потрібно реагувати (програмно природно) на події в клієнт серверному додатку то просто допишіть обмеження по IP, щоб приймати дані тільки з потрібного сервера.
ВІРИТИ ВО позаземних цивілізацій НЕ ОЗНАЧАЄ ВІРИТИ В інопланетян.
Так, до речі мало не забув пояснити початківцям Х-менам що для роботи коду потрібно додати в секцію Uses наступне:
Monsock, WSocket, Packet32, Winsock, Magsubs1, Packhdrs
Власне шукаємо потрібні файли в інтернеті кидаємо в папку з проектом, кидаємо на форму мемо і richedit, і вперед до світлого майбутнього
ВІРИТИ ВО позаземних цивілізацій НЕ ОЗНАЧАЄ ВІРИТИ В інопланетян.
І всетаки вона вийшла простий і не підвисає.
ВІРИТИ ВО позаземних цивілізацій НЕ ОЗНАЧАЄ ВІРИТИ В інопланетян.
end;
Ну тепер все база є, далі самі думаємо.
ВІРИТИ ВО позаземних цивілізацій НЕ ОЗНАЧАЄ ВІРИТИ В інопланетян.