|
Участник форума
Регистрация: 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..
|