現在、C# 用の pcap ライブラリを使用していますが、IP ヘッダーと TCP/UDP/ECT ヘッダーを削除する組み込み関数があるかどうか疑問に思っていました。そうでない場合、そのようなヘッダーの削除をどのように達成したかを投稿できますか?
2 に答える
PacketXLibを使用していますか?私は以前にこれを使用しましたが、コーディングが簡単であることがわかりました。プロトコルの基本的な基礎を知っているだけで、ヘッダーの抽出は非常に簡単です。
public const int ETHERNETLEN = 14; // length of ethernet header
public const int IPLEN = 20; // length of ip header
public const int TCPLEN = 20; // length of tcp header
私が使用したのと同じライブラリを使用していると仮定すると、ヘッダーをバイパスして生データにアクセスできます。
int dataOffset = ETHERNETLEN + IPLEN + TCPLEN;
string rawData = "";
// Throw all the data into a string first up so we can work with it easier
for (int i = dataOffset; i < aPacket.DataSize; i++)
{
byte nByte = (byte)aPacket.DataArray.GetValue(i);
rawData += Convert.ToChar(nByte);
}
私がこれを行った場所で見ているコードは、おそらく1年近く前のものなので、正確に何をしていたかについて少しぼんやりしています。私が投稿したこの質問に見られるように、私はいくつかのhttp-packet再構築を行っていました。実際、そのスレッドを見ると、私がこれを行っていたのは1年以上前のことです。
私は、c# 用の pcap ラッパー/ライブラリである SharpPcap の作成者です。
SharpPcap を使用していた場合、SharpPcap はパケットをデータグラムに分割します。したがって、たとえば UdpPacket を含む IpPacket を含む EthernetPacket になります。udp パケットだけが必要な場合は、次のように簡単に抽出できます。
Packet p = Packet.ParsePacket(rawCapture.LinkLayerType, rawCapture.Data);
var udpPacket = UdpPacket.GetEncapsulated(p);
if(udpPacket != null) { Console.WriteLine("found udp packet '{0}'", udpPacket); }
UdpPacket.GetEncapsulated() は、データグラムを走査してパケットを探します。解析されるすべてのタイプに対して、同じ種類のアプローチが機能します。