Издательский дом ООО "Гейм Лэнд"СПЕЦВЫПУСК ЖУРНАЛА ХАКЕР #30, МАЙ 2003 г.

Ping Master - трансляция cmd2html на ASP

Владимир Егоров aka Dr.NET

Спецвыпуск Xakep, номер #030, стр. 030-050-5


В методе "send_echo" создаем низкоуровневый сокет для протокола ICMP. Задаем массив байт, содержащий наш IP-пакет без задания IP-адресов отправителя и получателя. После этого добавляем в массив последовательно 8 байт IP-адресов отправителя и получателя. Как выделить эти байты, показано в листинге.

using System;

using System.Net;

using System.Net.Sockets;

using System.Text.RegularExpressions;

namespace Custom

{

public class Ping

{

protected static ushort checksum_ip(byte[] buffer)

{

ulong cksum = 0;

int hdr_length = (buffer[0]&0x000f)*4;

for (int i = 0; i<hdr_length;i+=2)

cksum+=(ulong)((buffer[i]<<8)+buffer[i+1]);

cksum = (cksum>>16)+(cksum&0xffff);

cksum+=(cksum>>16);

return ((ushort)~cksum);

}

public static bool send_echo(IPAddress ip_to, int timeout)

{

Socket socket = new Socket(AddressFamily.InterNetwork,SocketType.Raw,ProtocolType.Icmp);

IPEndPoint ep = new IPEndPoint(ip_to,0);

byte[] data = {69,0,0,28,2,134,0,0,128,1, 0,0, 0,0,0,0, 0,0,0,0, 8,0,176,255,1,0,70};

data[19] = (byte)(ip_to.Address>>24);

data[18] = (byte)((ip_to.Address>>16)&0x00ff);

data[17] = (byte)((ip_to.Address>>8)&0x0000ff);

data[16] = (byte)(ip_to.Address&0x000000ff);

ushort check = checksum_ip(data);

data[10] = (byte)(check>>8);

data[11] = (byte)(check&0x00ff);

socket.SendTo(data,ep);

return (socket.Poll(timeout,SelectMode.SelectRead));

}

public static void Main(string[] address)

{

IPAddress rcpt_ip = IPAddress.None;

Regex rx = new Regex(@"(\d{1,3}.){3}(\d{1,3}){1}");

if (rx.Match(address[0]).Success)

rcpt_ip = IPAddress.Parse(address[0]);

else

rcpt_ip = Dns.GetHostByName(address[0]).AddressList[0];

if (Ping.send_echo(rcpt_ip,5000000)) Console.WriteLine("Требуемый хост доступен");

else Console.WriteLine("Требуемый хост недоступен");

}

}

}

После этого отправляем пакет получателю и ждем ответа "timeout" микросекунд.

Процедура "Main" получает в качестве параметра IP-адрес или DNS-имя компа и преобразует DNS-имя в IP-адрес с помощью метода "Dns.GetHostByName". Я не стал проверять вводимые данные, так как наша ASPX-страница уже это делает, и при обращении к проге из этой страницы все адреса уже должны быть в подходящем формате (но учти, если использовать прогу отдельно от нашей ASP.NET-страницы, то проверку форматов провести нужно обязательно). В конце, используя метод "send_echo", посылаем запрос, ждем 5 секунд и пишем, доступен хост или нет. Осталось откомпилировать эту программу. Делается это с помощью компилятора C# "csc.exe" следующим образом: "csc.exe /t:exe /out:ping.exe ping.cs" (разумеется, без кавычек и при условии, что "ping.cs" лежит там же, где и "csc.exe", а если нет, то пишем полный путь к файлу кода). После компиляции изменяем "FileName" и "Arguments" в ASP.NET-странице и юзаем.

Назад на стр. 030-050-4  Содержание  Вперед на стр. 030-050-6