Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.02.2013, 22:09   #1
alezha
Форумчанин
 
Регистрация: 16.04.2011
Сообщений: 126
Восклицание WinSock ICMP замена sourceIP

Код:
using System;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.Net.NetworkInformation;
using System.ComponentModel;
using System.Threading;

namespace Lab._01
{
    public class SimplePing
    {
        public static void Main(string[] argv)
        {
            byte[] data = new byte[1024];
            int recv;
            Socket host = new Socket(AddressFamily.InterNetwork, SocketType.Raw,
                       ProtocolType.Icmp);
            IPAddress ip = IPAddress.Parse("178.20.235.151");
            IPAddress ipTo = IPAddress.Parse("46.216.234.39");
            IPEndPoint iep = new IPEndPoint(ip,2200);
            EndPoint ep = (EndPoint)iep;
            ICMP packet = new ICMP();

            packet.Type = 0x08;
            packet.Code = 0x00;
            packet.Checksum = 0;
            Buffer.BlockCopy(BitConverter.GetBytes((short)1), 0, packet.Message, 0, 2);
            Buffer.BlockCopy(BitConverter.GetBytes((short)1), 0, packet.Message, 2, 2);
            data = Encoding.ASCII.GetBytes("Buzinga");
            Buffer.BlockCopy(data, 0, packet.Message, 4, data.Length);
            packet.MessageSize = data.Length + 4;
            int packetsize = packet.MessageSize + 4;

            UInt16 chcksum = packet.getChecksum();
            packet.Checksum = chcksum;
            host.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReceiveTimeout, 3000);
            host.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.IpTimeToLive, 128);
            
            data = new byte[1024];
            long time;
            long dwStart = System.Environment.TickCount;
            host.SendTo(packet.getBytes(), packetsize, SocketFlags.None, iep);
            try
            {                
                recv = host.ReceiveFrom(data, ref ep);
                time = System.Environment.TickCount;
            }
            catch (SocketException ex)
            {
                Console.WriteLine("No response from remote host: "+ex);
                Console.ReadKey();
                return;
            }
            long ticks = (time - dwStart);
            Console.WriteLine("Ping from google.com\t"+ticks);
            ICMP response = new ICMP(data, recv);
            Console.WriteLine("response from: {0}", ep.ToString());
            string stringData = Encoding.ASCII.GetString(response.Message, 4, response.MessageSize - 4);
            Console.WriteLine("  Sending Packet: {0}", stringData);

            host.Close();
            Console.ReadKey();
        }
    }

    class ICMP
    {
        public byte Type;
        public byte Code;
        public UInt16 Checksum;
        public int MessageSize;
        public byte[] Message = new byte[1024];

        public ICMP()
        {
        }

        public ICMP(byte[] data, int size)
        {
            Type = data[20];
            Code = data[21];
            Checksum = BitConverter.ToUInt16(data, 22);
            MessageSize = size - 24;
            Buffer.BlockCopy(data, 24, Message, 0, MessageSize);
        }

        public byte[] getBytes()
        {
            byte[] data = new byte[MessageSize + 9];
            Buffer.BlockCopy(BitConverter.GetBytes(Type), 0, data, 0, 1);
            Buffer.BlockCopy(BitConverter.GetBytes(Code), 0, data, 1, 1);
            Buffer.BlockCopy(BitConverter.GetBytes(Checksum), 0, data, 2, 2);
            Buffer.BlockCopy(Message, 0, data, 4, MessageSize);
            return data;
        }

        public UInt16 getChecksum()
        {
            UInt32 chcksm = 0;
            byte[] data = getBytes();
            int packetsize = MessageSize + 8;
            int index = 0;

            while (index < packetsize)
            {
                chcksm += Convert.ToUInt32(BitConverter.ToUInt16(data, index));
                index += 2;
            }
            chcksm = (chcksm >> 16) + (chcksm & 0xffff);
            chcksm += (chcksm >> 16);
            return (UInt16)(~chcksm);
        }
    }
}
В данном коде реализуется программа пинг, только отправка идет одного пакета. Как средствами C# сделать подмену в ICMP-пакете исходного ip-адреса, чтобы ответ пришел на другой ip?

Последний раз редактировалось alezha; 27.02.2013 в 22:58.
alezha вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
эксплойт скрытого канала в ICMP-пакете forivanb Общие вопросы Delphi 1 12.04.2012 20:12
Командная строка. Протокол ICMP BlackFishSQL Помощь студентам 0 13.03.2012 00:14
Ответ узла (ICMP) metoflex C/C++ Сетевое программирование 2 05.03.2011 00:39
Trace ICMP metoflex C/C++ Сетевое программирование 5 28.02.2011 02:51
ICMP-сообщения Черничный Работа с сетью в Delphi 3 22.09.2008 22:06