jpcap 라이브러리에 관한 몇가지 질문입니다.
이 프로그램 짜면서 계속 질문만 올리게 되네요
우선 읽어주신분, 답변주신 분들께 미리 감사드립니다.
자바로 jpcap을 이용하여 패킷을 캡쳐하고
유해사이트 발견시 제가 만든 패킷을 전송해서 차단을 시키는 프로그램인데요
패킷을 조작해서 byte[] 로 가지고 있는 단계까지는 할 수 있으리라 생각됩니다.
바이트 배열에서 offset 조작해서 데이터 만지는 노가다를 하는 중이구요...
그런데 문제는
sourceforge의 jpcap에는 패킷을 보내는 메소드가 없다는 사실입니다. ㅠㅠ
그래서 http://netresearch.ics.uci.edu/kfujii/jpcap/doc/javadoc/index.html
여기의 jpcap에는 패킷을 보내는 메소드가 있거든요
이 메소드의 소스를 구해서 보았더니 다음과 같습니다.
package jpcap; /** This class is used to send a packet. */ public class JpcapSender { private static final int MAX_NUMBER_OF_INSTANCE=10; private static boolean[] instanciatedFlag=new boolean[MAX_NUMBER_OF_INSTANCE]; private int ID; private JpcapSender() throws java.io.IOException{ //find unused ID ID=-1; for(int i=0;i<MAX_NUMBER_OF_INSTANCE;i++) if(!instanciatedFlag[i]){ ID=i; instanciatedFlag[i]=true; break; } if(ID==-1) throw new java.io.IOException("Unable to open a device: "+MAX_NUMBER_OF_INSTANCE+" devices are already opened."); } /** Initializes a network interface for sending a packet, * and returns an instance of this class. * @param device Interface for sending a packet * @throws IOException Raised when initialization of the interface failed * @return intstance of this class (JpcapSender) */ public static JpcapSender openDevice(String device) throws java.io.IOException{ JpcapSender sender=new JpcapSender(); sender.openRawSocket(device); return sender; } /** * IP긬긑긞긣몭륪뾭궻?긑긞긣귩룊딖돸궥귡 * */ private native void openRawSocket(String device); /** Sends a packet.<P> * On UNIX, only IP packet is supported. * For ICMP, only echo packet is supported (to prohibit DOS attack). <P> * ON WINDOWS, you may be able to send non-IP packet, too. However, on Windows, * you must also set the Datalink layer header (e.g. Ethernet header). * @param packet Packet to be sent */ public native void sendPacket(IPPacket packet); /** Closes the interface. */ public native void close(); }
여기서 제 생각에 중요한 부분은
private native void openRawSocket(String device);
public native void sendPacket(IPPacket packet);
public native void close();
이 부분인것 같은데요
이것들은 native라는 것으로 선언만 되어 있고 구현이 되어 있질 않네요
제가 알기로 native는 C 쪽 함수를 가져다 쓰는 것으로 알고 있어서요....
그래서 혹시나 winpcap에 이것들이 구현되어있나 하고 찾아봤더니
안되어있더라구요ㅠㅠ
그래서 제 프로그램에 이와 같이 응용해 보았습니다.
private native void openRawSocket(String device);
public native void sendPacket(byte[] packet);
public native void close();
제가 가지고 있는 것은 패킷이 byte[]로 생긴 것이기 떄문에...;;
이 부분만 성공한다면
어떻게든 프로젝트를 완성할 수 있을만한 단계까지 와 있는데요
너무 힘드네요 ㅠㅠ
jni 안써볼려고 GUI도 SWT로 만드는데요... ㅠㅠ(트레이를 사용하려 하거든요)
자바가 참 사람 힘들게 하네요 ㅠㅠ
차라리 처음부터 winpcap으로 C로 짰으면
번거롭더라도 이러진 않았을거 같은데... ㅠㅠ
여튼 고수님들 자세한 답변 부탁드립니다.
프로젝트 마감이 얼마 남지 않았거든요 ㅠㅠ
꼭 부탁드립니다.
jni,.,....jpcap도 내부적으로 jni를 쓸텐데요....
jni,.,....
jpcap도 내부적으로 jni를 쓸텐데요....
일단 가능한 해결법으로 가고, 후일 이를 없애는(?) 방법을 강구하는게 좋아보입니다.
그럼
winpcap 으로 보내는 놈을 구현하시고 기타 IPC 를 통해서 그놈한테 패킷을 보내달라고 전달하시죠 ;;
음..
RAW 소켓으로 보낼수 있는 패킷의 종류도 제한되어 있지 않나요?
다른 방법을 사용하셔야 할듯한데..
@.@
댓글 달기