Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Сети > Мне надо написать программу, которая фильтровала


Автор: Monty 20.10.2003, 22:07
но с чего начать не знаю ...... главная задача: поиск и справления содержимого пакета ..... допустим, байт FF заменять на 00 и т.д. ........... как это можно сделать notify.gif ....... в этом я не разбираюсь вообще и с сетью не имел дел в программировании smile.gif ........ да, она должна принимать с одного порта, а отправлять с другого уже обработанный пакет, пока только исходящии пакеты ............ я в этом 0, но это мне нужно smile.gif ........ помогите кто чем может ......

Автор: Dmitry V.Abramov 20.10.2003, 23:51
Так в чем вопрос то? Какая сеть? Какой протокол? Формат пакета?

Автор: Baa 21.10.2003, 01:09
Так а в чем проблема? если приходят на один порт, а должны уходить с другого... с виду вообще плевое дело... открой самые простые исходники клиент-серверных приложений и посмори, как это делается.

Автор: Monty 21.10.2003, 03:18
Цитата(Dmitry @ 20.10.2003, 22:51)
Так в чем вопрос то? Какая сеть? Какой протокол? Формат пакета?

Нужен пример как сделать перенаправление с одного порта на другой, при этом обрабатывать данные
Сеть можно считать LAN
Протокол TCP и нужен будет UDP
Формат пакета любой ........ а заголовки пакета изменять возможно? Так как это тоже может понадобится smile.gif

Baa таких исходников у меня нет smile.gif

Автор: Dmitry V.Abramov 21.10.2003, 03:24
Baa А если речь о пакетах TCP, UDP, ARP, IPX, или что там еще может по сети летать... Вдруг человека заставили писать маршрутизатор? Тогда еще встанет задача работы с несколькими сетевыми интерфейсами. Вобщем, почти бесконечная тема при данной постановке "вопроса".

Автор: Monty 21.10.2003, 03:45
Dmitry V.Abramov это я для себя smile.gif ........ нужно только TCP и UDP, при этом полность контролировать пакеты, т.е. не только следить за его содержимым, но и за заголовком smile.gif

Есть программы похожие как CommView, Iris Network Analiser и т.д. ...... они позволяют отлавливать пакеты и редактировать их, в том числе и заголоки ........ мне всего лишь надо фильтровать их, можно сказать "налету" smile.gif ..... получая с одного порта, обработывать его (по одному пакету), после чего отсылать .......

Автор: Dmitry V.Abramov 21.10.2003, 14:52
Цитата(Monty @ 21.10.2003, 03:45)
Dmitry V.Abramov это я для себя smile.gif ........ нужно только TCP и UDP, при этом полность контролировать пакеты, т.е. не только следить за его содержимым, но и за заголовком smile.gif

Это еще терпимо... Главная проблема, пробраться почти на самый нижний уровень TCP-стека, решается с помощью SDK от http://winpcap.polito.it/. Остальное - написанием оптимального и очень быстрого кода.

Автор: Dayana 21.10.2003, 18:35
вот код, который я когда-то писала, используя TWSocket

попробуй что-то типа этого
Код

 UDPSocket  : TWSocket;

 UDPSocket := TWSocket.Create(nil);
 UDPSocket.Proto    := 'udp';
 UDPSocket.Addr     := '100.100.100.100';
 UDPSocket.Port      := 8888;
 UDPSocket.LocalPort := 8888;
 UDPSocket.OnDataAvailable := UDPSocketGetData;
 UDPSocket.Connect;

procedure UDPSocketGetData(Sender: TObject);
var
  vBuf    : array [0..4028] of char;
  BufLen  : Integer;
begin
....
   BufLen := UDPSocket.Receive(@vBuf, 4028);
....
end;


сейчас я модуль wsocket не нашла, хотя думала, что он входит в поставку Делфи... у меня есть wsocket.dcu... если хочешь, вышлю... И завтра поищу исходник...

Автор: Monty 21.10.2003, 19:06
Dayana спасибо .... уже что-то проясняется smile.gif ..... буду очень рад исходнику, а wsocket у меня есть smile.gif

Dmitry V.Abramov не знаю я С smile.gif ..... а там только на нем, а на Дельфи есть?

Автор: Dayana 21.10.2003, 19:10
Monty, я имела ввиду исходник wsocket... :-)

