Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 5 376

/ вопрос решён /

Приветствую, уважаемые эксперты!
Нужно написать подобие сниффера, программа должна пассивно прослушивать определённый порт(он заранее известен, следить куда подключается прога не нужно), быть максимально простой и не подвисающей. Сохранять она ничего никуда не должна. С помощью сниффера была полученна информация что прослушиваемая программа общается с сервером используя HTTP и UDP, захватывать нужно и то и то.
Как проще реализовать такое на делфи?
Благодарю за помощ.

QWERYTY Вопрос решён, но можно продолжить его обсуждение в мини-форуме

Вопрос задал: QWERYTY (статус: Посетитель)
Вопрос отправлен: 5 июня 2011, 21:41
Состояние вопроса: решён, ответов: 1.

Ответ #1. Отвечает эксперт: ФИО или ник

Чё за дебильная система? Пришлось акк создавать чтоб ответить на свой же вопрос.
Типа предпологается что если человек задал вопрос то он сам решения ну уж никак не найдёт.
Ну вы приколисты.

Приложение:
  1. Uses
  2. ........
  3.  
  4. const
  5. sHEADER = '[ TIME ] [ Prot Plen ] [ Source IP:Port ] [ Dest IP:Port ] [ Service ] [ Dlen ] [ Packet ] [Data ]';
  6. sPl = '%-12s %-4s %4d %-20s > %-20s %-12s %4d %s' ;
  7.  
  8. type
  9. TForm1 = class(TForm)
  10. RichEdit1: TRichEdit;
  11. Memo1: TMemo;
  12. Label1: TLabel;
  13. procedure FormCreate(Sender: TObject);
  14. procedure FormDestroy(Sender: TObject);
  15.  
  16.  
  17. private
  18. { Private declarations }
  19. _monRawSocket: TMonitorSocket;
  20. procedure Initialize();
  21. procedure GetPacket(Sender: TObject; PacketInfo: TPacketInfo);
  22.  
  23. public
  24. { Public declarations }
  25.  
  26. end;
  27.  
  28.  
  29. var
  30. Form1: TForm1;
  31.  
  32. implementation
  33.  
  34. {$R *.dfm}
  35.  
  36.  
  37. procedure TForm1.FormCreate(Sender: TObject);
  38. begin
  39. Initialize();
  40. Memo1.Lines.Clear;
  41. Memo1.Lines.Add(LocalIpList[0]);
  42. end;
  43.  
  44. procedure TForm1.FormDestroy(Sender: TObject);
  45. begin
  46. _monRawSocket.Free;
  47. end;
  48.  
  49.  
  50.  
  51. procedure TForm1.Initialize;
  52. begin
  53.  
  54. _monRawSocket := TMonitorSocket.Create(self);
  55.  
  56.  
  57.  
  58. _monRawSocket.OnPacketEvent := GetPacket;
  59. _monRawSocket.StartMonitor;
  60.  
  61. RichEdit1.Lines.Clear;
  62. RichEdit1.SelAttributes.Color := clMaroon;
  63. RichEdit1.Lines.Add(sHEADER);
  64.  
  65. end;
  66.  
  67.  
  68.  
  69.  
  70. procedure TForm1.GetPacket(Sender: TObject; PacketInfo: TPacketInfo);
  71. var
  72. _srcIP, _distIP : String;
  73. _a, _b: string;
  74. begin
  75.  
  76. SetLength(PacketInfo.DataBuf, 96);
  77.  
  78. _b := PacketInfo.DataBuf;
  79. StringRemCntls (_b) ;
  80.  
  81. if PacketInfo.EtherProto = PROTO_IP then
  82. begin
  83. _srcIp := IPToStr (PacketInfo.AddrSrc) + ':' + IntToStr (PacketInfo.PortSrc);
  84. _distip := IPToStr (PacketInfo.AddrDest) + ':' + IntToStr (PacketInfo.PortDest) ;
  85.  
  86. if PacketInfo.ProtoType = IPPROTO_ICMP then
  87. _a := Format (sPL,
  88. [TimeToZStr(PacketInfo.PacketDT),
  89. GetIPProtoName (PacketInfo.ProtoType),
  90. sPL,
  91. _srcIp,
  92. _distIp,
  93. lowercase (GetICMPType (PacketInfo.IcmpType)),
  94. PacketInfo.DataLen, _b])
  95. else
  96. begin
  97. if (PacketInfo.DataLen = 0) then
  98. _b := GetFlags(PacketInfo.TcpFlags);
  99.  
  100. _a := Format (sPL,
  101. [TimeToZStr (PacketInfo.PacketDT),
  102. GetIPProtoName (PacketInfo.ProtoType),
  103. PacketInfo.PacketLen,
  104. _srcIp,
  105. _distIp,
  106. Lowercase (GetServiceNameEx (PacketInfo.PortSrc, PacketInfo.PortDest)),
  107. PacketInfo.DataLen, _b]) ;
  108. end;
  109. end
  110. else
  111. begin
  112. _a := Format (sPL,
  113. [TimeToZStr (PacketInfo.PacketDT),
  114. GetEtherProtoName (PacketInfo.EtherProto),
  115. PacketInfo.PacketLen,
  116. MacToStr (PacketInfo.EtherSrc),
  117. MacToStr (PacketInfo.EtherDest),
  118. '',
  119. PacketInfo.DataLen,
  120. _b]) ;
  121. end;
  122. RichEdit1.Lines.Add(_a);
  123. end;
  124.  
  125.  
  126.  
  127.  
  128.  


