ARP запрос на delphi

Автор: anon
19.09.2009 17:20

Вообще-то я просто хотел проверить модуль для посветки кода, для этого и выкладываю прямо здесь и сейчас исходник замечательной утилиты arper (только windows). Несмотря на столь грозное название все что она делает - посылает ARP-запрос. В качестве параметра принимается IP-адрес.

 

program arper;
{$APPTYPE CONSOLE}
uses windows, winsock, sysutils;
 
{------------------------------------------------------}
// Вывод причин ошибки
procedure print_err(const comment:string; err : DWORD);
var locbuf : array[0..1023] of char;
begin
 FormatMessage(
  FORMAT_MESSAGE_FROM_SYSTEM OR FORMAT_MESSAGE_ARGUMENT_ARRAY,
  nil, err, 0, locbuf, sizeof(locbuf), nil
 );
 CharToOem(locbuf, locbuf);
 write(ErrOutput, comment, ' (', err, ') ', pChar(@locbuf));
end;
 
{------------------------------------------------------}
procedure usage();
begin
 writeln(ErrOutput, 'Usage: arper ip_address');
 halt(1);
end;
 
{------------------------------------------------------}
type SendARP_func = function(
  DestIP,
  SrcIP:in_addr;
  pMacAddr,
  PhyAddrLen:PULONG
): DWORD; stdcall;
 
var iphlpdll : HMODULE;
    SendARP : SendARP_func;
 
    src_ip, dest_ip : in_addr;
    mac_addr : array [0..7] of byte;
    mac_addr_len : ULONG;
    i, ret_val : DWORD;
 
BEGIN
 if ParamCount() <> 1 then usage();
 
 //динамическая загрузка библиотеки
 iphlpdll := LoadLibrary('Iphlpapi.dll');
 if iphlpdll = 0 then begin
  print_err('Error: LoadLibrary failed with', GetLastError());
  halt(1);
 end;
 @SendARP := GetProcAddress(iphlpdll, 'SendARP');
 if @SendARP = nil then begin
  print_err('Error: GetProcAddress failed with', GetLastError());
  halt(1);
 end;
 
 //инициализация параметров и вызов SendARP
 src_ip.S_addr := 0;
 dest_ip.S_addr := inet_addr(pChar(ParamStr(1)));
 if dest_ip.S_addr = INADDR_NONE then begin
  writeln(ErrOutput, 'Bad ip address');
  halt(1);
 end;
 mac_addr_len := 6;
 ret_val := SendARP(dest_ip, src_ip, @mac_addr, @mac_addr_len);
 
 if ret_val = NO_ERROR then begin
  if mac_addr_len <> 0 then begin
   //вывод результатов
   for i := 0 to mac_addr_len - 1 do begin
    write(inttohex(mac_addr[i],2));
    if i <> mac_addr_len - 1 then write('-');
   end;
  end else begin
   writeln(
    ErrOutput,
    'Warning: SendARP completed successfully, but returned length = 0'
   );
  end; 
 end else
  print_err('Error: SendArp failed with', ret_val);
END.

 

Обновлено 27.02.2010 16:08

 

Добавить комментарий


Защитный код
Обновить