|
Вопрос # 5 376/ вопрос решён / |
|
Приветствую, уважаемые эксперты!
Нужно написать подобие сниффера, программа должна пассивно прослушивать определённый порт(он заранее известен, следить куда подключается прога не нужно), быть максимально простой и не подвисающей. Сохранять она ничего никуда не должна. С помощью сниффера была полученна информация что прослушиваемая программа общается с сервером используя HTTP и UDP, захватывать нужно и то и то.
Как проще реализовать такое на делфи?
Благодарю за помощ.
 |
Вопрос задал: QWERYTY (статус: Посетитель)
Вопрос отправлен: 5 июня 2011, 21:41
Состояние вопроса: решён, ответов: 1.
|
Ответ #1. Отвечает эксперт: ФИО или ник
Чё за дебильная система? Пришлось акк создавать чтоб ответить на свой же вопрос.
Типа предпологается что если человек задал вопрос то он сам решения ну уж никак не найдёт.
Ну вы приколисты.
Приложение: Переключить в обычный режим- 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
- { Private declarations }
- _monRawSocket: TMonitorSocket;
- procedure Initialize();
- procedure GetPacket(Sender: TObject; PacketInfo: TPacketInfo);
-
- public
- { Public declarations }
-
- end;
-
-
- var
- Form1: TForm1;
-
- implementation
-
- {$R *.dfm}
-
-
- 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;
-
-
-
-
-
 |
