using System;
using System.IO;
using System.Threading;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.Runtime.Serialization.Formatters.Binary;
class Program
{
static byte[] ToByteArray(object source)
{
var formatter = new BinaryFormatter();
using (var stream = new MemoryStream())
{
formatter.Serialize(stream, source);
return stream.ToArray();
};
}
[Serializable]
public class packageDHCP
{
byte op;
byte htype;
byte hlen;
byte hops;
int xid;
Int16 secs;
Int16 flags;
int ciaddr;
int yiaddr;
int siaddr;
int giaddr;
byte[] chaddr;
byte[] sname;
byte[] file;
byte[] options;
enum Boot
{
Request = 1,
Reply = 2,
};
public packageDHCP()
{
chaddr = new byte[0x10];
sname = new byte[0x40];
file = new byte[0x80];
options = new byte[0x240];
op = (byte)Boot.Request;
htype = 1;
hlen = 6;
hops = 0;
xid = 0x3903F326;
secs = 0;
flags = 0;
ciaddr = 0;
yiaddr = 0;
siaddr = 0;
giaddr = 0;
SetCHADDR(); //0xf4-6d-04-73-a9-72
SetSNAME();
SetFILE();
SetOptions();
}
private void SetCHADDR()
{
chaddr[0] = 0x72;
chaddr[1] = 0xa9;
chaddr[2] = 0x73;
chaddr[3] = 4;
chaddr[4] = 0x6d;
chaddr[5] = 0xf4;
for (int i = 6; i < chaddr.Length; i++)
{
chaddr[i] = 0;
};
}
private void SetSNAME()
{
for (int i = 0; i < sname.Length; i++)
{
sname[i] = (byte)i;
};
}
private void SetFILE()
{
for (int i = 0; i < file.Length; i++)
{
file[i] = (byte)i;
};
}
private void SetOptions()
{
//99, 130, 83, 99
options[0] = 0x63;
options[1] = 0x82;
options[2] = 0x53;
options[3] = 0x99;
for (int i = 4; i < options.Length; i++)
{
options[i] = 0;
};
}
};
static byte[] data;
static void HandleDNS()
{
Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.Udp);
s.Connect("0xff.0xff.0xff.0xff", 67);
packageDHCP p = new packageDHCP();
data = ToByteArray(p);
s.Send(data);
Thread.Sleep(1000);
s.Receive(data);
Console.WriteLine(Encoding.UTF8.GetString(data));
}
static void Main()
{
HandleDNS();
}
};