JavaのPcapファイル解析(二:データ構造の構築)

15497 ワード

データ構造
前の記事の内容によって、次のようなデータ構造が構築されます。
Pcapファイルヘッダ
/**
     * Pcap      
     * @author johnnie
     *
     */
    public class PcapFileHeader {

        private int magic;                  //    ,        16    0xa1b2c3d4(4   )
        private short magorVersion;     //     (2   )
        private short minorVersion;     //     (2   )
        private int timezone;               //     (4   )
        private int sigflags;               //      (4   )
        private int snaplen;                //        (4   )
        private int linktype;               //      (4   )

        public int getMagic() {
            return magic;
        }

        public void setMagic(int magic) {
            this.magic = magic;
        }

        public short getMagorVersion() {
            return magorVersion;
        }

        public void setMagorVersion(short magorVersion) {
            this.magorVersion = magorVersion;
        }

        public short getMinorVersion() {
            return minorVersion;
        }

        public void setMinorVersion(short minorVersion) {
            this.minorVersion = minorVersion;
        }

        public int getTimezone() {
            return timezone;
        }

        public void setTimezone(int timezone) {
            this.timezone = timezone;
        }

        public int getSigflags() {
            return sigflags;
        }

        public void setSigflags(int sigflags) {
            this.sigflags = sigflags;
        }

        public int getSnaplen() {
            return snaplen;
        }

        public void setSnaplen(int snaplen) {
            this.snaplen = snaplen;
        }

        public int getLinktype() {
            return linktype;
        }

        public void setLinktype(int linktype) {
            this.linktype = linktype;
        }

        public PcapFileHeader() {}

        public PcapFileHeader(int magic, short magorVersion, short minorVersion,
                int timezone, int sigflags, int snaplen, int linktype) {
            this.magic = magic;
            this.magorVersion = magorVersion;
            this.minorVersion = minorVersion;
            this.timezone = timezone;
            this.sigflags = sigflags;
            this.snaplen = snaplen;
            this.linktype = linktype;
        }

        @Override
        public String toString() {
            return "PcapFileHeader [magic=" + DataUtils.intToHexString(magic)
                    + ", magorVersion=" + DataUtils.shortToHexString(magorVersion)
                    + ", minorVersion=" + DataUtils.shortToHexString(minorVersion)
                    + ", timezone=" + DataUtils.intToHexString(timezone)
                    + ", sigflags=" +  DataUtils.intToHexString(sigflags)
                    + ", snaplen=" +  DataUtils.intToHexString(snaplen)
                    + ", linktype=" +  DataUtils.intToHexString(linktype)
                    + "]";
        }

    }   
Pcapデータヘッダ
/**
 * Pcap     
 * @author johnnie
 *
 */
public class PcapDataHeader {

    /**
     *    ( ):          
     *              1970 1 1  00:00:00          (4   )
     */
    private int timeS;  
    /**
     *    (  ):          (4   )
     */
    private int timeMs;                     
    /**
     *      :             pcap         ,      (4   )
     */
    private int caplen;
    /**
     *        :             (4   )
     *                ,                    。
     */
    private int len;                        

    public int getTimeS() {
        return timeS;
    }

    public void setTimeS(int timeS) {
        this.timeS = timeS;
    }

    public int getTimeMs() {
        return timeMs;
    }

    public void setTimeMs(int timeMs) {
        this.timeMs = timeMs;
    }

    public int getCaplen() {
        return caplen;
    }

    public void setCaplen(int caplen) {
        this.caplen = caplen;
    }

    public int getLen() {
        return len;
    }

    public void setLen(int len) {
        this.len = len;
    }

    public PcapDataHeader() {}

    @Override
    public String toString() {
        return "PcapDataHeader [timeS=" +  DataUtils.intToHexString(timeS)
                + ", timeMs=" +  DataUtils.intToHexString(timeMs)
                + ", caplen=" +  caplen
                + ", len=" +  len
                + "]";
    }

}
イーサネットデータフレーム
/**
 * Pcap        :    ,14    ,      ,    
 * @author johnnie
 *
 */
public class PcapDataFrame {

    /**
     *    MAC   :6 byte
     */
    private byte[] desMac;

    /**
     *   MAC   :6 byte
     */
    private byte[] srcMac;

    /**
     *      :2   
     */
    private short frameType;

    public byte[] getDesMac() {
        return desMac;
    }

    public void setDesMac(byte[] desMac) {
        this.desMac = desMac;
    }

    public byte[] getSrcMac() {
        return srcMac;
    }

    public void setSrcMac(byte[] srcMac) {
        this.srcMac = srcMac;
    }

    public short getFrameType() {
        return frameType;
    }

    public void setFrameType(short frameType) {
        this.frameType = frameType;
    }