Ответ отправил: ФИО или ник (статус: Заблокирован)
Время отправки: 9 июня 2011, 04:16
Оценка за ответ: 5


Мини-форум вопроса

Всего сообщений: 19; последнее сообщение — 11 июня 2011, 01:00; участников в обсуждении: 3.
QWERYTY

QWERYTY (статус: Посетитель), 5 июня 2011, 22:15 [#1]:

Отзовитесь кто нибудь.
Подскажите здесь InDy использовать, WinPCap как нибудь прикрутить, или другие варианты есть?
ВЕРИТЬ ВО ВНЕЗЕМНЫЕ ЦИВИЛИЗАЦИИ НЕ ОЗНАЧАЕТ ВЕРИТЬ В ИНОПЛАНЕТЯН.
Вадим К

Вадим К (статус: Академик), 6 июня 2011, 00:54 [#2]:

indy не поможет. (если только не писать свою проксю).
Если нужно просто мониторить траффик - то лучше скачать себе Wireshark - он все отмониторит и по полочкам разложит.

Но если все таки в делфи... зайдите на сайт winpcap на страницу http://www.winpcap.org/misc/links.htm и найдите слово delphi. Там есть ссылки. Но предупреждаю, программа такого уровня навряд ли будет "простой и неподвисающей".
Галочка "подтверждения прочтения" - вселенское зло.
QWERYTY

QWERYTY (статус: Посетитель), 6 июня 2011, 07:18 [#3]:

Нет это нужно именно в моей проге, Wireshark у меня есть.
Также есть VoicedSniffer, который выполнен на делфи и я бы не сказал что он подвисает. Драйвер WinPCap не установлен, но он как то работает.
ВЕРИТЬ ВО ВНЕЗЕМНЫЕ ЦИВИЛИЗАЦИИ НЕ ОЗНАЧАЕТ ВЕРИТЬ В ИНОПЛАНЕТЯН.
QWERYTY

QWERYTY (статус: Посетитель), 6 июня 2011, 07:31 [#4]:

Насчёт инди похоже так и есть. Ставил вчера на форму все компоненты которые имеют отношение к UDP, HTTP, TCP, ни один ни бита не принял. Похоже придётся с винпикапом возиться.
ВЕРИТЬ ВО ВНЕЗЕМНЫЕ ЦИВИЛИЗАЦИИ НЕ ОЗНАЧАЕТ ВЕРИТЬ В ИНОПЛАНЕТЯН.
QWERYTY

QWERYTY (статус: Посетитель), 9 июня 2011, 03:26 [#5]:

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

Всем удачи.
ВЕРИТЬ ВО ВНЕЗЕМНЫЕ ЦИВИЛИЗАЦИИ НЕ ОЗНАЧАЕТ ВЕРИТЬ В ИНОПЛАНЕТЯН.
QWERYTY

QWERYTY (статус: Посетитель), 9 июня 2011, 03:36 [#6]:

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

Monsock, WSocket, Packet32, Winsock, Magsubs1, Packhdrs

Собственно ищем нужные файлы в интернете кидаем в папку с проектом, кидаем на форму мемо и richedit, и вперёд к светлому будущему
ВЕРИТЬ ВО ВНЕЗЕМНЫЕ ЦИВИЛИЗАЦИИ НЕ ОЗНАЧАЕТ ВЕРИТЬ В ИНОПЛАНЕТЯН.
QWERYTY

QWERYTY (статус: Посетитель), 9 июня 2011, 03:38 [#7]:

То Вадим К

И всётаки она вышла простой и не подвисающей.
ВЕРИТЬ ВО ВНЕЗЕМНЫЕ ЦИВИЛИЗАЦИИ НЕ ОЗНАЧАЕТ ВЕРИТЬ В ИНОПЛАНЕТЯН.

9 июня 2011, 04:25: Статус вопроса изменён на решённый (изменил автор вопроса — QWERYTY): Вопрос решён

QWERYTY

QWERYTY (статус: Посетитель), 9 июня 2011, 19:58 [#8]:

Насчёт получения данных с определённого IP. В процедуре GetPacket пишем:
{code}
procedure TForm1.GetPacket(Sender: TObject; PacketInfo: TPacketInfo);
var
packet: string;
begin
// Здесь вместо ХХ пишем первый октет из IP нужного нам сервера
if copy(IPToStr(PacketInfo.AddrSrc),1,2) = 'XX' then
begin
packet:= PacketInfo.DataBuf;
StringRemCntls (packet) ;
RichEdit1.Lines.Add(packet);
Edit1.Text:= IPToStr(PacketInfo.AddrSrc); //Это отношения к коду в ответе не имеет
//Это я в последствии для себя делал, можно удалить
end;

end; {/code}
Ну теперь всё база есть, дальше сами думаем.
ВЕРИТЬ ВО ВНЕЗЕМНЫЕ ЦИВИЛИЗАЦИИ НЕ ОЗНАЧАЕТ ВЕРИТЬ В ИНОПЛАНЕТЯН.
bugmenot

bugmenot (статус: 3-ий класс), 9 июня 2011, 20:40 [#9]:

Цитата (QWERYTY):

copy(IPToStr(PacketInfo.AddrSrc),1,2) = 'XX'

Индус, однако.
виконання програми розпочинається з того самого мiсця, де призупинилося.

QWERYTY

QWERYTY (статус: Посетитель), 9 июня 2011, 22:29 [#10]:

"Индус, однако. "
Наверное это сленг применяемый между тобой и твоей бабушкой.
Может переведёшь с индусского на русский. В коде чтото не так? Лично в моём случае при старте приложения которое нужно "прослушать" в IP адресе меняются последние два октета. Если у кого другая ситуация адаптируем под себя.
ВЕРИТЬ ВО ВНЕЗЕМНЫЕ ЦИВИЛИЗАЦИИ НЕ ОЗНАЧАЕТ ВЕРИТЬ В ИНОПЛАНЕТЯН.
bugmenot

bugmenot (статус: 3-ий класс), 9 июня 2011, 22:47 [#11]:

Цитата (QWERYTY):

Наверное это сленг применяемый между тобой и твоей бабушкой.

Это ты мне или опять сам с собой?

Цитата (QWERYTY):

В коде чтото не так?

Именно, и как раз в процитированном выражении.
виконання програми розпочинається з того самого мiсця, де призупинилося.

QWERYTY

QWERYTY (статус: Посетитель), 9 июня 2011, 22:55 [#12]:

Ну тебе естественно, а самому с собой приходится по тому что наши уважаемые эксперты не отвечают ни х*я.
Теперь по поводу кода, что там тебе не понравилось?
ВЕРИТЬ ВО ВНЕЗЕМНЫЕ ЦИВИЛИЗАЦИИ НЕ ОЗНАЧАЕТ ВЕРИТЬ В ИНОПЛАНЕТЯН.
bugmenot

bugmenot (статус: 3-ий класс), 10 июня 2011, 00:45 [#13]:

ну строки же, ради сравнения байта столько ненужных операций
виконання програми розпочинається з того самого мiсця, де призупинилося.

QWERYTY

QWERYTY (статус: Посетитель), 10 июня 2011, 10:03 [#14]:

Хорошо. Альтернативное решение есть? Учитывая что изначально мы получаем не интежер, а IP.
ВЕРИТЬ ВО ВНЕЗЕМНЫЕ ЦИВИЛИЗАЦИИ НЕ ОЗНАЧАЕТ ВЕРИТЬ В ИНОПЛАНЕТЯН.
bugmenot

bugmenot (статус: 3-ий класс), 10 июня 2011, 18:28 [#15]:

http://msdn.microsoft.com/en-us/library/ms738571(VS.85).aspx

var
  addr: TInAddr;
begin
  addr.S_addr := inet_addr('203.0.113.42');
  Assert(
    (Ord(addr.S_un_b.s_b1) = 203) and
    (Ord(addr.S_un_b.s_b2) = 0) and
    (Ord(addr.S_un_b.s_b3) = 113) and
    (Ord(addr.S_un_b.s_b4) = 42)
  );

знаю, оригинальная берклиевская нотация ужасна.
виконання програми розпочинається з того самого мiсця, де призупинилося.

QWERYTY

QWERYTY (статус: Посетитель), 10 июня 2011, 22:02 [#16]:

А в чём крутизна не поясните, а то я чёто...?
Это как то экономит такты процессора или на меньшее время занимает шину память-процессор?
В чём тут фенька?
ВЕРИТЬ ВО ВНЕЗЕМНЫЕ ЦИВИЛИЗАЦИИ НЕ ОЗНАЧАЕТ ВЕРИТЬ В ИНОПЛАНЕТЯН.
QWERYTY

QWERYTY (статус: Посетитель), 10 июня 2011, 22:15 [#17]:

Чёто я не понял, там случайно не нужно подключать WinSock2 и еще какуюто белеберду?
Если да то не пойму к чему всё это, если эти данные уже есть в структуре Packetinfo.
ВЕРИТЬ ВО ВНЕЗЕМНЫЕ ЦИВИЛИЗАЦИИ НЕ ОЗНАЧАЕТ ВЕРИТЬ В ИНОПЛАНЕТЯН.
bugmenot

bugmenot (статус: 3-ий класс), 11 июня 2011, 00:34 [#18]:

дофига вопросов

Цитата (QWERYTY):

нужно подключать WinSock2

Есть такое понятие - иллюстрация. Структура in_addr объявлена в модуле WinSock, но как я сказал выше - она страшна как PHP и вполне допустимо объявить собственную, совместимую...

Цитата (QWERYTY):

уже есть в структуре Packetinfo

... или заюзать из библиотеки (которой у меня перед глазами нет), если она там присутствует.

Цитата (QWERYTY):

Это как то экономит такты процессора

Такие вещи надо объяснять? Тогда пусть это будет отдельным вопросом.
виконання програми розпочинається з того самого мiсця, де призупинилося.

QWERYTY

QWERYTY (статус: Посетитель), 11 июня 2011, 01:00 [#19]:

Ладно bugmenot не будем больше тратить время на эту тему.
Мне сниффер по сути нах не нужен, это процентов 20 от моего проекта. А насчёт тактов я поинтересовался по тому что вот этот сниффер уже занимает 3.5M в оперативке, для проца он не сильно напряжен, но и проги ещё не конец. Хотелось бы уложиться в 10М в оперативке и проц при работе моей проги не превышал загрузку в 40 процентов.
ВЕРИТЬ ВО ВНЕЗЕМНЫЕ ЦИВИЛИЗАЦИИ НЕ ОЗНАЧАЕТ ВЕРИТЬ В ИНОПЛАНЕТЯН.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:45
Выполнено за 0.03 сек.