ページ 11

特定のソケットIDにパケットを送りたい

Posted: 2012年5月07日(月) 14:07
by びす
winsockを使って通信している対象プログラムの利用しているソケットIDがわかるとして、
そのソケットIDへパケットを送るようなプログラムを作りたいです
(Winsock Packet Editorのような)

調べてみてもサッパリわからず
こんなものかな?と想像で作ってみましたが、やはりダメでした><

いったい何を調べればいいかもわからない状況です..
タイトルのようなプログラムを作る際に、足がかりになるようなページ等を教えてもらえないでしょうか

どうぞよろしくお願いします

コード:

#include <winsock2.h>
#include <iostream>

using namespace std;

#pragma comment(lib,"ws2_32.lib")

int main() {

	WSADATA wsaData;
	SOCKET sock;

	WSAStartup(MAKEWORD(2,0), &wsaData);

	cout << "ソケットIDを入力" << endl;

	char buf[256];
	cin >> buf;

	sock = atoi(buf);

	char sendbuf[] = {1,2,3,4,5,6,7,8,9,0};

	// 送信
	send(sock, sendbuf, sizeof(sendbuf), 0);

	WSACleanup();
	return 0;
}

Re: 特定のソケットIDにパケットを送りたい

Posted: 2012年5月07日(月) 14:44
by softya(ソフト屋)
すくなくともTCP/UDPかは決めないとパケットは送信できません。
その前に結構出鱈目なことをしているので、まずwinsockの使い方を学んで下さい。
「Geekなぺーじ:winsockプログラミング」
http://www.geekpage.jp/programming/winsock/

sock = atoi(buf);//(重要)socket関数の戻り値を入れて下さい。
その他にも足りないものは沢山あります。

Re: 特定のソケットIDにパケットを送りたい

Posted: 2012年5月07日(月) 14:52
by びす
返信ありがとうございます
softya(ソフト屋) さんが書きました:すくなくともTCP/UDPかは決めないとパケットは送信できません。
TCPです
softya(ソフト屋) さんが書きました:sock = atoi(buf);//(重要)socket関数の戻り値を入れて下さい。
作りたいのは、"他のプログラムがsocketして戻ったSOCKETを入力し、そこへパケットを送る"ものなのですが、
こちらのプログラムでもsocketをする必要があるのでしょうか?
softya(ソフト屋) さんが書きました:その前に結構出鱈目なことをしているので、まずwinsockの使い方を学んで下さい。
「Geekなぺーじ:winsockプログラミング」
http://www.geekpage.jp/programming/winsock/
ありがとうございます、勉強してきます

Re: 特定のソケットIDにパケットを送りたい

Posted: 2012年5月07日(月) 15:16
by softya(ソフト屋)
そもそも、そのソケットIDってなんなのでしょうか?
SOCKETの値(ソケット識別子)のことなら他のプロセス(別の仮想空間)の値は使い回せないはずです。
そんなワザって何処かのサイトや誰からか聞いたのでしょうか?

Re: 特定のソケットIDにパケットを送りたい

Posted: 2012年5月07日(月) 15:25
by びす
softya(ソフト屋) さんが書きました:そもそも、そのソケットIDってなんなのでしょうか?
参考にしている"Winsock Packet Editor"で送信先の入力欄に"OPEN SOCKET ID"と書かれていることや、
こちらの質問「ソケットIDって何ですか?」を見て、ソケットIDという名称なのだと勘違いしていました
ソケット識別子というんですね..失礼しました
softya(ソフト屋) さんが書きました:SOCKETの値(ソケット識別子)のことなら他のプロセス(別の仮想空間)の値は使い回せないはずです。
そんなワザって何処かのサイトや誰からか聞いたのでしょうか?
前述の"Winsock Packet Editor"で別のプロセス(WPE.exe)からパケットを送信するという芸当ができたので、できるものだと思いました

//編集 5/7 15:32 すみません、Windows じゃなくて Winsock でした..

Re: 特定のソケットIDにパケットを送りたい

Posted: 2012年5月07日(月) 15:41
by softya(ソフト屋)
この情報だけだと"Winsock Packet Editor"が"OPEN SOCKET ID"を内部的にどうやって扱われているか分かりませんね。
一般的なwinsockプログラミングでは、ソケット識別子を数値として扱うようなことはしませんのでwinsock内部でどの様なことをして管理しているか把握していないと同じ事をするのは難しいと思います。
試しに検索してみたら、海外サイトで"Winsock Packet Editor"が"OPEN SOCKET ID"と同じ処理するにはどうすれば?と言う質問を見つけましたが返事がない状況でした。一般的な方法じゃないんでしょう。

"Winsock Packet Editor"のソースコードが公開されているなら、それを解析するほうが良いと思います。
【訂正】こっちもWinsock Packet Editorに修正。

Re: 特定のソケットIDにパケットを送りたい

Posted: 2012年5月07日(月) 16:24
by びす
softya(ソフト屋) さんが書きました:この情報だけだと"Winsock Packet Editor"が"OPEN SOCKET ID"を内部的にどうやって扱われているか分かりませんね。
一般的なwinsockプログラミングでは、ソケット識別子を数値として扱うようなことはしませんのでwinsock内部でどの様なことをして管理しているか把握していないと同じ事をするのは難しいと思います。
試しに検索してみたら、海外サイトで"Winsock Packet Editor"が"OPEN SOCKET ID"と同じ処理するにはどうすれば?と言う質問を見つけましたが返事がない状況でした。一般的な方法じゃないんでしょう。
わざわざ検索までしていただいて、本当にありがとうございます
やはり、一筋縄では行かないですね..
softya(ソフト屋) さんが書きました:"Winsock Packet Editor"のソースコードが公開されているなら、それを解析するほうが良いと思います。
なるほど!WPEのソースコードを調べるという手がありましたね!
調べたところ、WPEのものは見つかりませんでしたが同じようなツールがオープンソースで開発されていました
そちらのほうを調べてみたいと思います

あと「ソケット識別子は他のプロセス(別の仮想空間)の値は使い回せない」ということで
「なら、同じプロセスならできるのか?」と気がついたので
対象プロセスへDLLをインジェクションして、そこから送信する方法も試してみたいと思います

softya(ソフト屋)さん、本当にありがとうございました
進展したら、報告にきます
また詰まってしまったら、どうぞよろしくおねがいします><

Re: 特定のソケットIDにパケットを送りたい

Posted: 2012年5月07日(月) 17:58
by びす
対象プロセスに、ソケット識別子を入力するダイアログ表示→ボタン押下で識別子へsend するDLLをインジェクションしたところ、成功しました!
WSAStartupも必要なく、本当にsendのみで送信できました

またよろしくお願いします!

Re: 特定のソケットIDにパケットを送りたい

Posted: 2012年5月07日(月) 18:04
by softya(ソフト屋)
解決した場合、本来ならソースコードの掲載をお願いする所ですが不正なことに使えそうなプログラムですので掲載しない方向でお願いします。

>WSAStartupも必要なく、本当にsendのみで送信できました
WSAStartupもsocketもconnectも接続している本来のプロセスが行なっているので不要ですよ。
[補足]
ソケットエラーやパケットが混じった時にどうなるかは神のみぞ知るって事になると思いますが。