    public PcapDataFrame() {}

    /**
     *    Wireshark        
     */
    @Override
    public String toString() {
        // frameType         
        return "PcapDataFrame [frameType=" + DataUtils.shortToHexString(frameType) + "]";
    }

}
IPヘッダ
/**
 * IP     
 * @author johnnie
 *
 */
public class IPHeader {

    /**
     *      (4 bit)     (4bit) =(1   )
     *    (Version):     0100(IPv4),0110(IPv6)
     * IP       20  
     */
    private byte varHLen;

    /**
     * Type of  Service:    ,(1   )
     */
    private byte tos;

    /**
     *    (2   )
     */
    private short totalLen;

    /**
     *   (2   )
     */
    private short id;

    /**
     *       (2   )
     */
    private short flagSegment;

    /**
     * Time to Live:    (1   )
     */
    private byte ttl;

    /**
     *     (1   )
     */
    private byte protocol;

    /**
     *      (2   )
     */
    private short checkSum;

    /**
     *   IP(4   )
     */
    private int srcIP;

    /**
     *    IP(4   )
     */
    private int dstIP;

    public byte getVarHLen() {
        return varHLen;
    }

    public void setVarHLen(byte varHLen) {
        this.varHLen = varHLen;
    }

    public byte getTos() {
        return tos;
    }

    public void setTos(byte tos) {
        this.tos = tos;
    }

    public short getTotalLen() {
        return totalLen;
    }

    public void setTotalLen(short totalLen) {
        this.totalLen = totalLen;
    }

    public short getId() {
        return id;
    }

    public void setId(short id) {
        this.id = id;
    }

    public short getFlagSegment() {
        return flagSegment;
    }

    public void setFlagSegment(short flagSegment) {
        this.flagSegment = flagSegment;
    }

    public byte getTtl() {
        return ttl;
    }

    public void setTtl(byte ttl) {
        this.ttl = ttl;
    }

    public byte getProtocol() {
        return protocol;
    }

    public void setProtocol(byte protocol) {
        this.protocol = protocol;
    }

    public short getCheckSum() {
        return checkSum;
    }

    public void setCheckSum(short checkSum) {
        this.checkSum = checkSum;
    }

    public int getSrcIP() {
        return srcIP;
    }

    public void setSrcIP(int srcIP) {
        this.srcIP = srcIP;
    }

    public int getDstIP() {
        return dstIP;
    }

    public void setDstIP(int dstIP) {
        this.dstIP = dstIP;
    }

    public IPHeader() { }

    @Override
    public String toString() {
        return "IPHeader [varHLen=" + DataUtils.byteToHexString(varHLen)
                + ", tos=" + DataUtils.byteToHexString(tos)
                + ", totalLen=" + totalLen
                + ", id=" + DataUtils.shortToHexString(id)
                + ", flagSegment=" + DataUtils.shortToHexString(flagSegment)
                + ", ttl=" + ttl
                + ", protocol=" + protocol
                + ", checkSum=" + DataUtils.shortToHexString(checkSum)
                + ", srcIP=" + DataUtils.intToHexString(srcIP)
                + ", dstIP=" + DataUtils.intToHexString(dstIP)
                + "]";
    }
}
TCPヘッダ
/**
 * TCP   :20   
 * @author johnnie
 *
 */
public class TCPHeader {

    /**
     *    (2   )
     */
    private short srcPort;

    /**
     *     (2   )
     */
    private short dstPort;

    /**
     * Sequence Number:                (4   )
     */
    private int seqNum;

    /**
     *      (4   )
     */
    private int ackNum;

    /**
     *        (4 bit) +   (4 bit) = 1 byte
     */
    private byte headerLen;

    /**
     *   TCP       (1   )
     */
    private byte flags;

    /**
     *           ,    TCP                 (2   )
     */
    private short window;

    /**
     *    (2   )
     */
    private short checkSum;

    /**
     *     (2   )
     */
    private short urgentPointer;

    public short getSrcPort() {
        return srcPort;
    }

    public void setSrcPort(short srcPort) {
        this.srcPort = srcPort;
    }

    public short getDstPort() {
        return dstPort;
    }

    public void setDstPort(short dstPort) {
        this.dstPort = dstPort;
    }

    public int getSeqNum() {
        return seqNum;
    }

    public void setSeqNum(int seqNum) {
        this.seqNum = seqNum;
    }

    public int getAckNum() {
        return ackNum;
    }

    public void setAckNum(int ackNum) {
        this.ackNum = ackNum;
    }

    public byte getHeaderLen() {
        return headerLen;
    }

    public void setHeaderLen(byte headerLen) {
        this.headerLen = headerLen;
    }

    public byte getFlags() {
        return flags;
    }

