작성자 유창훈


환경설정 마무리하겠습니다.
다음과 같은 순서를 말씀드렸습니다

1. 전체 Packet구조인 ICMPPacket 구조를 사용하겠다 선언하고,   ICMP 멤버변수를 셋팅한다.
2. IP의 data부분인 ICMP구조가 완성되었으므로, 캡슐화순서에 따라 IP헤더부분을 작성한다.
3. getbyte() 메소드를 통해 전체 ICMPPacket로 선언된 p의 데이터링크 계층(이더넷헤더)의 해당하는 값을 할당할 수 있음을 선언한다.
4. 이더넷의 데이터 부분인 IP헤더 IP데이터(ICMP)가 다 작성되었으므로 이더넷 헤더를 작성한다.
5. 헤더 작성후, 이더넷 헤더를 기존의 ICMPPacket에 붙인다
6. 보낸다.

하지만 제가 오늘 할 프로그래밍 적 순서는 다음과 같습니다
1. 전체 Packet 구조의 기본형만을 선언한다 ( ICMPPacket사용안함)
2. 임의의 배열안에 패킷 전체 구조를 작성한다.
3. Packet의 기본형구조에 방금전 구성한 전체 패킷 구조를 맵핑한다
4. 보낸다.

---------------------------------------------------------------------------------------------------------
처음 부터 제가 생각한 프로그래밍 구조는 다음과 같습니다.

"우리가 보내고자 하는 패킷의 길이만큼  1byte형 배열을 선언하여, 바이트단위로 또는 비트단위로 헥사 값으로 셋팅하여
보낸다." 
  
Jpcap library에서 제공해주는 클래스와 메소드는 편하고 유용 합니다. 저도 다른프로젝트의 도구로 Jpcap을 사용한다면 다른 개발자와의 협업을 위해서라도 Jpcap에서 제공해주는 방법들을 다 사용할것입니다. 그게  효율적입니다.
하지만
여기서 패킷에서 비트단위또는 바이트 단위까지 헥사값이나 이진값으로 직접 보며 익히는 방법이 패킷에 대한 구조를 제일 빠르게 익히는 방법인것 같습니다. 좀... 비효율적이긴 해도요. 그래서 다음과 같이 구현하였습니다.

---------------------------------------------------------------------------------------------------------------------------

JpcapSender sender=JpcapSender.openDevice(devices[0]);
/*sender 객체를 사용하도록 선언, JpcapSender.openDevice(device[디바이스번호]);
               디바이스 번호는 앞전에 설명했었습니다. 참고하시구요 */
Packet sendPack = new Packet();
               /*Packet 클래스는 ICMP , TCP/UDP... 등등 패킷마다 각기 다른 형태를 맵핑할 수 있도록 
                  원형의 틀을 제공합니다
               Packet sendPack = new IMCPPacket(); 라고하면 ICMP패킷구조가 맵핑됩니다.
        저는 여기에 그냥 원형인 Packet(); 을 선언함으로써, 적용되는 프로토콜의 구조가 없게 만듭니다. 
               참고로 Jpcap이용시 이렇게는 거의 사용하지 않습니다. 
               
              
 byte pb[] = new byte[66];          ////
pb[0]=(byte)0x00; 
pb[1]=(byte)0x0e;
pb[2]=(byte)0xe8;
pb[3]=(byte)0x52;
pb[4]=(byte)0x98;
pb[5]=(byte)0xf6;            ...................................................
..  . ..    .. ...  .. . ............
.... ... .. ........ .. ...

sendPack.data =pb;
/*  이부분에서 좀 오래 걸렸는데요, 원래는 Packet 클래스로 선언된 객체에서 멤버인 data에 맵핑되어야할 요소는 ("asd").getBytes() 입니다. 즉, 임의의 스트링을 바이트화 해서 맵핑시키므로써(내부적으로 구체적인 로직은 모르겠습니다.) byte데이터형인 이더넷헤더구조가 맵핑가능하도록 기본 60바이트를 활성화시킵니다.
 
만약에 sendPack.data =("asdf").getBytes();  이렇게 선언되면 초기에 "asdf" 라는 스트링에 해당하는 byte값이 입력이되고 앞부분이 "asdf" 값을 제외한 나머지 공간은 비워진 상태로 총 60byte의 공간이 셋팅되게 됩니다. 이상태로 패킷을 보내면되는데, 우리가 원하는 패킷 형태로 패킷을 보내려면 위에서와 같이 byte형 배열을 지정해 놓고 미리 값을 셋팅해 놓은 상태에서 배열을  sendPack.data에 맵핑시켜주면 됩니다. 
*/
sender.sendPacket(sendPack);
                //sendPack의 인자는 Packet 클래스로 선언되지않고서는 보낼 수 가 없습니다.  
                  
sender.close();   //종료. 
================source=====================================
mport jpcap.*;
import jpcap.packet.*;

class send
{
public static void main(String[] args) throws java.io.IOException{
NetworkInterface[] devices = JpcapCaptor.getDeviceList();
if(args.length<1){
System.out.println("Usage: java SentICMP <device index (e.g., 0, 1..)>");
for(int i=0;i<devices.length;i++)
System.out.println(i+":"+devices[i].name+"("+devices[i].description+")");
System.exit(0);
}
int index=Integer.parseInt(args[0]);
JpcapSender sender=JpcapSender.openDevice(devices[index]);
//////// 자기가 쓰는 인터페이스가 0 번이면 index대신에 0 넣으면됩니다. 
Packet sendPack = new Packet();

byte pb[] = new byte[14];
///////////////// 목적지 MAC address   6byte
pb[0]=(byte)0x00; 
pb[1]=(byte)0x0e;
pb[2]=(byte)0xe8;
pb[3]=(byte)0x52;
pb[4]=(byte)0x98;
pb[5]=(byte)0xf6;
//////////////// 출발지 MAC address   6byte
pb[6]=(byte)0xf4;
pb[7]=(byte)0x6d;
pb[8]=(byte)0x04;
pb[9]=(byte)0x0e;
pb[10]=(byte)0xf5;
pb[11]=(byte)0xaa;
////////    Type or Length    0x0800 = 이더넷
pb[12]=(byte)0x08;
pb[13]=(byte)0x00;

sendPack.data =pb;
sender.sendPacket(sendPack); 
sender.close(); 
}
}
================================================================
위의 소스를 실행하여서 wireshark로 잡으면 60바이트 패킷이  소스맥주소와 목적지 맥주소가 타입까지 셋팅되고 나머지는 빈 상태로 총 60바이트 전송하게 됩니다. 


이상으로 마치고 

이제는 여러 공격방법 및 SWT을 이용한 비쥬얼적인 작업을 수행하도록 하겠습니다. 

AND