Ответ отправил: ФИО или ник (статус: Заблокирован)
Время отправки: 9 июня 2011, 04:16
Оценка за ответ: 5
|
Мини-форум вопроса
Всего сообщений: 19; последнее сообщение — 11 июня 2011, 01:00; участников в обсуждении: 3.
|
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 (статус: Посетитель), 6 июня 2011, 07:18 [#3]:
Нет это нужно именно в моей проге, Wireshark у меня есть.
Также есть VoicedSniffer, который выполнен на делфи и я бы не сказал что он подвисает. Драйвер WinPCap не установлен, но он как то работает.
ВЕРИТЬ ВО ВНЕЗЕМНЫЕ ЦИВИЛИЗАЦИИ НЕ ОЗНАЧАЕТ ВЕРИТЬ В ИНОПЛАНЕТЯН.
|
|
QWERYTY (статус: Посетитель), 6 июня 2011, 07:31 [#4]:
Насчёт инди похоже так и есть. Ставил вчера на форму все компоненты которые имеют отношение к UDP, HTTP, TCP, ни один ни бита не принял. Похоже придётся с винпикапом возиться.
ВЕРИТЬ ВО ВНЕЗЕМНЫЕ ЦИВИЛИЗАЦИИ НЕ ОЗНАЧАЕТ ВЕРИТЬ В ИНОПЛАНЕТЯН.
|
|
QWERYTY (статус: Посетитель), 9 июня 2011, 03:26 [#5]:
Посидев пару дней в интернете посчитал что без винпикапа обойдусь. Выложу код, вдруг пригодится кому. Если у вас много адаптеров в системе разбирайтесь сами. Сниффер простой как три копейки, исключения я не обрабатывал. Если вам нужно реагировать(програмно естественно) на события в клиент серверном приложении то просто допишите ограничение по IP, чтоб принимать данные только с нужного сервера.
Всем удачи.
ВЕРИТЬ ВО ВНЕЗЕМНЫЕ ЦИВИЛИЗАЦИИ НЕ ОЗНАЧАЕТ ВЕРИТЬ В ИНОПЛАНЕТЯН.
|
|
QWERYTY (статус: Посетитель), 9 июня 2011, 03:36 [#6]:
Да, к стати чуть не забыл пояснить начинающим Х-менам что для работы кода нужно добавить в секцию Uses следующее:
Monsock, WSocket, Packet32, Winsock, Magsubs1, Packhdrs
Собственно ищем нужные файлы в интернете кидаем в папку с проектом, кидаем на форму мемо и richedit, и вперёд к светлому будущему
ВЕРИТЬ ВО ВНЕЗЕМНЫЕ ЦИВИЛИЗАЦИИ НЕ ОЗНАЧАЕТ ВЕРИТЬ В ИНОПЛАНЕТЯН.
|
|
QWERYTY (статус: Посетитель), 9 июня 2011, 03:38 [#7]:
То Вадим К
И всётаки она вышла простой и не подвисающей.
ВЕРИТЬ ВО ВНЕЗЕМНЫЕ ЦИВИЛИЗАЦИИ НЕ ОЗНАЧАЕТ ВЕРИТЬ В ИНОПЛАНЕТЯН.
|
9 июня 2011, 04:25: Статус вопроса изменён на решённый (изменил автор вопроса — 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 (статус: 3-ий класс), 9 июня 2011, 20:40 [#9]:
Цитата (QWERYTY):
copy(IPToStr(PacketInfo.AddrSrc),1,2) = 'XX'
Индус, однако.
виконання програми розпочинається з того самого мiсця, де призупинилося.
|
|
QWERYTY (статус: Посетитель), 9 июня 2011, 22:29 [#10]:
"Индус, однако. "
Наверное это сленг применяемый между тобой и твоей бабушкой.
Может переведёшь с индусского на русский. В коде чтото не так? Лично в моём случае при старте приложения которое нужно "прослушать" в IP адресе меняются последние два октета. Если у кого другая ситуация адаптируем под себя.
ВЕРИТЬ ВО ВНЕЗЕМНЫЕ ЦИВИЛИЗАЦИИ НЕ ОЗНАЧАЕТ ВЕРИТЬ В ИНОПЛАНЕТЯН.
|
|
bugmenot (статус: 3-ий класс), 9 июня 2011, 22:47 [#11]:
Цитата (QWERYTY):
Наверное это сленг применяемый между тобой и твоей бабушкой.
Это ты мне или опять сам с собой?
Цитата (QWERYTY):
В коде чтото не так?
Именно, и как раз в процитированном выражении.
виконання програми розпочинається з того самого мiсця, де призупинилося.
|
|
QWERYTY (статус: Посетитель), 9 июня 2011, 22:55 [#12]:
Ну тебе естественно, а самому с собой приходится по тому что наши уважаемые эксперты не отвечают ни х*я.
Теперь по поводу кода, что там тебе не понравилось?
ВЕРИТЬ ВО ВНЕЗЕМНЫЕ ЦИВИЛИЗАЦИИ НЕ ОЗНАЧАЕТ ВЕРИТЬ В ИНОПЛАНЕТЯН.
|
|
bugmenot (статус: 3-ий класс), 10 июня 2011, 00:45 [#13]:
ну строки же, ради сравнения байта столько ненужных операций
виконання програми розпочинається з того самого мiсця, де призупинилося.
|
|
QWERYTY (статус: Посетитель), 10 июня 2011, 10:03 [#14]:
Хорошо. Альтернативное решение есть? Учитывая что изначально мы получаем не интежер, а IP.
ВЕРИТЬ ВО ВНЕЗЕМНЫЕ ЦИВИЛИЗАЦИИ НЕ ОЗНАЧАЕТ ВЕРИТЬ В ИНОПЛАНЕТЯН.
|
|
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 (статус: Посетитель), 10 июня 2011, 22:02 [#16]:
А в чём крутизна не поясните, а то я чёто...?
Это как то экономит такты процессора или на меньшее время занимает шину память-процессор?
В чём тут фенька?
ВЕРИТЬ ВО ВНЕЗЕМНЫЕ ЦИВИЛИЗАЦИИ НЕ ОЗНАЧАЕТ ВЕРИТЬ В ИНОПЛАНЕТЯН.
|
|
QWERYTY (статус: Посетитель), 10 июня 2011, 22:15 [#17]:
Чёто я не понял, там случайно не нужно подключать WinSock2 и еще какуюто белеберду?
Если да то не пойму к чему всё это, если эти данные уже есть в структуре Packetinfo.
ВЕРИТЬ ВО ВНЕЗЕМНЫЕ ЦИВИЛИЗАЦИИ НЕ ОЗНАЧАЕТ ВЕРИТЬ В ИНОПЛАНЕТЯН.
|
|
bugmenot (статус: 3-ий класс), 11 июня 2011, 00:34 [#18]:
дофига вопросов
Цитата (QWERYTY):
нужно подключать WinSock2
Есть такое понятие - иллюстрация. Структура in_addr объявлена в модуле WinSock, но как я сказал выше - она страшна как PHP и вполне допустимо объявить собственную, совместимую...
Цитата (QWERYTY):
уже есть в структуре Packetinfo
... или заюзать из библиотеки (которой у меня перед глазами нет), если она там присутствует.
Цитата (QWERYTY):
Это как то экономит такты процессора
Такие вещи надо объяснять? Тогда пусть это будет отдельным вопросом.
виконання програми розпочинається з того самого мiсця, де призупинилося.
|
|
QWERYTY (статус: Посетитель), 11 июня 2011, 01:00 [#19]:
Ладно bugmenot не будем больше тратить время на эту тему.
Мне сниффер по сути нах не нужен, это процентов 20 от моего проекта. А насчёт тактов я поинтересовался по тому что вот этот сниффер уже занимает 3.5M в оперативке, для проца он не сильно напряжен, но и проги ещё не конец. Хотелось бы уложиться в 10М в оперативке и проц при работе моей проги не превышал загрузку в 40 процентов.
ВЕРИТЬ ВО ВНЕЗЕМНЫЕ ЦИВИЛИЗАЦИИ НЕ ОЗНАЧАЕТ ВЕРИТЬ В ИНОПЛАНЕТЯН.
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|