Показать сообщение отдельно

  #19  
Старый 28.11.2008, 01:16
bons
Участник форума
Регистрация: 20.12.2007
Сообщений: 295
С нами: 9679872

Репутация: 347
По умолчанию

может это тебе поможет
вот исходник генератора пакетов, написал давно и иногда пользуюсь. В файле, имя которого надо передавать в аргументах, должен быть пакет канального уровня - с ethernet заголовком. Также надо указать номер адаптера

Код:
//Утилита передает содержимое файла
//напрямую сетевому адаптеру([к]анальный уровень)

program Generator;
{$APPTYPE CONSOLE}
uses windows;
//Описания структур
type packet = packed record
      OVERLAPPED: OverLapped;
      Buffer: pointer;
      Length: cardinal;
      Next: pointer;
      ulBytesReceived: cardinal;
      bIoComplete: boolean;
     end;
     ADAPTER = packed record
      hFile:cardinal;
      SymbolicLink: PAnsiChar;
     end;

//описания констант
const  SIMULTANEOU_READS = 10;
       MAX_ETHERNET_FRAME_SIZE = 1513;
       Max_Num_Adapter=5;
       NDIS_PACKET_TYPE_PROMISCUOUS = $0020;
       NumberOfPacket:cardinal=1; //How mutch send Packets

//импортируемые функции
function PacketGetAdapterNames(pStr:pointer; BufferSize:pointer):longint;stdcall;
 external 'packet.dll';
function PacketOpenAdapter(AdapterName:pointer):pointer; stdcall;
 external 'packet.dll';
function PacketAllocatePacket:pointer; stdcall;
 external 'packet.dll';
function PacketSetHwFilter(AdapterObject:pointer; Filter:cardinal):boolean; stdcall;
 external 'packet.dll';
procedure PacketInitPacket(lpPacket:pointer; Buffer:pointer; Length:cardinal); stdcall;
 external 'packet.dll';
function PacketSetNumWrites(AdapterObject:pointer; nwrites:integer):boolean; stdcall;
 external 'packet.dll';
function PacketSendPacket(AdapterObject:pointer; lpPacket:pointer; Sync:boolean):boolean; stdcall;
 external 'packet.dll';
procedure PacketFreePacket(lpPacket:pointer); stdcall;
 external 'packet.dll';
procedure PacketCloseAdapter(lpAdapter:pointer); stdcall;
 external 'packet.dll';

//Описания переменных
var //Список идентификаторов сетевых адаптеров
    AdapterList: array[0..Max_Num_Adapter-1, 0..255] of char;
    //Список имён сетевых адаптреров
  	AdapterNameList: array[0..Max_Num_Adapter-1, 0..255]of char;
    //Хэндл проекции файла
    hMap:cardinal;
    //Указатель на область памяти с отображенным файлом
    pBuf:pointer;
    //Номер используемого адаптера
    NAdapter:integer;
    //Указательн на структуру сетевого пакета
    lppacket:^Packet;
    //Указатель на структуру открытого адаптера
    lpadapter:^ADAPTER;
    //Хэндл файла
    hFile:cardinal;
    //Буфер для списка адаптеров и их названий
    AdapterBuffer:array [0..4095] of char;
    dwFileSize:word;
    AdapterBufferLength: cardinal;
    i,j,n:integer;

begin
 //Формирование списка адаптеров
 AdapterBufferLength := sizeof(AdapterBuffer);
 PacketGetAdapterNames(@AdapterBuffer, @AdapterBufferLength);

 n:=0; j:=0;
 while AdapterBuffer[j]<>#0 do begin
  lstrcpy(@AdapterList[n], @AdapterBuffer[j]);
  j:=j+lstrlen(@AdapterBuffer[j])+1;
  inc(n);
 end;
 while AdapterBuffer[j] = #0 do j:=j+1;
 for i:=0 to n-1 do begin
  lstrcpy(@AdapterNameList[i], @AdapterBuffer[j]);
  j:=j+lstrlen(@AdapterBuffer[j]) + 1;
 end;

 writeln('# Packet Generator on packet.dll');
 writeln('# ',n,' adapters detected');
 for j:=0 to n-1 do writeln(j+1,'. ', pChar(@AdapterNameList[j]), 
  ' - ', pChar(@AdapterList[j]));
 writeln;

 if ParamCount<2 then begin
   writeln('Usage: generator N_adapter packet_file');
   exit;
  end;

 //Выбор используемого адаптера
 if n=1 then NAdapter:=0
 else begin
 
  val(ParamStr(1), NAdapter, i);
  if (NAdapter>n) or (NAdapter=0) then begin
   writeln ('Invalid number');
   exit;
  end;
  NAdapter := NAdapter-1;
 end;
 writeln('# Selected adapter - ',pChar(@AdapterNameList[NAdapter]));

 //Адаптер нужно открыть
 lpAdapter := PacketOpenAdapter(@AdapterList[NAdapter]);
 if lpadapter.hFile=INVALID_HANDLE_VALUE then begin
  writeln('Error open adapter');
  exit;
 end;

 //Перевод адаптера в режим принятия всех пакетов
 if not PacketSetHwFilter(lpAdapter, NDIS_PACKET_TYPE_PROMISCUOUS) then begin
  writeln('! Could not set promiscuous type');
  //PacketCloseAdapter(lpAdapter);
  exit;
 end;
 writeln('# promiscuous type success');

 //Выделяется память для пакета
 lpPacket:= PacketAllocatePacket;
 if lpPacket=nil then begin
  writeln('! Could not allocate packet');
  //PacketCloseAdapter(lpAdapter);
  exit;
 end;
 writeln('# packet allocated success');

 //Открывается файл с пакетом
 hFile:=CreateFile(pChar(ParamStr(2)), GENERIC_READ, FILE_SHARE_READ,
  nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
 if hFile = INVALID_HANDLE_VALUE then begin
  writeln('Could not open file');
  //PacketFreePacket(lpPacket);
  //PacketCloseAdapter(lpAdapter);
  exit;
 end;
 dwFileSize:=GetFileSize(hFile, nil);
 hMap:=CreateFileMapping(hFile, nil, PAGE_WRITECOPY, 0, 0, nil);
 pBuf:=MapViewOfFile(hMap, FILE_MAP_COPY, 0, 0, 0);
 writeln;

 writeln('# File open success');
 writeln('# File size - ', dwFileSize);

 //Инициализация структуры пакета
 PacketInitPacket (lppacket, pBuf, dwFileSize);

 //Установка количества посылаемых пакетов
 PacketSetNumWrites (lpAdapter, NumberOfPacket);
 writeln('# Start sending');

 PacketSendPacket (lpAdapter, lpPacket,false);
 writeln('# All done.');

 //Проекция файла уничтожается
 UnmapViewOfFile(pBuf);
 CloseHandle(hMap);
 CloseHandle(hFile);
end.

Последний раз редактировалось bons; 28.11.2008 в 01:30..
 
Ответить с цитированием