예제 #1
0
        void OnRecv(IntPtr pkt_hdr, IntPtr pkt_data)
        {
            if (InvokeRequired) {// 別スレッドから呼び出された場合
                //デリゲートインスタンスの作成
                OnRecvDelegate func = new OnRecvDelegate(OnRecv);
                //メインスレッドのAddNodeを呼び出す
                this.Invoke(func, new object[] { pkt_hdr, pkt_data });
            } else {
                WinPcap.pcap_pkthdr hdr = (WinPcap.pcap_pkthdr)Marshal.PtrToStructure(pkt_hdr, typeof(WinPcap.pcap_pkthdr));

                byte[] data = new byte[hdr.caplen];
                Marshal.Copy(pkt_data, data, 0, (int)hdr.caplen);

                //------------------------------------------------------------
                // パケットの保存
                //------------------------------------------------------------
                packetList.Add(data);
                //------------------------------------------------------------
                // リストビューへの追加
                //------------------------------------------------------------
                ListViewItem item = listView1.Items.Add(DateTime.Now.ToString("yyyy/MM/dd hh:mm:ss"));

                int len = data.Length;
                unsafe {
                    int offSet = 0;
                    fixed (byte* p = data) {
                        // Etherヘッダ処理
                        EtherHeader etherHeader = new EtherHeader();
                        int etherHeaderSize = Marshal.SizeOf(etherHeader);

                        if (offSet + etherHeaderSize > len) //  受信バイト数超過
                            return;
                        etherHeader = (EtherHeader)Marshal.PtrToStructure((IntPtr)(p + offSet), typeof(EtherHeader));
                        offSet += etherHeaderSize;

                        // Ether dst mac
                        item.SubItems.Add(string.Format("{0:x2}-{1:x2}-{2:x2}-{3:x2}-{4:x2}-{5:x2}"
                            , etherHeader.dstMac[0], etherHeader.dstMac[1], etherHeader.dstMac[2]
                            , etherHeader.dstMac[3], etherHeader.dstMac[4], etherHeader.dstMac[5]));
                        // Ether src mac
                        item.SubItems.Add(string.Format("{0:x2}-{1:x2}-{2:x2}-{3:x2}-{4:x2}-{5:x2}"
                            , etherHeader.srcMac[0], etherHeader.srcMac[1], etherHeader.srcMac[2]
                            , etherHeader.srcMac[3], etherHeader.srcMac[4], etherHeader.srcMac[5]));
                        // Ether type
                        ushort type = htons(etherHeader.type);
                        item.SubItems.Add(string.Format("0x{0:X4}", type));

                        if (type == 0x0800) {//IP
                            // IPヘッダ処理
                            IpHeader ipHeader = new IpHeader();
                            int ipHeaderSize = Marshal.SizeOf(ipHeader);

                            if (offSet + ipHeaderSize > len) //  受信バイト数超過
                                return;
                            ipHeader = (IpHeader)Marshal.PtrToStructure((IntPtr)(p + offSet), typeof(IpHeader));

                            offSet += (ipHeader.verLen & 0x0F) * 4;
                            // プロトコル
                            item.SubItems.Add(Enum.GetName(typeof(Protocol), ipHeader.protocol));
                            // 送信元 IPアドレス
                            item.SubItems.Add(string.Format("{0}.{1}.{2}.{3}"
                                , ipHeader.srcIp[0], ipHeader.srcIp[1], ipHeader.srcIp[2], ipHeader.srcIp[3]));
                            // 送信先 IPアドレス
                            item.SubItems.Add(string.Format("{0}.{1}.{2}.{3}"
                                , ipHeader.dstIp[0], ipHeader.dstIp[1], ipHeader.dstIp[2], ipHeader.dstIp[3]
                                ));
                            if (ipHeader.protocol == 6) { // TCP

                                // TCPヘッダ処理
                                TcpHeader tcpHeader = new TcpHeader();
                                int tcpHeaderSize = Marshal.SizeOf(tcpHeader);

                                if (offSet + tcpHeaderSize > len) //  受信バイト数超過
                                    return;
                                tcpHeader = (TcpHeader)Marshal.PtrToStructure((IntPtr)(p + offSet), typeof(TcpHeader));
                                // 送信元ポート
                                item.SubItems.Add(htons(tcpHeader.srcPort).ToString());
                                // 送信先ポート
                                item.SubItems.Add(htons(tcpHeader.dstPort).ToString());

                            } else if (ipHeader.protocol == 17) { //UDP
                                // UDPヘッダ処理
                                UdpHeader udpHeader = new UdpHeader();
                                int udpHeaderSize = Marshal.SizeOf(udpHeader);

                                if (offSet + udpHeaderSize > len) //  受信バイト数超過
                                    return;
                                udpHeader = (UdpHeader)Marshal.PtrToStructure((IntPtr)(p + offSet), typeof(UdpHeader));
                                // 送信元ポート
                                item.SubItems.Add(htons(udpHeader.srcPort).ToString());
                                // 送信先ポート
                                item.SubItems.Add(htons(udpHeader.dstPort).ToString());
                            } else {
                                item.SubItems.Add("");
                                item.SubItems.Add("");
                            }
                            int totalLen = htons(ipHeader.totalLen);
                            item.SubItems.Add(totalLen.ToString());
                            listView1.EnsureVisible(listView1.Items.Count-1);

                        } else if (type == 0x0806) { //ARP

                            // プロトコル
                            item.SubItems.Add("ARP");
                        } else {
                            return; // 未対応
                        }
                    }
                }
            }
        }