    public void setFlags(byte flags) {
        this.flags = flags;
    }

    public short getWindow() {
        return window;
    }

    public void setWindow(short window) {
        this.window = window;
    }

    public short getCheckSum() {
        return checkSum;
    }

    public void setCheckSum(short checkSum) {
        this.checkSum = checkSum;
    }

    public short getUrgentPointer() {
        return urgentPointer;
    }

    public void setUrgentPointer(short urgentPointer) {
        this.urgentPointer = urgentPointer;
    }

    public TCPHeader() {}

    @Override
    public String toString() {
        return "TCPHeader [srcPort=" + srcPort
                + ", dstPort=" + dstPort
                + ", seqNum=" + seqNum
                + ", ackNum=" + ackNum
                + ", headerLen=" + headerLen
                + ", flags=" + DataUtils.byteToHexString(flags)
                + ", window=" + window
                + ", checkSum=" + DataUtils.shortToHexString(checkSum)
                + ", urgentPointer=" + urgentPointer
                + "]";
    }


}
UDPヘッダ
/**
 * UDP   : 4    ,      2   
 * @author johnnie
 *
 */
public class UDPHeader {

    private short srcPort;          //    
    private short dstPort;          //     
    private short length;           //     
    private short checkSum;     //    

    public short getSrcPort() {
        return srcPort;
    }
    public void setSrcPort(short srcPort) {
        this.srcPort = srcPort;
    }
    public short getDstPort() {
        return dstPort;
    }
    public void setDstPort(short dstPort) {
        this.dstPort = dstPort;
    }
    public short getLength() {
        return length;
    }
    public void setLength(short length) {
        this.length = length;
    }
    public short getCheckSum() {
        return checkSum;
    }
    public void setCheckSum(short checkSum) {
        this.checkSum = checkSum;
    }

    public UDPHeader() {}

    @Override
    public String toString() {
        // TODO Auto-generated method stub
        return "UDPHeader [srcPort=" + srcPort
                + ", dstPort=" + dstPort
                + ", length=" + length
                + ", checkSum=" + DataUtils.shortToHexString(checkSum)
                + "]";
    }

}
プロトコルの種類
/**
 *     
 * @author johnnie
 *
 */
public enum ProtocolType {

    OTHER("0"),                 //      :   0
    TCP("6"),                   // TCP    :6
    UDP("17");                  // UDP    :17

    private String type;

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    private ProtocolType(String type) {
        this.type = type;
    }

}
協議5元組
/**
 *     ,   
 * @author johnnie
 *
 */
public class ProtocolData {

    String srcIP;                                       //   IP
    String desIP;                                       //    IP

    String srcPort;                                     //    
    String desPort;                                     //     

    ProtocolType protocolType = ProtocolType.OTHER;     //     

    public String getSrcIP() {
        return srcIP;
    }

    public void setSrcIP(String srcIP) {
        this.srcIP = srcIP;
    }

    public String getDesIP() {
        return desIP;
    }

    public void setDesIP(String desIP) {
        this.desIP = desIP;
    }

    public String getSrcPort() {
        return srcPort;
    }

    public void setSrcPort(String srcPort) {
        this.srcPort = srcPort;
    }

    public String getDesPort() {
        return desPort;
    }

    public void setDesPort(String desPort) {
        this.desPort = desPort;
    }

    public ProtocolType getProtocolType() {
        return protocolType;
    }

    public void setProtocolType(ProtocolType protocolType) {
        this.protocolType = protocolType;
    }

    public ProtocolData() {
        // TODO Auto-generated constructor stub
    }

    public ProtocolData(String srcIP, String desIP, String srcPort,
            String desPort, ProtocolType protocolType) {
        this.srcIP = srcIP;
        this.desIP = desIP;
        this.srcPort = srcPort;
        this.desPort = desPort;
        this.protocolType = protocolType;
    }

    @Override
    public String toString() {
        return "ProtocolData [srcIP=" + srcIP
                + ", desIP=" + desIP
                + ", srcPort=" + srcPort
                + ", desPort=" + desPort
                + ", protocolType=" + protocolType
                + "]";
    }

}
Pcap構造
/**
 * Pcap   
 * @author johnnie
 *
 */
public class PcapStruct {

    private PcapFileHeader fileHeader;
    private List dataHeaders;

    public PcapFileHeader getFileHeader() {
        return fileHeader;
    }
    public void setFileHeader(PcapFileHeader fileHeader) {
        this.fileHeader = fileHeader;
    }
    public List getDataHeaders() {
        return dataHeaders;
    }
    public void setDataHeaders(List dataHeaders) {
        this.dataHeaders = dataHeaders;
    }

    public PcapStruct() {}


}
バscker/javaworldに行って、もっと多くのJava知識を獲得します。