最近因為工作繁忙,每天下班回到家都已經不是九點多就是快十點了,實在不像是一個在半公家機關上班的人該有的生活(反倒是漢堡王都要力行準時下班了,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封包
創作者介紹

Nightmare的胡言亂語

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


留言列表 (6)

發表留言
  • jP
  • 很有趣的感覺,請問當我使用時,網管會發現我的電腦在監聽嗎?
  • 如果網管硬要抓的話應該還是抓得到的,這個要看網管能力到哪裡,另外,在交換器的網路環境下電腦開sniffer是聽不到東西的,需要用其他的方法來做。

    nsysumis94 於 2008/10/04 17:51 回覆

  • jP
  • Thanks
  • lukeshei
  • msnSDK 個人使用是免費的,而如果寫成Class的問題是,只能給一種語言使用,不如做成Web Service,這個世界裡使用python ruby haskell erlang 來寫程式的人大有人在,用這種方式則每一種語言都可使用,另外;您也可以思考看看這種程序(long running)寫成單一個class的局限性,以上;提供給您參考
  • lukeshei說的也對,我倒是沒想到這點,謝謝分享啦

    nsysumis94 於 2008/11/17 00:20 回覆

  • Rei
  • 學長竟然在多年之後救了我一條小命
    萬分感謝 /cry
  • XD....好巧阿

    nsysumis94 於 2010/06/08 23:33 回覆

  • 蕭奕凱
  • 不好意思現在還來推文發問
    我是新手
    我想知道我輸入 java MsnSniff <網卡號碼> 以後
    為什麼程式就停在閃爍游標沒有東西?
    我是不是要做什麼事情來測試監聽?
    因為我從程式碼看不出監聽會發生什麼事XD