Автор: Monty 21.10.2003, 19:50
Цитата(Dayana @ 21.10.2003, 18:10)
Monty, я имела ввиду исходник wsocket... :-)

Dayana оказывается его у меня нет smile.gif ..... перепутал с winsock smile.gif

Автор: Dmitry V.Abramov 21.10.2003, 21:23
Цитата(Monty @ 21.10.2003, 19:06)
Dmitry V.Abramov не знаю я С smile.gif ..... а там только на нем, а на Дельфи есть?

"Врага нужно знать и уважать"... Врядли ты найдешь столь низкоуровневые сетевые вещи, писанные не на С. С другой стороны - там ведь есть готовые DLL! Уж в заголовочых файлах то можно разобрать набор параметров для 2,3,4 интересующих функций...


Автор: Dmitry V.Abramov 21.10.2003, 21:42
Цитата(Dayana @ 21.10.2003, 18:35)
вот код, который я когда-то писала, используя TWSocket
...

Это стандартнейшая посылка UDP-message через Winsocket. Такое есть в любой библиотеке, не только в TWSocket от ICS (piette). TIdUDPClient/TIdUDPServer из Indy - ничем не хуже в этом плане. До пакетов же еще очень далеко.

Работа с сетевыми пакетами лежит гораздо глубже. Там уже нет сокетов. Там порты, заголовки, фреймы, очереди, лешие, водяные... Русалок пока не попадалось.

Автор: Dayana 21.10.2003, 23:00
Dmitry V.Abramov, тем не менее, используя winsocket, я с успехом получаю каждый пакет и обрабатываю его....

Автор: Dayana 21.10.2003, 23:12
Или вот, открывает сокет на получение любых пакетов:

Код


uses WinSock;

   Port    : word;
   HostIP  : string;
   DestIP  : string;
   IpCount : integer;
   RcvPack  : array [0..MAX_PACK_SIZE - 1] of char;
   vWSAData : TWSAData;
   S        : TSocket;
   SockAddr : TSockAddrIn;
   PackLen  : integer;


 FillChar(RcvPack, MAX_PACK_SIZE, #0);
 WSAStartUp(MakeWord(2,2), vWSAData);
 S := Socket(AF_INET, SOCK_RAW, IPPROTO_IP);
 SockAddr.sin_family := AF_INET;
 SockAddr.sin_port := htons(Port);
 SockAddr.sin_addr.S_un_b.s_b1 := IPToBytesByNum(HostIP, 1);
 SockAddr.sin_addr.S_un_b.s_b2 := IPToBytesByNum(HostIP, 2);
 SockAddr.sin_addr.S_un_b.s_b3 := IPToBytesByNum(HostIP, 3);
 SockAddr.sin_addr.S_un_b.s_b4 := IPToBytesByNum(HostIP, 4);
 try
   Bind(S, SockAddr, SizeOf(SockAddr));
   Flag := 1;
   ioctlsocket(S, SIO_RCVALL, Flag);
 except
   CloseSocket(S);
   WSACleanUp;
   Result := -1;
 end;
 Result := 0;

читать пакеты:
     PackLen := recv(S, RcvPack, MAX_PACK_SIZE, 0);


это уже на низком уровне...

Автор: Dmitry V.Abramov 22.10.2003, 00:25
Dayana ... Сокеты никогда не были "низким уровнем", ибо изначально задуманы для его сокрытия.

Как бы эдак заполнить TSockAddrIn, чтобы послать пакет с адресом соседа в поле sin_addr? smile.gif А подсунуть в него не мой MAC address? А послать popup message на компьютер в smb сети? А если он в другом сегменте? И еще много таких каков...

Может вас смущают названия переменных RcvPack и PackLen ? Назовите их RcvMsg и MsgeLen. Или RcvBuffer и BufferLen. Так будет гораздо ближе к их настоящей роли в формировании сетевого пакета.

Автор: Dmitry V.Abramov 22.10.2003, 00:33
Цитата(Dayana @ 21.10.2003, 23:00)
Dmitry V.Abramov, тем не менее, используя winsocket, я с успехом получаю каждый пакет и обрабатываю его....

Безусловно! Но все его поля вам не доступны. Лишь пользовательские данные и немного адресных.

Вы сможете с помощью winsock отправить от себя ping на одну машину, но чтобы echo та послала на другую (не на ту, откуда уходил ping)? Вопрос риторический...

Видимо, все из-за несогласовавнной терминологии - в одни и те же слова мы вкладываем очень разный смысл. Еще хуже с этим обстоит дело в изначальном вопросе этого раздела...

Автор: Monty 22.10.2003, 00:49
Все, я определился с программой smile.gif ........ нужно только фильтровать ту информацию которую несет в себе пакет .......... ну а позже буду подменивать IP Adress ...... но не сейчас smile.gif ..... сейчас бы хоть элементарную фильровку сделать бы smile.gif

Dayana спасибо smile.gif .... а как его отправить с другого порта? smile.gif

Dmitry V.Abramov ок, раберусь, но если не выйдет с WinSock wink.gif

Автор: Monty 22.10.2003, 00:59
Не выходит с примером =\

Вот так выглядит пакет:
Код
0x0000   00 04 E2 79 6F D0 00 C0-9F 1B AE F5 08 00 45 00   ..?yo?.??.®?..E.
0x0010   00 25 1C 78 00 00 C8 11-62 1C C0 A8 02 13 D9 6B   .%.x..?.b.??..?k
0x0020   D8 0C 05 92 69 8A 00 11-CA A0 FF FF FF FF 72 75   ?..’i?..? ????ru
0x0030   6C 65 73                                          les

Мне нужно только изменить то что он несет ....... допустим, rules на bules :) ...... приняв его с порта 3000 и отослать его на удаленный сервер на порт 4000 :) ........ как то так

