1

I'm developing a packet sniffer program that captures the packets going through a system using protocols(TCP,UDP,HTTP). The packet sniffer program will run on a system and captures the packets on another system using the other system's ip address. I'm successfully capturing the packets on my own system but I want to capture the packets on another system. Can someone help me with this issue.??

package packetsniffer;

import java.io.IOException;
import java.util.Timer;
import java.util.TimerTask;
import org.pcap4j.core.BpfProgram.BpfCompileMode;
import org.pcap4j.core.NotOpenException;
import org.pcap4j.core.PacketListener;
import org.pcap4j.core.PcapHandle;
import org.pcap4j.core.PcapNativeException;
import org.pcap4j.core.PcapNetworkInterface;
import org.pcap4j.core.PcapNetworkInterface.PromiscuousMode;
import org.pcap4j.core.PcapStat;
import org.pcap4j.packet.namednumber.IpNumber;
import org.pcap4j.packet.namednumber.TcpPort;
import org.pcap4j.packet.namednumber.UdpPort;
import org.pcap4j.packet.Packet;
import org.pcap4j.packet.IpV4Packet;
import org.pcap4j.packet.IpPacket;
import org.pcap4j.packet.TcpPacket;
import org.pcap4j.packet.UdpPacket;
import org.pcap4j.util.NifSelector;
import com.sun.jna.Platform;
import java.net.Inet4Address;
@SuppressWarnings("javadoc")
public class PacketSniffer {

private static final String COUNT_KEY
= PacketSniffer.class.getName() + ".count";
private static final int COUNT
= Integer.getInteger(COUNT_KEY, -1); // -1 -> loop infinite

private static final String READ_TIMEOUT_KEY
= PacketSniffer.class.getName() + ".readTimeout";
private static final int READ_TIMEOUT
= Integer.getInteger(READ_TIMEOUT_KEY, 100); // [ms]

private static final String SNAPLEN_KEY
= PacketSniffer.class.getName() + ".snaplen";
private static final int SNAPLEN
= Integer.getInteger(SNAPLEN_KEY, 65536); // [bytes]

// defines the header
private final   String[] header = {"S. No.", "Timestamp", 
        "Source IP", "Destination IP","Src Port","Dst 
Port","Protocol","Packet Length (Byte)","Info"};

private PcapNetworkInterface nif=null;
PcapHandle handle=null;

int pktCount = 0;
PacketTable packetTable=null;
int captureTime = 60; //seconds

Timer timer = new Timer();

private PacketSniffer(PcapNetworkInterface nif) {
  this.nif = nif;
  displayTable();
}

PacketListener listener
  = new PacketListener() {
      @Override
      public void gotPacket(Packet packet) {
        //System.out.println(handle.getTimestamp());
        //System.out.println(packet);
          printPacket(packet, handle.getTimestamp().toString());
      }
 };

 //Packet count increment 
 synchronized private void incrementCount(){
   pktCount++;
}

//get the packet count
synchronized private int getPacketCount(){
   return pktCount;
}

//print the packet details
public void printPacket(Packet packet, String timestamp){
 String srcIp, dstIp;
 int srcPort=0, dstPort=0;
 String info="";

 //do nothing if not an IP packet
 if (!packet.contains(IpPacket.class)) {
     return;
 }

 //get the IP packet class
 IpPacket ipPacket = packet.get(IpPacket.class);
 srcIp = ipPacket.getHeader().getSrcAddr().getHostAddress().toString();
 dstIp = ipPacket.getHeader().getDstAddr().getHostAddress().toString(); 
 //int srcPort = ipv4packet.getHeader().
 //}

 String proto= ipPacket.getHeader().getProtocol().name();

 if (proto.equals("TCP") ){
     TcpPacket tcpPkt = packet.get(TcpPacket.class);
     srcPort = tcpPkt.getHeader().getSrcPort().valueAsInt();
     dstPort = tcpPkt.getHeader().getDstPort().valueAsInt();
 }else if (proto.equals("UDP") ){
     UdpPacket udpPkt = packet.get(UdpPacket.class);
     srcPort = udpPkt.getHeader().getSrcPort().valueAsInt();
     dstPort = udpPkt.getHeader().getDstPort().valueAsInt();
 }else{
     return;
 }

 //find if its HTTP packet
 if (srcPort == 80 || srcPort == 8080 || dstPort == 80 || dstPort == 8080 ){
     proto = "HTTP";
 }else if(srcPort == 443 || dstPort == 443 ){
     proto = "HTTPS";
 }
 int len = packet.length();

 //print the header
 if(getPacketCount()==0){
     System.out.print("\n|---------------------------------------------------------------------------|");
     System.out.print("\n|S.N.|Timestamp|Source IP|Destination IP|Src Port|Dst Port|Proto|Len|Info|");
 }
 //increment the count
 incrementCount();

 //print the details of packet
 System.out.print("\n| "+getPacketCount()+" |"+timestamp+"|");
 System.out.print(srcIp+"|"+dstIp+"| ");
 System.out.print(srcPort+" | "+dstPort+" |"+proto+"|"+len+"|");

packetTable.model.add(String.valueOf(getPacketCount()),timestamp,srcIp,
dstIp, String.valueOf(srcPort),String.valueOf(dstPort),String.valueOf(proto),String.valueOf(len),info);

}

//Print Final stats
void printStat(){
PcapStat ps;
try {
ps = handle.getStats();
 System.out.println("Packets Received: " + ps.getNumPacketsReceived());
 System.out.println("Packets Dropped: " + ps.getNumPacketsDropped());
 System.out.println("Packets Dropped By Intf: " + ps.getNumPacketsDroppedByIf());
 if (Platform.isWindows()) {
         System.out.println("Packets Captured: " + ps.getNumPacketsCaptured());
 }  
} catch (PcapNativeException | NotOpenException e) {
    // Auto-generated catch block
    e.printStackTrace();
}

}

//start capturing the packets
void startSniffing(){
try{
    handle = nif.openLive(SNAPLEN, PromiscuousMode.PROMISCUOUS, READ_TIMEOUT);
    System.out.println("\nRunning for time:"+captureTime+"seconds");
    startTimer();
    handle.loop(COUNT, listener);


} catch(PcapNativeException e){
    e.printStackTrace();  
}
catch (InterruptedException e) {
  //e.printStackTrace();
}
catch (NotOpenException e) {
  e.printStackTrace();
}
finally{
    printStat();
    handle.close();
    timer.cancel();
}
}

 //stop capturing the packets
 void stopSniffing(){
System.out.println("\nStopping Sniffing...\n");
try {
    handle.breakLoop();
} catch (NotOpenException e) {
        // Auto-generated catch block
e.printStackTrace();
}
}

//Display the Packet Table GUI
void displayTable(){
  // defines rows and column of the JTable
  String[][] rowAndColumn = {
  };

  packetTable = new PacketTable(rowAndColumn, header);  
 }

 //set the capture time
 void setTime(int t){
  captureTime = t > 0 ? t : 60;
 }

 //Start timer
 void startTimer(){
 timer.schedule(new TimerTask() {
 @Override
 public void run() {
    stopSniffing();
 }
 }, captureTime*1000);    
 }

  public static void main(String[] args) throws PcapNativeException, NotOpenException {

PcapNetworkInterface nif;
try {
  nif = new NifSelector().selectNetworkInterface();
} catch (IOException e) {
  e.printStackTrace();
  return;
}

if (nif == null) {
  return;
}

System.out.println(nif.getName() + "(" + nif.getDescription() + ") Selected!");

PacketSniffer packetSniffer = new PacketSniffer(nif);
if (args.length>0){
    int time= Integer.parseInt(args[0]);
    packetSniffer.setTime(time);
}

packetSniffer.startSniffing();
}

}

This is the code I have used to capture the packet on the interfaces on my system. So I'm using two systems to communicate and capture but I'm not successful.!!

vamsi
  • 344
  • 5
  • 22
  • 1
    When you say "I want to capture the packets on another system", do you mean capture packets from/towards another system? or do you actually want to capture packets passing through another system? If it's the latter how do you plan to do that without software running in the second system?? – pchaigno Nov 28 '17 at 10:14
  • I mean capture the packets from another system. I want use the other systems IP Address to do it. – vamsi Nov 28 '17 at 17:10

0 Answers0