Модераторы: Snowy, Poseidon, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сниффер меняющий траффик на лету, Такая вот проблемка 
:(
    Опции темы
xVirus
Дата 24.10.2006, 20:09 (ссылка)   | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 24.10.2006

Репутация: нет
Всего: нет



Всем привет.Не могли бы мне помочь?
Проблема следующего плана.Есть игрушка,в которую хотим порубится с народом из локалки.Этому мешает то,что игра видит локальные сервера в пределах одной подсети,а этих самых подсетей у нас штук 5-6,и в каждой немного геймеров есть.У меня возникла идея написать программку,которая
перехватывала бы широковещательные запросы игры,и перенаправляла их к конкретно заданному в данный момент серверу,в другую подсеть.
Собственно проблема: перехват запросов я сумел реализовать через RAW-сокеты,простым сниффингом трафика.Но не могу сделать отправку данных.Тоесть программа получает пакет,меняет в нем адрес назначения,и пытается отправить в сеть функцией send.Но функция в любом случае возвращает -1.Помогите как говорится кто чем может.Пожалуйста smile 
Исходник программы:

Код

{$APPTYPE CONSOLE}
program redirector;

uses
  windows,winsock2,sysutils;

type
TIPHeader = packed record
      HeaderLength_Version: Byte;
      TypeOfService:        Byte;          // Type of service
      TotalLength_b1:          byte;          // total length of the packet
      TotalLength_b2:          byte;
      Identification:       Word;          // unique identifier
      FragmentationFlags:   Word;     // flags
      TTL:                  Byte;          // Time To Live
      Protocol:             Byte;     // protocol (TCP, UDP etc)
      CheckSum_b1:             Byte;          // IP Header checksum
      CheckSum_b2:             Byte;          // IP Header checksum

      sourceIPb1:      Byte;    // Source address
      sourceIPb2:      Byte;
      sourceIPb3:      Byte;
      sourceIPb4:      Byte;
      destIPb1:        Byte;    // Destination Address
      destIPb2:        Byte;
      destIPb3:        Byte;
      destIPb4:        Byte;
end;


  TUDPHeader = record
  src_portno_b1    : byte;
  src_portno_b2    : byte;
  dst_portno_b1    : byte;
  dst_portno_b2    : byte;
  udp_length    : Word;
  udp_checksum  : Word;
  end;

const
Max_Packet  = 4096;

type
PUDPHeader = ^TUDPHeader;
PIPHeader = ^TIPHeader;
TPacketBuffer = Array [0..Max_Packet-1] of byte;



var
 n_addr:integer;
 N,a,i:integer;
 addrcount:integer;

 len:integer;
 optval:integer=1;


 raw_socket:TSOCKET;
 addr:sockaddr_in;
 buf:array[1..10000] of byte;
 llist:LPSOCKET_ADDRESS_LIST;
 wsadata:TWSAdata;


 PacketBuf:TPacketBuffer;
 ptr:integer;
 PIPPacketHeader:PIPHeader;
 PUDPPacketHeader:PUDPHeader;

const
 SIO_RCVALL=$98000001;

begin
 ptr:=Sizeof(TIPHeader);
 new(llist);
 if llist=nil then writeln('bad llist');
 if WSAStartup($202,wsadata)<>0 then
  begin
   writeln('-ERR:WSAStartup() -> ',WSAGetLastError);
   exit;
  end;
 raw_socket:=socket(AF_INET,SOCK_RAW,IPPROTO_IP);
 if raw_socket=INVALID_SOCKET then
  begin
   writeln('-ERR:socket(,SOCK_RAW,) -> ',WSAGetLastError);
   exit;
  end;
  if setsockopt(raw_socket, IPPROTO_IP, IP_HDRINCL, @optval, sizeof(optval))=SOCKET_ERROR then
  begin
   writeln('-ERR:setsockopt(,,IP_HDRINCL) -> ',WSAGetLastError);
   exit;
  end;
  
 if WSAIoctl(raw_socket,SIO_ADDRESS_LIST_QUERY,nil,0,llist,
         1024,@N,nil,nil) = SOCKET_ERROR then
  begin
   writeln('-ERR:WSAIoctl(,SIO_ADDRESS_LIST_QUERY) error ',
           WSAGetLastError);
   exit;
  end;
 n_addr:=llist^.iAddressCount;
 if n_addr=0 then
  begin
   writeln('-ERR:IP list is empty');
   exit;
  end;
  writeln(inet_ntoa(llist^.Address[0].lpSockaddr^.sin_addr));

  addr.sin_family:=AF_INET;
  addr.sin_addr:=llist^.Address[0].lpSockaddr^.sin_addr;

  if bind(raw_socket,@addr,sizeof(addr))=SOCKET_ERROR then
   begin
    writeln('-ERR:bind');
    exit;
   end;

  if WSAIoctl(raw_socket,SIO_RCVALL,@optval,sizeof(optval),nil,0,
             @N,nil,nil)=SOCKET_ERROR then
   begin
    writeln('-ERR:WSAIoctl(SIO_RCVALL) -> ',WSAGetLastError);
    exit;
   end;

  while true do
   begin
    len:=recv(raw_socket,buf,sizeof(buf),0);
    if len<1 then
      begin
       writeln('-ERR:recv() -> ',len,' WSAGetLastError=',WSAGetLastError);
       exit;
      end;
   {код,выполняющийся при получении пакета}
   PIPPacketHeader:=@Buf[1];
   PUDPPacketHeader:=@Buf[ptr+1];

   if PIPPacketHeader.Protocol=17 then
     if MakeWord(PUDPPacketHeader.dst_portno_b2,PUDPPacketHeader.dst_portno_b1)=29900 then
   begin
   writeln;
   writeln('Packet captured!Received data size:'+IntToStr(len));
   {writeln('UDP packet Info:');
   //вывод исходного IP
   writeln('Source address:'+IntToStr(PIPPacketHeader^.sourceIPb1)+'.'+IntToStr(PIPPacketHeader^.sourceIPb2)+'.'+
   IntToStr(PIPPacketHeader^.sourceIPb3)+'.'+IntToStr(PIPPacketHeader^.sourceIPb4));
   //вывод IP получателя
   writeln('Destination address:'+IntToStr(PIPPacketHeader^.destIPb1)+'.'+IntToStr(PIPPacketHeader^.destIPb2)+'.'+
   IntToStr(PIPPacketHeader^.destIPb3)+'.'+IntToStr(PIPPacketHeader^.destIPb4));
   //вывод протокола
   //writeln('Protocol:'+IntToStr(PIPPacketHeader.Protocol));
   writeln('Source port:'+IntToStr(MakeWord(PUDPPacketHeader.src_portno_b2,PUDPPacketHeader.src_portno_b1)));
   writeln('Destination Port:'+IntToStr(MakeWord(PUDPPacketHeader.dst_portno_b2,PUDPPacketHeader.dst_portno_b1)));
   writeln('Packet size:'+IntToStr(MakeWord(PIPPacketHeader.TotalLength_b2,PIPPacketHeader.TotalLength_b1)));
   writeln('Checksum:'+IntToStr(MakeWord(PIPPacketHeader.CheckSum_b2,PIPPacketHeader.CheckSum_b1)));
   }
   
   Writeln('Altering packet fields...');
   Move(buf,PacketBuf,len);
   PIPPacketHeader:=@PacketBuf[0];
   PUDPPacketHeader:=@PacketBuf[ptr+1];

   PIPPacketHeader.CheckSum_b1:=0;       //контрольная суммма устанавливается в 0
   PIPPacketHeader.CheckSum_b2:=0;
   PUDPPacketHeader.udp_checksum:=0;

   PIPPacketHeader.destIPb1:=10;        //прописывается конкретный адрес
   PIPPacketHeader.destIPb2:=219;
   PIPPacketHeader.destIPb3:=76;
   PIPPacketHeader.destIPb4:=47;

   writeln('Sending packet...');
   len:=send(raw_socket,PacketBuf,sizeof(Max_Packet),0);
   Writeln('Sended '+IntToStr(len)+' bytes');

   end;
  end;

  closesocket(raw_socket);
  WSACleanup;
  readln;
end.

PM MAIL   Вверх
drkot
Дата 25.10.2006, 13:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ищущий
***


Профиль
Группа: Завсегдатай
Сообщений: 1042
Регистрация: 5.5.2006

Репутация: 0
Всего: 8



А почему контрольная сумма в ноль устанавливается.



--------------------
Ошибка не становится истиной по причине широкого распространения,
как и Истина не становится Ошибкой из-за того, что никто её не видит.
PM   Вверх
xVirus
Дата 25.10.2006, 13:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 24.10.2006

Репутация: нет
Всего: нет



Она устанавливается в ноль,потому что при этом ОС сама за нас должна подсчитать ее(во всяком случае так утверждает парочка статей)
Если это не так,буду признателен за обьяснение,как ее высчитывать.
PM MAIL   Вверх
drkot
Дата 25.10.2006, 13:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ищущий
***


Профиль
Группа: Завсегдатай
Сообщений: 1042
Регистрация: 5.5.2006

Репутация: 0
Всего: 8



В том ракурсе что пакет без контрольной суммы вобже не отправится

Добавлено @ 13:53 
Цитата(xVirus @  25.10.2006,  13:45 Найти цитируемый пост)
Если это не так,буду признателен за обьяснение,как ее высчитывать

на форуме была ветка по расчету CRC в сетевых пакетах.
попробую найти.

Насколько я понимаю RAW передает то что в него затолкали. типа прямой записи в устройство и ответственность за формирование пакета лежит полностью на программисте.


--------------------
Ошибка не становится истиной по причине широкого распространения,
как и Истина не становится Ошибкой из-за того, что никто её не видит.
PM   Вверх
drkot
Дата 25.10.2006, 14:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ищущий
***


Профиль
Группа: Завсегдатай
Сообщений: 1042
Регистрация: 5.5.2006

Репутация: 0
Всего: 8



Кстати пришла идея  smile.
Пакетики недоходят в соседние сегменты по причине маленького значения TTL (1) для широковещательных пакетов так что можно в настройках винды поправить.


--------------------
Ошибка не становится истиной по причине широкого распространения,
как и Истина не становится Ошибкой из-за того, что никто её не видит.
PM   Вверх
drkot
Дата 25.10.2006, 14:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ищущий
***


Профиль
Группа: Завсегдатай
Сообщений: 1042
Регистрация: 5.5.2006

Репутация: 0
Всего: 8



http://forum.vingrad.ru/index.php?showtopic=70701
компоненты для работы с raw


--------------------
Ошибка не становится истиной по причине широкого распространения,
как и Истина не становится Ошибкой из-за того, что никто её не видит.
PM   Вверх
xVirus
Дата 25.10.2006, 14:57 (ссылка)   | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 24.10.2006

Репутация: нет
Всего: нет



Цитата(drkot @ 25.10.2006,  14:27)
Кстати пришла идея  smile.
Пакетики недоходят в соседние сегменты по причине маленького значения TTL (1) для широковещательных пакетов так что можно в настройках винды поправить.

У нас TTL нормальный.Все дело в том,что наш провайдер отсекает на роутере широковещательные пакеты,не пропуская их в соседние сегменты,для снижения общей нагрузки на сеть.За ссылку спасибо,попробую разобраться.
PM MAIL   Вверх
drkot
Дата 25.10.2006, 15:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ищущий
***


Профиль
Группа: Завсегдатай
Сообщений: 1042
Регистрация: 5.5.2006

Репутация: 0
Всего: 8



Я поюзал твой исходник и выяснил, что отлавливаются далко не все пакеты приходящие на сетевуху. Восновном игнорируются широковещательные, но не всегда. Соединения инициированный локально ловит четко.
Чем вызвано игнорирование некоторых пакетов? (я закономерности не нашел).

Добавлено @ 15:14 
А вот процедура для расчета контрольной суммы
взял здесь
Код

function CheckSum(var Buffer; Size : integer) : Word;
type
  TWordArray = array[0..1] of Word;
var
  ChkSum : LongWord;
  i : Integer;
begin
  ChkSum := 0;
  i := 0;
  while Size > 1 do
  begin
    ChkSum := ChkSum + TWordArray(Buffer)[i];
    inc(i);
    Size := Size - SizeOf(Word);
  end;

  if Size=1 then
    ChkSum := ChkSum + Byte(TWordArray(Buffer)[i]);

  ChkSum := (ChkSum shr 16) + (ChkSum and $FFFF);
  ChkSum := ChkSum + (Chksum shr 16);

  Result := Word(ChkSum);
end;



--------------------
Ошибка не становится истиной по причине широкого распространения,
как и Истина не становится Ошибкой из-за того, что никто её не видит.
PM   Вверх
xVirus
Дата 25.10.2006, 16:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 24.10.2006

Репутация: нет
Всего: нет



Чем вызвано игнорирование незнаю,но для моих задач вполне подходит,т.к. мне нужно отлавливать именно исходящие udp пакеты.
Возможно т.к. используются RAW-сокеты,то не отлавливаются пакеты как говорится non-IP протоколов.
За функцию спасибо,как проверю,отпишусь о результатах.
PM MAIL   Вверх
FF90h
Дата 25.10.2006, 18:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 72
Регистрация: 1.7.2006
Где: Планета Земля

Репутация: нет
Всего: 1



 Можно с винпкапом провернуть, для удобства можно использовать компоненты Magneta.. с отсылкой пакетов и crc могу помочь.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Сети"
Snowy
Poseidon
MetalFan

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Snowy, Poseidon, MetalFan.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.0502 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.