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; }
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); }
public void Start(string name, bool promiscuous) { WinPcap.Start(name, promiscuous); }
public void Dispose() { WinPcap.OnRecv -= OnRecv; WinPcap.Stop(); }
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); } } } }