PS согласен что неправильно сформулировал вопрос в самом начале :) ......

Автор: Dmitry V.Abramov 22.10.2003, 01:53
Monty Ну так, а как был получен этот пакет - раскроешь страшную тайну? smile.gif Или нам опять строить предположения и спорить о значении терминов...

Можно, конечно, покопавшись вычислить чей это буффер, с какого адреса и на какой шел, и с какого на какой порт. Но проще спросить об этом автора.

Автор: Dayana 22.10.2003, 10:09
Monty, на всякий случай, может быть что-то полезное вычитаешь http://forum.vingrad.ru/index.php?act=ST&f=2&t=6256&st=0. Поищи в сети описание заголовка пакета. В нем зашит и порт, и мак адрес, и остальная инфа... А вообще я с помощью сниффера смотрела, какие байты, что содержат...

Автор: Monty 22.10.2003, 18:26
Пакет я с помощью снифера получил smile.gif ...... но писать снеффир мне не надо smile.gif ..... надо лишь менять содержимое пакета .......

Dmitry V.Abramov
user posted image

PS программа с таким кодом замирает тут же не открыв порта
Код
var
 RcvPack : array [0..8024] of char;
 AddrSour : TSockAddr;
 i : integer;
 PackLen : integer;
 vWSAData : TWSAData;
 S : TSocket;
 SockAddr : TSockAddrIn;
 HostName : array[0..128] of char;
 pLocHost : PHostEnt;
 Flag : u_long;

