他人の空似自作物置場

udp4th123.zip/Readme.txt

プログラム名:非想天則専用相互認証ツール

用途:サンプルコードとして楽しむ
本来の用途:非想天則ネット対戦中ならポートを開けずに相互に存在確認を可能にする(はずだった)ツール


使い方:
・VS Networkで繋がった状態のクライアントPCとホストPCを用意します。
・ホストのPCでudp_server.exeを起動します。
・クライアントのPCでudp_client.exeを起動します。
・成功するとホストのudp_server.exeにsuccessを表示される。

インストール:
zip展開するだけ

アンインストール:
レジストリもテンポラリファイルも弄っておりません。
フォルダごと削除するだけですっきりさっぱりおさらばできます。

ファイル解説:
udp_server.cpp	udp_server.exeのソースコード、ws2_32.libとリンクしてやってください。
udp_server.exe	ホストPC向けexeファイル。
udp_client.cpp	udp_client.exeのソースコード、こちらもws2_32.libとのリンク必須。
udp_client.exe	クライアントPC向けexeファイル。
Readme.txt		今読んでいるこれ。


Q&A:
	Q:このAI使ったら緋想天(非想天則)のデータ壊れる可能性ある?
	A:ありません。
	本アプリは緋想天もしくは非想天則の動作に干渉することはありません。

	Q:「外部に通信しようとしています、許可しますか?」というダイアログ出るんだが
	A:一部セキュリティーソフトは起動時、もしくは送信時に上記のようなダイアログを出してユーザーに同意を求めてくる可能性があります。
	ブロックしたら動きませんが、作者を信用できない場合はどうしようもありません。
	その場合、禁止にした後にゴミ箱へ。

	Q:黒窓は使い辛いし無駄にスペースとりすぎ
	A:仕様です。

	Q:再配布 or これを参考にしたアプリを作って配布してもいい?
	A:構いません、むしろ推奨します。
	作者への連絡/明記やライセンスの縛りすらありません。
	詳しくはライセンスの項をお読みください。

	Q:動ごかない
	A:習作であり、途中で開発停止したものであり、なおかつXP SP3でしか動作検証がされていません。
	なので、おかしい動作を見つけたら、むしろソースを追って原因追及を楽しむぐらいの気持ちが重要です。

	Q:「存在確認を可能にする”はずだった”ツール」って、結局ダメだったの?
	A:ダメでした。
	新しいポート開放が必要ないというだけで緋想天が使用している既存のポート(たいていの人は10800)を使用しているため
	クラ専の人は自分の存在を教えることは出来ても相手側の存在を知る術がありませんでした。
	詳しく知りたい人は最下部の詳細を読んでみるといいでしょう。

	Q:同一PC上じゃ動かないの?
	A:場合によるようです。
	パケット受信方法全てOSの機能であるRawソケットに依存しているため、Rawソケットで取れるなら動く、取れなければ動かない、となります。
	また、セキュリティーソフトが動作介入していたり、MSがしょっちゅう仕様変更をしていたりと非常に危うい機能でもあって
	調べても調べきれず、実際に試してみるしか方法が無い、というものでもあります。
	なので、動く場合もある、程度に。

	Q:これ何に使う予定だったの?
	A:秘密

	Q:てんこあいしてる?
	A:いや別に

	Q:シャンハーイ?
	A:シャンハーイ! 


作者:sweetie
メールアドレス:bnryxx332a(あっと)mail.goo.ne.jp


ライセンス:
・本ライセンスにおいて、全ての条項は「変更の有無を問わず、明示暗示を問わず、商業慈善を問わず、個人法人を問わず、保持使用を問わず、有料無料を問わず」と装飾されている物として扱う。
・著作権者は本ソフトウェアに関する一切の保障義務をもたない。
・上記条項唯一の例外として、本ライセンスに違反した場合を除いて著作権者から本ソフトウェアに関する一切の法的措置を受ける事が無い事のみ保証される。
・著作権者やその他保持者がこのライセンスの範囲で行う活動に支障が無い範囲であれば何を行っても構わない。
・上記条項の”何を行っても構わない”には本ソフトウェアの製作者を偽っての再配布も含まれる。
・全ての権利の行使において、著作権者への連絡、著作権者やライセンス条項の記載、適用ライセンスなどの制限は一切存在しない。
著作権者名:sweetie


面倒な人向けライセンス解説:
ライセンスについては記載義務すらありません。
再配布でも改変でも好きに出来ます。


スペシャルサンクス:
Setaria	テスト、問題点の発見など


技術情報(と、どうでもいい話):
コンパイル環境はコマンドライン版VC++14.00.50727.762。

通信する仕組み:
非想天則のホスト側は当然ポートが開いているので、クライアントからホストの非想天則へは通信が可能。
当然受信するのは非想天則だが、パケットキャプチャー機能を用いることで自分宛では無いパケットも受信することが可能。

そこで、以下のような手順を踏めばクラ->ホストへの通信は可能となります。
	クライアントは非想天則の通信要求パケットのバージョン情報部分に独自のデータを仕込んだ偽パケットを送信
	->ホスト側の非想天則はバージョン違いだと弾く->ホスト側のアプリがパケットキャプチャー越しにキャッチ

ですが、逆にホストからクラへの通信はパケットキャプチャー越しであるために行えません。
(本来なら受信したソケットから返信も行えるがRawソケットにそんな機能は無い)
IPとポート番号は判るのですが、そのポートは非想天則が抑えているためbindは失敗します。
もしクライアント側のポートも開いていれば、そのポートを使ってサーバーアプリを立ち上げ、そこに向かって通信するという方法が使えたのですが
クラ専の人は当然開いていないので無理です。

一応、非想天則自体が送信するパケットに仕込めば送受信が可能になるので
なんらかの方法で非想天則の動作に介入しソケットを横取りすれば可能です。
ですが、用途の都合でその方法は使えないため、ご破算となりました。

非想天則の接続試行パケット:
バイトオフセット	データ
0x00			0x01
0x01			0x02, 0x00, 0x2A, 0x31
0x05			バージョン情報12バイト
0x11			0x02, 0x00, 0x2A, 0x31
0x15			バージョン情報12バイト
0x21			送信回数
となっています。
バージョン情報は完全に同じもの(このアプリで好き勝手しているのもここ)
送信回数は送信回数がそのままではなく変に複雑なので以下の模擬コードを参照
int Get_SendCount(int count){
	static int ransuu = rand();
	if(count%5 < 2){
		return 0;
	}
	if(count%5 < 4){
		return count/5;
	}
	return rand + count/5;
}
どうしてこうなっているかは不明、5連続で受信成功しない限り接続成功させないためかな?

ちなみに、あくまで適当な調査結果なので間違っている可能性が高いです。