예제 #2
0
        void OnRecv(IntPtr pkt_hdr, IntPtr pkt_data)
        {
            if (InvokeRequired)  // 別スレッドから呼び出された場合
            //デリゲートインスタンスの作成
            {
                OnRecvDelegate func = new OnRecvDelegate(OnRecv);
                //メインスレッドのAddNodeを呼び出す
                this.Invoke(func, new object[] { pkt_hdr, pkt_data });
            }
            else
            {
                WinPcap.pcap_pkthdr hdr = (WinPcap.pcap_pkthdr)Marshal.PtrToStructure(pkt_hdr, typeof(WinPcap.pcap_pkthdr));

                byte[] data = new byte[hdr.caplen];
                Marshal.Copy(pkt_data, data, 0, (int)hdr.caplen);

                //------------------------------------------------------------
                // パケットの保存
                //------------------------------------------------------------
                //                packetList.Add(data);


                int len = data.Length;
                unsafe
                {
                    int offSet = 0;
                    fixed(byte *p = data)
                    {
                        // Etherヘッダ処理
                        EtherHeader etherHeader     = new EtherHeader();
                        int         etherHeaderSize = Marshal.SizeOf(etherHeader);

                        if (offSet + etherHeaderSize > len) //  受信バイト数超過
                        {
                            return;
                        }
                        etherHeader = (EtherHeader)Marshal.PtrToStructure((IntPtr)(p + offSet), typeof(EtherHeader));
                        offSet     += etherHeaderSize;

                        // Ether type
                        ushort type = htons(etherHeader.type);

                        if (type == 0x0800)  //IP
                        // IPヘッダ処理
                        {
                            IpHeader ipHeader     = new IpHeader();
                            int      ipHeaderSize = Marshal.SizeOf(ipHeader);

                            if (offSet + ipHeaderSize > len) //  受信バイト数超過
                            {
                                return;
                            }
                            ipHeader = (IpHeader)Marshal.PtrToStructure((IntPtr)(p + offSet), typeof(IpHeader));

                            offSet += (ipHeader.verLen & 0x0F) * 4;

                            // 送信先 IPアドレス
                            string dip = string.Format("{0}.{1}.{2}.{3}", ipHeader.dstIp[0], ipHeader.dstIp[1], ipHeader.dstIp[2], ipHeader.dstIp[3]
                                                       );
                            if (ipHeader.protocol == 6)   // TCP

                            // TCPヘッダ処理
                            {
                                TcpHeader tcpHeader     = new TcpHeader();
                                int       tcpHeaderSize = Marshal.SizeOf(tcpHeader);

                                if (offSet + tcpHeaderSize > len) //  受信バイト数超過
                                {
                                    return;
                                }
                                tcpHeader = (TcpHeader)Marshal.PtrToStructure((IntPtr)(p + offSet), typeof(TcpHeader));

                                // garapon検出
                                if (0 == dip.CompareTo(config.garaponIP) && stage == STAGE.STGIDLE)
                                {
                                    int    payloadsize = len - (offSet + tcpHeaderSize);
                                    byte[] payload     = new byte[payloadsize];
                                    Marshal.Copy((IntPtr)(p + offSet + tcpHeaderSize), payload, 0, payloadsize);

                                    if (payloadsize != 0)
                                    {
                                        string   st    = System.Text.Encoding.ASCII.GetString(payload);
                                        char[]   dmlt  = { '\r', '\n', ';' };
                                        string[] lines = st.Split(dmlt);
                                        foreach (string line in lines)
                                        {
                                            if (line.Contains("GaraponAuthKey") == true)
                                            {
                                                gpAuthkey = line.Split('=')[1];
                                                System.Console.WriteLine("GaraponAuthKey Found:{0}", gpAuthkey);
                                                gpauthkeyTextbox.Text = gpAuthkey;
                                            }
                                            if (line.Contains("gtvid") == true && line.Contains("GET") == false)
                                            {
                                                System.Console.WriteLine("GTAG found");
                                                programIDTextbox.Text = line.Split('=')[1];
                                            }
                                        }
                                    }
                                }
                            }
                            else if (ipHeader.protocol == 17)   //UDP
                            // UDPヘッダ処理
                            {
                                UdpHeader udpHeader     = new UdpHeader();
                                int       udpHeaderSize = Marshal.SizeOf(udpHeader);

                                if (offSet + udpHeaderSize > len) //  受信バイト数超過
                                {
                                    return;
                                }
                                udpHeader = (UdpHeader)Marshal.PtrToStructure((IntPtr)(p + offSet), typeof(UdpHeader));
                            }
                            int totalLen = htons(ipHeader.totalLen);
                        }
                        else if (type == 0x0806)   //ARP
                        {
                        }
                        else
                        {
                            return; // 未対応
                        }
                    }
                }
            }
        }
