Ejemplo n.º 1
0
        void Send(byte flg, byte[] data)
        {
            var sendPacket = new SendPacket(_log, _recvPacket, _ident++, _squence, _ack, flg, data);

            WinPcap.Send(sendPacket.Buf);
            Log(string.Format("Send {0} Len={1} {2}", Util.Flg2Str(flg), data.Length, Encoding.ASCII.GetString(data)));

            _squence += (uint)data.Length;
        }
Ejemplo n.º 2
0
        public List <Adapter> GetAdapterList()
        {
            var ar = new List <Adapter>();

            foreach (var a in WinPcap.GetDeviceList())
            {
                ar.Add(new Adapter(a.description, a.name));
                //TODO IPアドレスを取得
            }

            var ms = new ManagementObjectSearcher("select * from Win32_NetworkAdapterConfiguration");

            foreach (var m in ms.Get())
            {
                foreach (var a in ar)
                {
                    if (a.Name.IndexOf((string)(m["SettingID"])) != -1)
                    {
                        if (m["IPAddress"] != null)
                        {
                            foreach (var s in (string[])(m["IPAddress"]))
                            {
                                if (s.IndexOf(":") == -1)//IPv6排除
                                {
                                    a.SetIp(s);
                                }
                            }
                        }
                        if (m["MACAddress"] != null)
                        {
                            a.SetMac((string)(m["MACAddress"]));
                        }
                        break;
                    }
                }
            }
            return(ar);
        }
Ejemplo n.º 3
0
 public void Start(string name, bool promiscuous)
 {
     WinPcap.Start(name, promiscuous);
 }
Ejemplo n.º 4
0
 public void Dispose()
 {
     WinPcap.OnRecv -= OnRecv;
     WinPcap.Stop();
 }
Ejemplo n.º 5
0
        void capture_OnCapture(RecvPacket recvPacket)
        {
            lock (this) {
                //************************************************************
                //ARPパケット処理
                //************************************************************
                if (_arpReplay)  //ARP応答処理
                {
                    if (recvPacket.Type == PType.ARP)
                    {
                        if (recvPacket.arpHeader.code == 0x0100)  //要求
                        {
                            var ip = Util.Ip2Str(recvPacket.arpHeader.dstIp);
                            foreach (var a in _arpReplyList)
                            {
                                if (ip == a)
                                {
                                    var arpReplyPacket = new ArpReplyPacket(_log, recvPacket, _myMac);

                                    WinPcap.Send(arpReplyPacket.Buf);
                                    _log.Set(string.Format("ARP Replay {0}", Util.Ip2Str(recvPacket.arpHeader.dstIp)));
                                    return;
                                }
                            }
                        }
                    }
                }
                //************************************************************
                //TCPパケット処理
                //************************************************************
                //宛先MAC確認(Etherヘッダ)
                var mac = Util.Mac2Str(recvPacket.Mac[(int)Sd.Dst]);
                if (mac.ToUpper() != Util.Mac2Str(_myMac))
                {
                    if (mac.ToUpper() != Adapter.Mac.ToUpper())
                    {
                        return;
                    }
                }
                //プロトコル確認(IPヘッダ)
                if (recvPacket.ipHeader.protocol != 0x06)
                {
                    return;
                }
                //ポート番号確認(TCPヘッダ)
                if (recvPacket.Port[(int)Sd.Dst] != _port)
                {
                    return;
                }


                if (recvPacket.Flg == 0x02)  //SYNパケット到着
                //新しいセッションの開始
                {
                    _ar.Add(new Session(recvPacket, _log));
                }
                else    //それ以外のパケット
                //当該セッションに追加
                {
                    for (int i = 0; i < _ar.Count; i++)
                    {
                        if (_ar[i].Append(recvPacket))
                        {
                            break;
                        }
                    }
                }

                //終了したセッションの清掃
                for (int i = _ar.Count - 1; i >= 0; i--)
                {
                    if (!_ar[i].Life)
                    {
                        _log.Set(string.Format("ar.RemoteAt(0)", i));
                        _ar.RemoveAt(i);
                    }
                }
            }
        }