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