begin
 FillChar(RcvPack, 8024, #0);
 GetHostName(HostName, 129);
 pLocHost := GetHostByName(HostName);
 WSAStartUp(MakeWord(2,2), vWSAData);
 S := Socket(AF_INET, SOCK_RAW, IPPROTO_IP);
 SockAddr.sin_family := AF_INET;
 SockAddr.sin_port := htons(5003);
 SockAddr.sin_addr.S_un_b.s_b1 := #127;
 SockAddr.sin_addr.S_un_b.s_b2 := #0;
 SockAddr.sin_addr.S_un_b.s_b3 := #0;
 SockAddr.sin_addr.S_un_b.s_b4 := #1;
 Bind(S, SockAddr, SizeOf(SockAddr));
 Flag := 1;
 ioctlsocket(S, SIO_RCVALL, Flag);
 for i := 1 to 10 do
   PackLen := recv(S, RcvPack, 8024, 0);
 CloseSocket(S);
end;

Автор: Monty 22.10.2003, 18:33
Dayana я нашел тот компонент который ты использовала smile.gif .... надо было мне сразу в яндекс зайти ....

http://overbyte.delphicenter.com/frame_index.html

Автор: Dayana 22.10.2003, 21:15
Monty, точно... я же оттуда его брала... Ну у тебя получилось?

Автор: Monty 22.10.2003, 21:16
Цитата(Dayana @ 22.10.2003, 20:15)
Monty, точно... я же оттуда его брала... Ну у тебя получилось?

Все демосы там работают .... пока буду сам разбиратся .... спасибо smile.gif

PS там нашел еще пару нужных компонентов которые я искал долго smile.gif

Добавленно:
Просто появилась еще одна проблемма .... у той программы что я хотел перенапрявлять пакеты не фиксированый порт mad.gif ...... даже проверить не могу, но это уже я сам smile.gif

Автор: Dmitry V.Abramov 22.10.2003, 22:47
Цитата(Monty @ 22.10.2003, 18:26)
Dmitry V.Abramov
PS программа с таким кодом замирает тут же не открыв порта
Код
var
 RcvPack : array [0..8024] of char;
 AddrSour : TSockAddr;
 i : integer;
 PackLen : integer;
 vWSAData : TWSAData;
 S : TSocket;
 SockAddr : TSockAddrIn;
 HostName : array[0..128] of char;
 pLocHost : PHostEnt;
 Flag : u_long;

begin
 FillChar(RcvPack, 8024, #0);
 GetHostName(HostName, 129);
 pLocHost := GetHostByName(HostName);
 WSAStartUp(MakeWord(2,2), vWSAData);
 S := Socket(AF_INET, SOCK_RAW, IPPROTO_IP);
 SockAddr.sin_family := AF_INET;
 SockAddr.sin_port := htons(5003);
 SockAddr.sin_addr.S_un_b.s_b1 := #127;
 SockAddr.sin_addr.S_un_b.s_b2 := #0;
 SockAddr.sin_addr.S_un_b.s_b3 := #0;
 SockAddr.sin_addr.S_un_b.s_b4 := #1;
 Bind(S, SockAddr, SizeOf(SockAddr));
 Flag := 1;
 ioctlsocket(S, SIO_RCVALL, Flag);
 for i := 1 to 10 do
   PackLen := recv(S, RcvPack, 8024, 0);
 CloseSocket(S);
end;

О каком порте речь в подслушивающем режиме? Порт - это всего лишь 2 байта в заголовке. К тебе же начинают валить все заголовки сразу.

Не замирает, а внимательно слушает smile.gif
У тебя, видимо, ничего не происходит по адресу 127.0.0.1. Попробуй, например, ping 127.0.0.1

А еще - SIO_RCVALL работает только в win2000 и выше. У тебя не Win9x?

Кстати, GetHostName/GetHostByName раньше было принято вызывать строго после WSAStartUp.

Автор: Dmitry V.Abramov 22.10.2003, 23:01
Цитата(Dayana @ 21.10.2003, 23:12)
Код
...
   ioctlsocket(S, SIO_RCVALL, Flag);
...


это уже на низком уровне...

Либо не заметил вот этой строчки, либо она появилась после "Это сообщение отредактировал Dayana - 21.10.2003, 23:15 " ;)

Если не заметил, то виноват и отзываю последующие затем хихикания. Тогда зацепился вот за это:
Код
SockAddr.sin_port := htons(Port);
- в promiscuous mode нет понятия "порт". Эту строчку можно выкинуть.

Вот только работать это будет лишь начиная с win2000. И не совместимо с программированием юниксных сокетов. Последнее может быть не важно. А вот первое...

Автор: Baa 23.10.2003, 00:54
Цитата
У тебя, видимо, ничего не происходит по адресу 127.0.0.1. Попробуй, например, ping 127.0.0.1

Вы прикалываетесь чтоли? енто ж loopback... ping localhost = тест сетевой карты...

Автор: Dmitry V.Abramov 23.10.2003, 02:06
Цитата(Baa @ 23.10.2003, 00:54)
Цитата
У тебя, видимо, ничего не происходит по адресу 127.0.0.1. Попробуй, например, ping 127.0.0.1

Вы прикалываетесь чтоли? енто ж loopback... ping localhost = тест сетевой карты...

Нужно создать поток сетевых пакетов. Чем плох пинг в этом случае? Тем что шлет ICMP? Так ведь снифферу что там летает.

А вот сетевую карту я бы не стал тестировать пингами на 127.0.0.1... smile.gif

Автор: Monty 23.10.2003, 05:43
Не выходит у меня с компонентами smile.gif ........ как можно сделать прием с одного порта и отправку на другой порт при этом его не трогать (сам пакет) .... как бы перенапрявляя с одного порта на другой ...... используя TWSocket? confused.gif ................ неее .... не в ладах я с этим sad.gif ...... можно рабочий код? если это не трудно smile.gif

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)