예제 #3
0
        void OnRecv(IntPtr pkt_hdr, IntPtr pkt_data)
        {
            if (InvokeRequired)  // 別スレッドから呼び出された場合
            //デリゲートインスタンスの作成
            {
                OnRecvDelegate func = new OnRecvDelegate(OnRecv);
                //メインスレッドのAddNodeを呼び出す
                this.Invoke(func, new object[] { pkt_hdr, pkt_data });
            }
            else
            {
                WinPcap.pcap_pkthdr hdr = (WinPcap.pcap_pkthdr)Marshal.PtrToStructure(pkt_hdr, typeof(WinPcap.pcap_pkthdr));

                byte[] data = new byte[hdr.caplen];
                Marshal.Copy(pkt_data, data, 0, (int)hdr.caplen);

                //------------------------------------------------------------
                // パケットの保存
                //------------------------------------------------------------
                packetList.Add(data);
                //------------------------------------------------------------
                // リストビューへの追加
                //------------------------------------------------------------
                ListViewItem item = listView1.Items.Add(DateTime.Now.ToString("yyyy/MM/dd hh:mm:ss"));

                int len = data.Length;
                unsafe {
                    int offSet = 0;
                    fixed(byte *p = data)
                    {
                        // Etherヘッダ処理
                        EtherHeader etherHeader     = new EtherHeader();
                        int         etherHeaderSize = Marshal.SizeOf(etherHeader);

                        if (offSet + etherHeaderSize > len) //  受信バイト数超過
                        {
                            return;
                        }
                        etherHeader = (EtherHeader)Marshal.PtrToStructure((IntPtr)(p + offSet), typeof(EtherHeader));
                        offSet     += etherHeaderSize;

                        // Ether dst mac
                        item.SubItems.Add(string.Format("{0:x2}-{1:x2}-{2:x2}-{3:x2}-{4:x2}-{5:x2}"
                                                        , etherHeader.dstMac[0], etherHeader.dstMac[1], etherHeader.dstMac[2]
                                                        , etherHeader.dstMac[3], etherHeader.dstMac[4], etherHeader.dstMac[5]));
                        // Ether src mac
                        item.SubItems.Add(string.Format("{0:x2}-{1:x2}-{2:x2}-{3:x2}-{4:x2}-{5:x2}"
                                                        , etherHeader.srcMac[0], etherHeader.srcMac[1], etherHeader.srcMac[2]
                                                        , etherHeader.srcMac[3], etherHeader.srcMac[4], etherHeader.srcMac[5]));
                        // Ether type
                        ushort type = htons(etherHeader.type);

                        item.SubItems.Add(string.Format("0x{0:X4}", type));

                        if (type == 0x0800)  //IP
                        // IPヘッダ処理
                        {
                            IpHeader ipHeader     = new IpHeader();
                            int      ipHeaderSize = Marshal.SizeOf(ipHeader);

                            if (offSet + ipHeaderSize > len) //  受信バイト数超過
                            {
                                return;
                            }
                            ipHeader = (IpHeader)Marshal.PtrToStructure((IntPtr)(p + offSet), typeof(IpHeader));

                            offSet += (ipHeader.verLen & 0x0F) * 4;
                            // プロトコル
                            item.SubItems.Add(Enum.GetName(typeof(Protocol), ipHeader.protocol));
                            // 送信元 IPアドレス
                            item.SubItems.Add(string.Format("{0}.{1}.{2}.{3}"
                                                            , ipHeader.srcIp[0], ipHeader.srcIp[1], ipHeader.srcIp[2], ipHeader.srcIp[3]));
                            // 送信先 IPアドレス
                            item.SubItems.Add(string.Format("{0}.{1}.{2}.{3}"
                                                            , ipHeader.dstIp[0], ipHeader.dstIp[1], ipHeader.dstIp[2], ipHeader.dstIp[3]
                                                            ));
                            if (ipHeader.protocol == 6)   // TCP

                            // TCPヘッダ処理
                            {
                                TcpHeader tcpHeader     = new TcpHeader();
                                int       tcpHeaderSize = Marshal.SizeOf(tcpHeader);

                                if (offSet + tcpHeaderSize > len) //  受信バイト数超過
                                {
                                    return;
                                }
                                tcpHeader = (TcpHeader)Marshal.PtrToStructure((IntPtr)(p + offSet), typeof(TcpHeader));
                                // 送信元ポート
                                item.SubItems.Add(htons(tcpHeader.srcPort).ToString());
                                // 送信先ポート
                                item.SubItems.Add(htons(tcpHeader.dstPort).ToString());
                            }
                            else if (ipHeader.protocol == 17)     //UDP
                            // UDPヘッダ処理
                            {
                                UdpHeader udpHeader     = new UdpHeader();
                                int       udpHeaderSize = Marshal.SizeOf(udpHeader);

                                if (offSet + udpHeaderSize > len) //  受信バイト数超過
                                {
                                    return;
                                }
                                udpHeader = (UdpHeader)Marshal.PtrToStructure((IntPtr)(p + offSet), typeof(UdpHeader));
                                // 送信元ポート
                                item.SubItems.Add(htons(udpHeader.srcPort).ToString());
                                // 送信先ポート
                                item.SubItems.Add(htons(udpHeader.dstPort).ToString());
                            }
                            else
                            {
                                item.SubItems.Add("");
                                item.SubItems.Add("");
                            }
                            int totalLen = htons(ipHeader.totalLen);
                            item.SubItems.Add(totalLen.ToString());
                            listView1.EnsureVisible(listView1.Items.Count - 1);
                        }
                        else if (type == 0x0806)     //ARP

                        // プロトコル
                        {
                            item.SubItems.Add("ARP");
                        }
                        else
                        {
                            return; // 未対応
                        }
                    }
                }
            }
        }