• 締切済み

Windowsでパケットモニタソフトの作成

Windowsでパケットモニタを作成するにはどうしたらよいでしょうか? Linuxでは s = socket(PF_PACKET, SOCK_PACKET, htons(ETH_P_ALL)); でEthernetを直接利用してパケットを受信するようなのですが、Windowsの場合はどうすればEthernetを直接利用できるのでしょうか? よろしくお願いします。

みんなの回答

  • ykkw_2001
  • ベストアンサー率26% (267/1014)
回答No.1

ネットワークドライバを直接制御します。 詳しくはURL それから、検索などのキーワードは、「パケットキャプチャ」のほうが、かかりやすいです。(ベクタとかでも)

参考URL:
http://netgroup-serv.polito.it/winpcap/
youking
質問者

お礼

ありがとうございました。とりあえず、WinSock2.2だとパケットはそのまま見れる事が分かりました。

youking
質問者

補足

早速の回答ありがとうございます。実は、以前に参考URLは見たことありました。しかし英文だったため理解に苦しみ、こちらで質問した次第です。もしよろしければ具体的な方法を教えていただけるとありがたいです。よろしくお願いします。

関連するQ&A

  • socket通信でのフィルタリング

    linux環境にてC言語でUDPソケットのプログラムを作成しています。 Aの端末からUDPで受信してパケットヘッダの表示及び、宛先アドレスや宛先ポート番号 を書き換えてBの端末にUDPで送信します。 そこで下記の関数を使用して受信しているのですが、パケットキャプチャのように なんでも受信してしまいます。 socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL)) これを特定のポート番号だけ受信(フィルタ)するにはどのようにすれば良いのでしょうか?

  • C言語でTCPの3way handshake

    (C言語)Linuxのpacket socket(socket(AF?PACKET, SOCK_DGRAM, htons(ETH_P_IP))) を使ってTCPの3way handshakeをOSのプロトコルスタックに頼らず自力で挑戦しています。 RFCやほかの技術本をよんでIPヘッダやTCPヘッダの実装は一応できたのですが、肝心のsynパケットを送った後のackパケットが返ってきません。 wiresharkでは問題なくsynパケットと認識できているのですが、きっとどこかに不備があるはずです。 そこでC, C++ Javaでもいいのでこのプログラムの実装例が載っているサイトなどを教えてください。(英語でもかまいません)

  • ソケットでのデータ送受信について教えてください

    はじめまして。 Perlでのソケット通信プログラムで質問があります。 現在ソケットで通信を行うテストプログラムを作っているのですが、 クライアントからサーバへの片方向送信は出来るのですが、 クライアントからデータ受信後、サーバからクライアントへ応答を 返す処理が上手くいきません。 私としては、クライアントとサーバの処理を逆にすればよいだけかな と思っているのですが認識違いでしょうか? 宜しくお願いします。 環境 OS:Linux 言語:Perl5.8 ■上手くいく場合(かなり省略します。ポイントだけ) サーバ側 $client=accept(C_SOCKET, P_SOCKET); while(<C_SOCKET>){ printf("%s",$_); #受信データ } クライアント側 socket (SOCKET, PF_INET, SOCK_STREAM, 0); connect(SOCKET, pack_sockaddr_in(9000,$ipaddr_bin)); print SOCKET "Test Data!!\n"; →サーバ側端末にTest Data!!と表示 ■送受信しようとしてダメなもの サーバ側 $client=accept(C_SOCKET, P_SOCKET); while(<C_SOCKET>){ printf("%s",$_); #受信データ } print C_SOCKET "Return Data!!\n"; クライアント側 socket (SOCKET, PF_INET, SOCK_STREAM, 0); connect(SOCKET, pack_sockaddr_in(9000,$ipaddr_bin)); print SOCKET "Test Data!!\n"; while(<SOCKET>){ printf("%s",$_); #応答データ } →サーバ側にはTest Data!!すら表示されない。  もちろんクライアント側にも。

    • ベストアンサー
    • Perl
  • C++言語でのWinsock2を使用したパケットモニタの作成

    こんにちは 現在Winsock2を使用したパケットモニタを作成しています パケットを受信できるプログラムは作成することができましたが、TCPパケットが期待した順番通りに受信できません 例えば、3WAYハンドシェイクのパケットのやり取りで、期待しているパケットの受信順は 1. host ---> net: SYN 2. host <--- net: SYN,ACK 3. host ---> net: ACK ですが、パケットモニタでは以下の順番でパケットを受信しています 1. host ---> net: SYN 2. host ---> net: ACK 3. host <--- net: SYN,ACK hostから送信されるパケットが先に受信されているような感じですが、これらを時刻順に受信するオプションなどはあるのでしょうか? もしあるならどのように設定すればよろしいのでしょうか? (ソケットなどの設定内容) 初期化  WSADATA wsd;  WSAStartup(MAKEWORD(2, 2), &wsd) ソケット作成  SOCKET sock;  sock = WSASocket(AF_INET, SOCK_RAW, IPPROTO_IP, NULL, 0, WSA_FLAG_OVERLAPPED) 無差別受信モードに設定  int op = RCVALL_ON;  WSAIoctl(sock, SIO_RCVALL, &op, sizeof(op), NULL, 0, &dword, NULL, NULL) パケットの受信  WSABUF wsb;  DWORD len = 0;  DWORD flag = 0;  WSARecv(sock, &wsb, 1, &len, &flag, NULL, NULL)

  • recv関数でフリーズしてしまう

    現在Winsockを用いた簡単なパケット送受信のソフトを作成しています。 開発環境はVisual Studio2008で、ダイアログベースで作成しています。 パケットの受信側の処理なんですが、いつパケットが来てもいいように、 Ontimerで、定期的に受信処理をしようと思っています。 そこでOntimer内に以下のようにプログラムしたところ、コンパイルエラー はないものの、数秒経つと応答なしとなりフリーズしてしまいます。 原因を探ったところrecv関数が原因で、recv関数をコメントアウトした ところ、フリーズはしなくなりました。また、エラー処理は省略していま すが、ソケットの作成失敗などはありませんでした。 なぜrecv関数でフリーズが起きてしまうのか、原因が分かる方は いらっしゃいますか? OnTimer(UINT nIDEvent){ WSAData wsaData; SOCKET sock; struct sockaddr_in addr; char buf[2048]; WSAStartup(MAKEWORD(2,0), &wsaData); sock = socket(AF_INET, SOCK_DGRAM, 0); addr.sin_family = AF_INET; addr.sin_port = htons(12345); addr.sin_addr.S_un.S_addr = INADDR_ANY; bind(sock, (struct sockaddr *)&addr, sizeof(addr)); memset(buf, 0, sizeof(buf)); recv(sock, buf, sizeof(buf), 0); closesocket(sock); WSACleanup(); }

  • Cでのパケットキャプチャについて

    Cでのネットワークプログラミングを少々かじっている者です。 とりあえず完成しているプログラムを見て勉強しようと思い、パケットキャプチャのサンプルプログラムを動かそうと考えてコンパイルしたのですが、どうもうまく動かない部分があります。 ソケットを生成する箇所で、下のようなソースを書いたのですが、その中の「AF_PACKET」と「ETH_P_ALL」が私の使っている環境になく、そこでどうしても止まってしまいます。 int rawsock = socket( AF_PACKET , SOCK_RAW , htons(ETH_P_ALL)) ; 様々なホームページ等を閲覧しましたが、多くのページがこの方法を採用しており、代替手段が今一つ見つかりません。 インポートしているヘッダファイルの中身もすべて検索をかけて見たのですが、確かに上の記述はありませんでした。 インポートしているヘッダファイルは以下の通りです。 #include<stdio.h>等の基本的なものは省いています。 #include<sys/ioctl.h> #include<sys/time.h> #include<sys/types.h> #include<sys/socket.h> #include<netinet/in.h> #include<netinet/ip.h> #include<netinet/tcp.h> #include<netinet/udp.h> #include<netinet/ip_icmp.h> #include<netinet/if_ether.h> #include<net/ethernet.h> #include<arpa/inet.h> #include<errno.h> #include<netdb.h> #include<unistd.h> 現在の動作環境は以下の通りです。 OS : FreeBSD 9.2 コンパイラ : gcc 4.2.1 FreeBSDそのものが違う様式を採用しているわけではないとは思うのですが・・・。 ただ、構造体の変数やそのメンバが異なっていた部分も結構あったので、釈然としない所もあります。 何かこれらの代わりに使えるようなものはあるのでしょうか。 それとも、FreeBSDではこれは無理、とか根本的な要因でもあるのでしょうか。 ただ、できたら<pcap.h>のようなものは使わずにできたらいいな、と考えています。 こちらの勉強もした方がいいとは思いますが、とりあえず基本的なものを用いて勉強しようと考えています。 私の調べ方・勉強方法が悪いのもあるとは思いますが、どうかよろしくお願いします。

  • windowsでLinuxで作成したソースをコンパイル

    Linuxで作成、 $gcc -Wall file.c で、通ったファイルをWindowsでも同様に通したいので、MinGWを使って、コンパイルしたのですが、 #include <sys/socket.h> の構文で引っかかってしまいました。どうやらインクルードファイルが無いようでしたので、 C:\MinGW\include C:\MinGW\lib 以下に、Linuxの /usr/include/ /usr/lib/ 以下のファイルをそのまま入れて、再度実行しました。 ヘッダーファイルは見つけて読んでくれたのですが、そのヘッダーファイルに書いてある関数(例:htons(), socket(), inet_addr(), connect())が参照できないとの事で、怒られてしまいます。 Linuxのライブラリファイルをそのまま入れたのがまずかったのかもしれないのですが、こいつのエラーを解消する有効手段が見つかりません。 問題解決のヒント、又は答えを教えていただけませんでしょうか。 どうか、お願い致します。

  • Cプログラム UDP送信の送信データに関して

    以下の2つのプログラムでの質問なのですが、 #include <winsock2.h> #pragma comment(lib,"ws2_32.lib") int main() { WSADATA wsaData; SOCKET sock; struct sockaddr_in addr; WSAStartup(MAKEWORD(2, 0), &wsaData); sock = socket(AF_INET, SOCK_DGRAM, 0); addr.sin_family = AF_INET; addr.sin_port = htons(3054); addr.sin_addr.S_un.S_addr = inet_addr("192.168.0.3 "); sendto(sock, "\x42\42\0\0\0\0\2\0\1\2\x44\x33\5", 13, 0, (struct sockaddr *)&addr, sizeof(addr)); closesocket(sock); WSACleanup(); return 0; } と #include <winsock2.h> #pragma comment(lib,"ws2_32.lib") int main() { WSADATA wsaData; SOCKET sock; struct sockaddr_in addr; WSAStartup(MAKEWORD(2, 0), &wsaData); sock = socket(AF_INET, SOCK_DGRAM, 0); addr.sin_family = AF_INET; addr.sin_port = htons(3054); addr.sin_addr.S_un.S_addr = inet_addr("192.168.0.3 "); sendto(sock, "HELLO", 5, 0, (struct sockaddr *)&addr, sizeof(addr)); closesocket(sock); WSACleanup(); return 0; } について、送信データ部分に「¥」入ることによって、送信プロセスでどのような処理がなされているのですか? ¥~¥までで1バイトということで処理してくださいね、と処理系?に指示しているのですか? また、「¥」はC言語ならではの表記の仕方なのですか?少し、伝えるのが難しいですが、何でもいいのでご回答頂けませんか?宜しくお願いします。

  • UDPでのブロードキャスト送信

    Linuxで下記UDPブロードキャスト送信プログラムを作ったのですが、sendto()関数の戻り値が-1となり エラーとなってしまうので送信できません。 何が悪いのでしょうか? ちなみにIPアドレスは192.168.0.1 サブネットマスクは255.255.0..0でやっています。 又、サブネットマスクを0.0.0.0で試してもみましたがダメでした。 #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <stdio.h> int main() { int sock; struct sockaddr_in addr; int yes = 1; sock = socket(AF_INET, SOCK_DGRAM, 0); addr.sin_family = AF_INET; addr.sin_port = htons(12345); addr.sin_addr.s_addr = inet_addr("255.255.255.255"); setsockopt(sock, SOL_SOCKET, SO_BROADCAST, (char *)&yes, sizeof(yes)); if(sendto(sock, "HELLO", 5, 0, (struct sockaddr *)&addr, sizeof(addr))!=5) printf("send error!!\n"); close(sock); return 0; }

  • C言語開発環境について

    このプログラムを実行出来るコンパイラ?あるいは開発環境を紹介して頂けませんか?出来れば無償版がいいです。よろしくお願い致します。 #include <winsock2.h> #pragma comment(lib,"ws2_32.lib") int main() { WSAData wsaData; SOCKET sock; struct sockaddr_in addr; WSAStartup(MAKEWORD(2,0), &wsaData); sock = socket(AF_INET, SOCK_DGRAM, 0); addr.sin_family = AF_INET; addr.sin_port = htons(3054); addr.sin_addr.S_un.S_addr = inet_addr("192.168.0.3"); sendto(sock, "HELLO", 5, 0, (struct sockaddr *)&addr, sizeof(addr)); closesocket(sock); WSACleanup(); return 0; }

専門家に質問してみよう