最近因為工作繁忙,每天下班回到家都已經不是九點多就是快十點了,實在不像是一個在半公家機關上班的人該有的生活(反倒是漢堡王都要力行準時下班了,e04,怎麼比科技業還像科技業Orz),也因此暫停成長學習了一陣子,不找點事情來刺激自己是不行的。

其實想寫這玩意兒已經想很久了,大概可以回溯到研一的時候,覺得msn sniffer很有趣,但是小氣八拉要收費,sniffer我大四就寫過拉,有什摩了不起,只是本來打算用C寫的,時間實在是不怎麼多,用Jpcap的Tcpdump範例加了一個filter就成了一個陽春的msn snffer,只是心血來潮寫寫,適合java超新手使用,高手就別鞭我了,我只是吃飽無聊。



import java.io.*;
import jpcap.*;
import jpcap.packet.Packet;

class MsnSniff implements PacketReceiver {
    public void receivePacket(Packet packet) {
        try{
            //msn文字是用UTF-8編碼,所以在這邊不要忘記轉碼
            ByteArrayInputStream bin = new ByteArrayInputStream(packet.data);
            BufferedReader reader = new BufferedReader(new InputStreamReader(bin,"utf8"));
            String text=reader.readLine();
            while(text!=null)
            {
            System.out.println(text);
            text=reader.readLine();
            }
        }
        catch(Exception e){
            System.err.println ("Error");
        }
    }

    public static void main(String[] args) throws Exception {
        NetworkInterface[] devices = JpcapCaptor.getDeviceList();
        if(args.length<1){
            System.out.println("usage: java MsnSniff <select a number from the following>");
           
            for (int i = 0; i < devices.length; i++) {
                System.out.println(i+" :"+devices[i].name + "(" + devices[i].description+")");
                System.out.println("    data link:"+devices[i].datalink_name + "("
                        + devices[i].datalink_description+")");
                System.out.print("    MAC address:");
                for (byte b : devices[i].mac_address)
                    System.out.print(Integer.toHexString(b&0xff) + ":");
                System.out.println();
                for (NetworkInterfaceAddress a : devices[i].addresses)
                    System.out.println("    address:"+a.address + " " + a.subnet + " "
                            + a.broadcast);
            }
        }else{
            JpcapCaptor jpcap = JpcapCaptor.openDevice(devices[Integer.parseInt(args[0])], 2000, false, 20);
            //msn是走TCP的1863和Server溝通,所以加設一個filter
           //要聽網頁封包就把filter改為tcp port 80以此類推
            jpcap.setFilter("tcp port  1863",true);
            jpcap.loopPacket(-1, new MsnSniff());
        }
    }
}

在編這支程式前別忘了裝JDK6、WinPcap跟Jpcap,詳細安裝方法可以參考這裡,裝完把程式編譯完(javac MsnSniff.java),執行java MsnSniff,程式就會列出你的網卡,選一張你要用來監聽的,例如我的電腦有兩張網卡:
usage: java MsnSniff <select a number from the following>
0 :\Device\NPF_GenericDialupAdapter(Adapter for generic dialup and VPN capture)
    data link:EN10MB(Ethernet)
    MAC address:0:0:0:0:0:0:
1 :\Device\NPF_{1D08552B-9684-4CC5-852E-188DCFD5EEEF}(Intel(R) PRO/1000 MT Mobil
e Connection (Microsoft's Packet Scheduler) )

0是moden撥接用的,1才是上網那張,所以在後面參數就使用1號網卡
java MsnSniff 1
就可以開始聽msn封包
arrow
arrow
    全站熱搜

    nsysumis94 發表在 痞客邦 留言(6) 人氣()