Winpcap の単純な質問 - 指定された IP/ポートにパケットを送信するにはどうすればよいですか?
-
16-09-2019 - |
質問
チュートリアルなどを読みましたが、理解できません。パケットを送信することはできますが、それらのパケットの送信先を Winpcap にどのように指示できるでしょうか?どの IP/ポートに転送するかを認識できるようにパケットに付ける必要があるヘッダーはありますか?つまり。リスト上の誰かに何かを書いたかのように、MSN にデータを送信したいと考えてみましょう。sendpacket() を使用できますが、パケット/バイト配列を引数として受け取るだけで、どのアプリ/IP/ポートに送信するかは指定されません。
ありがとう
解決
あなたはどこパケットを送信するのWinPcapを教えていません。あなたは、ワイヤ上のパケットを置くためにそれを伝えます。ネットワークスイッチは、正しい宛先にパケットを送信します。受信側のTCPスタックは、右のアプリケーション/サービスにパケットを送信します。明らかにこれは、ルーティング情報がパケット自体でなければならないことを意味する。
あなたの例を取るためには、パケットに適切なMSNサーバーのIPアドレスとTCPポートを配置する必要があると思います。そうしない場合は、ネットワークハードウェアは、そのパケットを破棄するかmisrouteます。
他のヒント
これが、ARP リクエストを有線で送信する方法です。1.プロトコルの構造を定義します。つまり、ARP パケットを送信したい場合は、データ リンク層 (イーサネット ヘッダー) とネットワーク層 (ARP ヘッダー) を含む構造が必要になります。同様に、IP 経由で TCP パケットを送信したい場合は、イーサネット ヘッダー、IP ヘッダー、および TCP ヘッダーのデータ構造が必要になります。
構造体を定義したら、必要な値で構造体のインスタンスを初期化します。パケットをネットワーク内のすべてのマシンに送信したい場合は、イーサネット ヘッダーの宛先 MAC 値を ff:ff:ff:ff:ff:ff に設定します。パケットをマシン X に送信したい場合は、(IP アドレス 192.168. 0.88) 次に、IP 層の宛先アドレスをその値に設定します。
完了したら、char* 配列を宣言し、すべての構造を char* 配列にコピーしてバイト シーケンスを作成し、それをネットワーク経由で送信する必要があります。
// 構造を定義するという意味を示すだけであり、 // コード スニペットの残りの部分とは関係ありません
typedef struct IP_header
{
u_char VersionNInternetHeaderLength; // Version (4 bits) + Internet header length (4 bits)
/*u_char version:4;
u_char HeaderLength:4;*/
u_char Type; // Type of service
u_short TotalLength; // Total length
u_short Identification; // Identification
u_char rsv : 1;
u_char df : 1;
u_char mf : 1;
u_char FragmentOffset1 : 5;
u_char FragmentOffset2;
//u_short Flags_fo; // Flags (3 bits) + Fragment offset (13 bits)
u_char TimeToLive; // Time to live
u_char Protocol; // Next level Protocol of the encapsulated payload
u_short Checksum; // Header checksum
IP_address SourceAddress; // Source address
IP_address DestinationAddress; // Destination address
u_int OptionNPadding; // Option + Padding
IP_header()
{
mf = 0;
rsv = 0;
df = 0;
FragmentOffset1 = 0;
FragmentOffset2 = 0;
TimeToLive = 128;
TotalLength = sizeof(IP_header);
Identification = 0xABCD;
Checksum = 0xABCD;
OptionNPadding = 0;
}
}IP_header;
Ethernet_header EthernetHeader;// = (Ethernet_header*)malloc(sizeof(Ethernet_header));
ARP_header ARPHeader ;//= (ARP_header*)malloc(sizeof(ARP_header));
ARPHeader.HardwareType = htons(1);
ARPHeader.ProtocolType = htons(0x800);
ARPHeader.OPCODE = htons(1);
ARPHeader.HeaderLength = 6;
ARPHeader.ProtocolLength = 4;
ARPHeader.SenderMAC = MY_FAKE_MAC;
ARPHeader.SenderIP = MY_IP;
ARPHeader.TargetMAC = MAC_address();
ARPHeader.TargetIP = Whose;
EthernetHeader.DestinationMAC = BROADCASTMAC;
EthernetHeader.SourceMAC = MY_FAKE_MAC;
EthernetHeader.EtherType = htons(0x806);
u_char* packet = (u_char*)malloc(sizeof(EthernetHeader) + sizeof(ARPHeader));
memcpy(packet, &EthernetHeader, sizeof(EthernetHeader));
memcpy(packet + sizeof(EthernetHeader), &ARPHeader, sizeof(ARPHeader));
SendPacket(packet);