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; // 未対応 } } } } }
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; // 未対応 } } } } }
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; // 未対応 } } } } }