streamRelay (Java による TCP ポート・リダイレクター)

JDK/JRE13 の動作環境では、Corba/RMI 関連のコードを修正して再コンパイルする必要があるため、動作しないようです。(2020/01/21)


Java で作成した TCP ポート・リダイレクターです。
さらに SSL サーバへの転送も対応しています。
自分自身が SSL サーバになる機能は、未実装です。

(TCP ポート・リダイレクターというよりも、ただのストリーム・リレーの様相を呈してきました)
(→ ファイル名を変えました(TcpRelay→StreamRelay)。ver2.6)

ver2.6 以降で、スクリプト機能の実装を行ったため JDK6/JRE6 以降が動作には必要

ver5.4 以降で、java.util.zip.Deflater クラスのプロパティの関係で、JDK7/JRE7 以降が動作には必要

Base64 Encode/Decode は、http://www.source-code.biz/snippets/java/2.htmを拝借しました。

BZip2 Stream は、http://www.kohsuke.org/bzip2/を拝借しました。

Pack200 圧縮、バイト数カウント の Stream は、Apache-Commons Compressを拝借しました。

Xz 圧縮は、ver8.2 からApache-Commons Compressを使わずに、XZ for Javaを使うようにした。

CRC64 は、XZ for Javaを拝借しました。

[Base32|Base64][Input|Output]Stream は、Apache-Commons Codecを拝借しました。

LZ4 圧縮 Stream に関しては、https://github.com/lz4/lz4-javaを拝借しました。

ver3.1 以降のサウンド(AudioInputStream)に関しては「Java de RTP」を参考にしました。

MD4 に関しては、OpenJDK MD4.java を拝借しました。

Rabbit に関してはRabbit.java を拝借しました。

Mersenne Twister に関しては、メルセンヌ・ツイスタ乱数発生プログラムをJavaに移植してみる を拝借しました。

LHA に関しては、LHA Library for Java を拝借しました。

7z に関しては、Apache-Commons CompressXZ for Java を使っている。

CPIO 形式, AR 形式, TAR 形式, ARJ 形式 に関しては、Apache-Commons Compress を使っている。

SSH については jsch ver1.50 を改造しました。


StreamRelay001.png
基本的には二つの "ストリーム" のデータ交換を行う
つまり、「ネットワーク|コンソール|外部コマンド」⇔「ネットワーク|コンソール|外部コマンド」で通信する
サウンドも javax.sound.sampled.AudioInputStream ということで、ストリームなので、対応
UDP/RMI/Corba/(サウンドの出力) はストリームを継承するクラスを実装すること対応


StreamRelay002.png
基本的には二つのストリームは対等だけど、
ネットワークストリームに関して、「サーバ」と「クライアント」と対等ではなくなるので、
片方(サーバとして動作する側)を「Local」。
もう片方(クライアントとして動作する側)を「Remote」と呼称している
オプション指定は、
片方のストーム(ネットワークでサーバとなる方)を「LocalXXXX」、もう片方(ネットワークでクライアントとなる方)を「RemoteXXXX」
「クライアント」→「サーバ」への流れに対して「RequestXXXX」
「サーバ」→「クライアント」への流れに対して「ResponseXXXX」
(とりあえず命名されているStream の)"Local" の入力側ということで「-LocalInoutXXXX」というオプション指定が可能なものもある。
(とりあえず命名されているStream の)"Local" の出力側ということで「-LocalOuoutXXXX」というオプション指定が可能なものもある。
(とりあえず命名されているStream の)"Remote" の入力側ということで「-RemoteInoutXXXX」というオプション指定が可能なものもある。
(とりあえず命名されているStream の)"Remote" の出力側ということで「-RemoteOuoutXXXX」というオプション指定が可能なものもある。



-LocalPort で、自分自身のポート番号を指定します。
-RemotePort で、転送先のポート番号を指定します。

-LocalPort/-RemotePort 共に 「0」に指定すると、標準入出力へリダイレクトします。
例えば「-LocalPort=0」で netcat のクライアント・モードのようになります。
「-RemotePort=0」とすると netcat のサーバ・モードのようになります。

また、「-LocalInputFile/-LocalOutputFile」や「-RemoteInputFile/-RemoteOutputFile」を指定することで、
標準入出力(-[Local|Remote]Port=0)から、ファイルへリダイレクトできます。

また、サウンド(マイク)を入力源とする場合(「-[Local|Remote]InputMic オプション」)も「-LocalPort/-RemotePort」を「0」にしてください。
サウンドに関しては、javax.sound.sampled.AudioInputStream クラスをそのまま使っているだけ。
入力フォーマットは、ver3.1 時点では、
「リニアPCM、サンプリング周波数=8000Hz、量子化ビット数=16bit、モノラル、符号付きリトルエンディアン」固定です。
ver3.1 現在、ハウリング対策はされていないため、音声チャットに用いる場合、片方をイヤホンにするなどの対策が必要になります。

-LocalPort/-RemotePort 共に「-1」を指定すると、プログラムへリダイレクトします。
プログラムは、-LocalProgram/-RemoteProgram で指定します。
例えば、「-LocalPort=-1」とすると、netcat のクライアント・モードの「-e」オプションのような挙動になります。
「-RemotePort=-1」とすると、netcat のサーバ・モードの「-e」オプションのような挙動になります。

また、「-GUI」と指定すると、AWT によるグラフィカル・ユーザ・モードになります。

例えば、「-SSLRemote -GUI」と指定すると、wStunnel のような GUI 付き SSL クライアント・転送ツールになります。


StreamRelay006.png
フィルタ機能として、Base64エンコード/デコードや、文字コード変換や、SOCKS Proxy 機能、ハッシュ計算、暗号化処理などを用意


StreamRelay008.png


StreamRelay010.png



-RemoteCipherXXXXX

StreamRelay.jar<->Server 間の暗号化を行う。

javax.crypto.Cipher クラスと javax.crypto.CipherInputStream/javax.crypto.CipherOutputStream を使っているだけ

-RemoteCipherAlgorithm 《共通鍵アルゴリズム》
暗号化通信の共通鍵アルゴリズムを指定する

-RemoteCipherPassword 《共通鍵》
共通鍵暗号に使用する暗号鍵を指定する

-RemoteCipherPasswordHashAlgorithm 《ハッシュアルゴリズム》
共通鍵暗号に使用する暗号鍵は、そのまま使用せず、ここで指定したハッシュ関数を通して使用する

-RemoteCipherDH
共通鍵暗号に使用する暗号鍵を DH 鍵交換によって決定する

-RemoteCipherECDH
共通鍵暗号に使用する暗号鍵を ECDH 鍵交換によって決定する

-RemoteAlgorithmParameters
アルゴリズムパラメータを Hex 形式でセットする


暗号アルゴリズムだけではなく、モードや、パディングなどを指定する場合は「-CalculateAlgorithmParameters」や「-RemoteAlgorithmParameters」で、アルゴリズムパラメータ・オブジェクトを指定する必要があると思うわれる


-LocalCipherXXXXX

Client<->StreamRelay.jar 間の暗号化を行う。

javax.crypto.Cipher クラスと javax.crypto.CipherInputStream/javax.crypto.CipherOutputStream を使っているだけ

-LocalCipherAlgorithm 《共通鍵アルゴリズム》
暗号化通信の共通鍵アルゴリズムを指定する

-LocalCipherPassword 《共通鍵》
共通鍵暗号に使用する暗号鍵を指定する

-LocalCipherPasswordHashAlgorithm 《ハッシュアルゴリズム》
共通鍵暗号に使用する暗号鍵は、そのまま使用せず、ここで指定したハッシュ関数を通して使用する

-LocalCipherDH
共通鍵暗号に使用する暗号鍵を DH 鍵交換によって決定する

-LocalCipherECDH
共通鍵暗号に使用する暗号鍵を ECDH 鍵交換によって決定する

-LocalAlgorithmParameters
アルゴリズムパラメータを Hex 形式でセットする


暗号アルゴリズムだけではなく、モードや、パディングなどを指定する場合は「-CalculateAlgorithmParameters」や「-LocalAlgorithmParameters」で、アルゴリズムパラメータ・オブジェクトを指定する必要があると思うわれる


「-LocalCipherPasswordFromGUI」「-RemoteCipherPasswordFromGUI」
暗号化処理において、上記のオプションを使う事で、起動時に GUI(入力ダイアログ)から暗号鍵を与える事ができます。
よって「Sample\Cipher.reg」にあるようなキーと値(環境によっては StreamRelay.batのパスを追記する必要があるので、テキストエディタで開いて適切に修正する必要がある)をレジストリに登録する事で、エクスプローラの右クリックメニューに暗号化/復号処理を登録して、プログラム起動時に暗号鍵を与える事ができます。
右クリックメニュー入力ダイアログ


黒い画面が出てしまうけど、WSH経由で呼び出せば出ないようにする事も可能。


-[Remote|Local][GZIP|deflate|BZIP|Xz|LZ4|ZLIB]Commpress

通信の圧縮を行う。
(ただし、通信終了まで、受信できないので[圧縮処理のためにバッファリングしてしまう]あまり利用場面はないかもしれない)
([Remote|Local]ZLIBCommpress オプションで、JDK7 以降の java.util.zip.Deflater.SYNC_FLUSH なので、リアルタイムに圧縮されると思う)(ver8.4で仕様変更)

java.util.zip.GZIPInputStream/java.util.zip.GZIPOutputStream や
java.util.zip.InflaterInputStream/java.util.zip.DeflaterOutputStream を使っているだけ。

-RemoteGZIPCommpress/-RemotedeflateCommpress は StreamRelay.jar<->Server だけ行う
-LocalGZIPCommpress/-LocaldeflateCommpress は Client<->StreamRelay.jar だけ行う
ver3.1 以降は、BZIP2 に対応。
BZIP2 のストリームには、http://www.kohsuke.org/bzip2/を使用しています。

ver4.0 以降は、Xz/Pack200/LZ4 に対応。
XZ/Pack200 については、Apache Commons Compressを使用しています。
LZ4 については、https://github.com/lz4/lz4-javaを使用しています。

標準入力を入力源として圧縮処理はできないかもしれない。
ロック(Closeするまで完全にバッファリングする)がかかって、プログラムが止まってしまうかもしれない

ver8.4 で、Zlib/Deflate/Gzipを厳密にするようにした。
これによって、今まで DeflateCompress がZlibだったのをDeflateになるように仕様変更(過去のバージョンと非互換)した。
詳細はこちら
また、ZlibCompress オプションは、リアルタイム圧縮(SyncFlush)ではなく、純粋なZlib圧縮になるようにした(仕様変更(過去バージョンと非互換))。
また、リアルタイム圧縮の指定には「SyncFlush」を付けるように仕様の変更を行った(Deflate/Zlib/Gzip のみ)。
また、Deflate/Zlibでは、圧縮レベルが指定できるようになった。


-[Local|Remote][Request|Response]HashAlgorithm
-[Local|Remote][Input|Output]HashAlgorithm
-[Local|Remote][Request|Response][Adler32|CRC32|XXHash32|XXHash64]
-[Local|Remote][Input|Output][Adler32|CRC32|XXHash32|XXHash64]
-[Local|Remote][Request|Response]HMACAlgorithm <<name>> <<key>>
-[Local|Remote][Input|Output]HMACAlgorithm <<name>> <<key>>
-[Local|Remote][Request|Response]HMACAlgorithmHex <<name>> <<hex key>>
-[Local|Remote][Input|Output]HMACAlgorithmHex <<name>> <<hex key>>


ストリームを流れるデータのハッシュ値やチェックサムや HMAC 値を計算する
java.security.DigestInputStream/java.security.DigestOutputStream や
java.util.zip.CheckedInputStream/java.util.zip.CheckedOutputStream を使っているだけ

HMAC については、MacInputStream/MacOutputStream を作った。

なるべくデバイス側に近い部分で、被せているつもり。
java.security.DigestInputStream/java.util.zip.CheckedInputStream なら、読み込んですぐ
java.security.DigestOutputStream/java.util.zip.CheckedOutputStream なら、デバイスに書き込むギリギリの辺り

ver4.0 以降は、XXHash32 に対応。
XXHash32 については、https://github.com/lz4/lz4-javaを使用しています。

ver8.2 からhttps://github.com/lz4/lz4-javaを ver1.4.1 にして、XXHash64 な対応。

HMAC に対応しているアルゴリズムは、


-CRLFxxxx

改行コードを「CrLf」にするオプション
-CRLF は、Client->Server も Server->Client も行う
-CRLFrequest は Client->Server だけ行う
-CRLFresponse は Server->Client だけ行う


-RemoteSSL と -RemoteSSLAfterProxyConnection

Java では SSL は SSLSocket として実装されている。
「-RemoteSSL」は、Socket 接続後すぐに SSLSocket へ拡張される(その後 InputSream/OutputSrream を取得して拡張ストリーム(暗号ストリームやチェックサムストリーム)をラップしていく)のに対し、「-RemoteSSLAfterProxyConnection」は、InputStream/OutputStream へ様々な Stream オブジェクトをラップした後で、「-Proxy」オプション処理も実行後に、再度 Socket を SSLSocket へ拡張する。
よって、「-RemoteSSLAfterProxyConnection」では、拡張ストリームの割り当てが行われない(解除される)まで、併用は想定していない



StreamRelay011.png



-RemoteSSLName

SSL/TLS で接続する際、既定では証明書チェックをしない(デバグツールなのでオレオレ証明書でも接続可能)ようにしているのですが、このオプションを指定すると、その文字列を証明書の「Common name」と比較します。
これを実現するため、JFC の内部クラス(sun.security.util.HostnameChecker クラス{getInstance(),TYPE_TLS,match()})に直接アクセスしているため、環境によっては動作しない可能性もあります。


-RemoteSSLMode

javax.net.ssl.SSLContext クラスのインスタンス生成時のオプション。
ver5.6 から既定を「TLS」から「Default」(getDefault() メソッドによるインスタンスの生成)に変更しました。


-UseWeakAlgorithm

Java7 以降、既定で弱いアルゴリズムを使った証明書などに SSL/TLS で接続できなくなり、それではデバグツールにならないので、それを回避するオプション


-VerboseSSL

SSL/TLS 時にこのオプションを指定すると、SSL/TLS 接続情報の詳細を表示するようにしました。 使っているプロパティは、以下です




-RemoteSSLName

javax.net.ssl.SSLContext#getInstance() に渡す文字列で、既定の「TLS」のままでよいと思う。


-UseAllSSLProtocol
-UseSSLProtocols
-RistrictSSLProtocols
-UseAllSSLCipherSuite
-UseSSLCipherSuites
-RistrictSSLCipherSuites


SSL 接続時のプロトコルを制限したり、暗号方式を制限したりする場合に使用できます。
既定は、JDK の既定のままです。
流れは、以下の通りです。(Protocol と CipherSuite は別々に処理していますが、流れは一緒なので、一緒に説明している)

  1. -UseSSLProtocols/-UseSSLCipherSuites 指定をカンマ区切りで連結していく
  2. 何も指定されていなければ、-UseAllSSLProtocol/UseAllSSLCipherSuite が指定されていればサポートされている全て。そうでなければ JDK の既定の一覧を取得する
  3. カンマ区切りに分割する
  4. -RistrictSSLProtocols/-RistrictSSLCipherSuites で不要なものを排除 (配列ごとに replaceAll() の第一引数(正規表現)に与えているので、正規表現が可能だと思う)



SNI(Server Name Indication)について

Java7 から SNI は既定で有効になっていますが、SNI が必須となっているサーバに対しては、IPアドレスで接続する(つまり、-RemoteHost 192.0.2.1)と、SSLハンドシェイクが失敗するかと思いますので、-RemoteHost にはホスト名を指定してください。




-ScriptFile
-ScriptCharset
-ScriptLanguage


ストリームデータをスクリプトで処理するオプション
既定の言語は「JavaScript」
スクリプトをファイルに記述後に「-ScriptFile」で指定する
スクリプトファイルの文字コードの既定は、システムの文字コード

このスクリプト機能(JDK6以降)により、JRE6 以降でないと動作しないと思います。

公開しているオブジェクトは「JSStreamRelay」
プロパティ/メソッド名意味
(String)InputStr文字コード指定の場合、ストリームデータを文字列に置換した状態でこれに格納されてる。
また、これに格納しておくことで、ストリームへ出力される
(byte[])InputByteArray文字コードを指定していない場合、ストリームデータをバイト列としてこれに格納されている。
また、これに格納しておくことで、ストリームへ出力される
(String)BufferStr
(byte[])BufferByteArray
一時格納用、次の呼び出しでも保持される。TCPの接続とストリームの方向ごとに独立で保持される
(Object)myTagなんとなく、Object 型の変数を用意してみた。バッファとして使えると思う
(Boolean)IsSendこのスクリプト呼び出し後に InputByteArray/InputStr のデータを転送したい場合 true をセットする(既定はtrue)
(String)InputStrReverse
(byte[])InputByteArrayReverse
返信したい場合、こちらに格納する。文字コードを指定した場合は String 型の変数へ、そうでない場合は、byte配列型の変数へ格納すること
(Boolean)IsSendReverseこのスクリプト呼び出し後に InputByteArrayReverse/InputStrReverse のデータを返信したい場合 true をセットする(既定はfalse)
(Boolean)IsCloseこのスクリプト呼び出し後に、コネクションを切断したい場合 true をセットする(既定はfalse)
(Boolean)IsRequestこのスクリプトが「リクエスト」のストリームで呼び出された場合 true。「レスポンス」のストリームで呼び出された場合 false
(Boolean)IsInputこのスクリプトが入力側で呼び出された場合 true。出力側で呼び出された場合 false
(int)count呼び出された回数。(「count=0」は接続直後なので、データ(InputByteArray/InputStr)は空のはず)
(String)InputCallerAddress入力側の相手のアドレス、またはプログラム、ファイル、標準入力
(int)InputCallerPort入力側の相手のポート番号
(String)InputMyselfAddress入力側の自分自身のアドレス、またはプログラム、ファイル、標準入力
(int)InputMyselfPort入力側の自分自身のポート番号
(String)OutputCallerAddress出力側の相手のアドレス、またはプログラム、ファイル、標準入力
(int)OutputCallerPort出力側の相手のポート番号
(String)OutputMyselfAddress出力側の自分自身のアドレス、またはプログラム、ファイル、標準入力
(int)OutputMyselfPort出力側の自分自身のポート番号



JDK6 以降に実装された javax.script 名前空間による「JSR-000223 Scripting for the Java Platform」を利用しているだけです。
  1. いろいろいなスクリプト言語を利用するには、java.net -> projects -> scriptingから「scripting.tgz」をダウンロードして「jsr223-engines.zip」を抽出する。
  2. その中にある「≪言語≫-engine.jar」を抽出して、クラスパスに通す。
  3. 同時に、言語エンジンの jar ファイル(言語エンジンの本家などから探す)もクラスパスに通す。
例:
動作確認の状態(2016/10/14 にダウンロード(scripting.tgz/jsr223-engines.zip))
Jython 2.2.1 OK
Jython 2.5.3 OK
Jython 2.7.0 NG
JRuby 1.1.3 OK
JRuby 1.5.6 OK
JRuby 1.6.8 OK
JRuby 1.7.0 OK
JRuby 1.7.2 OK
JRuby 1.7.3 NG
JRuby 1.7.5 NG
JRuby 1.7.9 NG
JRuby 1.7.19 NG
JRuby 1.7.26 NG
Groovy 1.5.6 OK
Groovy 1.8.9 OK
Groovy 2.0.8 OK
Groovy 2.4.3 OK
Groovy 2.4.7(Apache-Groovy) OK
LuaJ 3.0.1 OK
JudoScript 0.9 OK
Pnuts 1.2 OK
BeanShell 2.0b4 OK
OGNL 2.6.9 OK
Quercus 4.0.39(PHP) OK(quercus.jar 単独で OK)
Clojure-JSR223 OK(Clojure 1.2.0 相当)
Jacl(TclJava)1.4.1 OK
Scheme(SISC)1.16.6 OK
Scala 2.12.1 OK(型のキャスト(Object→JSObj)がうまくいかない)



Corba について1

NIC が複数セットされている場合、通信に混乱が生じてうまく通信できない場合があるようです。


CORBA について2

既定のポートはとりあえず 1050/tcp にしましたが、JavaCorba の既定のポート(orbd.exe の待機ポート)というものがあるのであれば、StreamRealy.jar の Corba の既定のポートもそれにしたいけど、取得する方法などがあるのだろうか!?


CORBA について3

既定のポートはとりあえず 1050/tcp にしましたが、RMIオブジェクトブローカーサービス(orbd.exe)を事前に起動させておく必要がある。

WARNING: "IOP00410201: (COMM_FAILURE) Connection failure: socketType: IIOP_CLEAR_TEXT; hostname: 0.0.0.0; port: 1050"
org.omg.CORBA.COMM_FAILURE: vmcid: SUN minor code: 201 completed: No
という感じのエラーが発生すると思う。


CORBA について4

orbd.exe を起動すると、「orb.db」というフォルダができるので、削除しておくとよいだろう。


RMI について1

既定のポートは 1099/tcp ですが、RMIレジストリサービス(rmiregistry.exe)を事前に起動させておく必要がある。

java.lang.ClassNotFoundException: RmiObj_Stub
というエラーが発生すると思う。


RMI について2

RMI レジストリサービス(rmiregistry.exe)に対して、環境変数「CLASSPATH」にて、StreamRelay.jar が検索できるようにしておく必要がある。
でないと、
java.net.ConnectException: Connection refused: connect
な感じのエラーが発生すると思う。

ということで、「rmiregistr.bat」を用意してある


使用例

netcat のクライアント・モード
nc.exe -nvv 192.0.2.1 90
java.exe -Djava.security.policy=StreamRelay.policy -jar StreamRelay.jar -LocalPort 0 -RemoteHost 192.0.2.1 -RemotePort 90 -Verbose


netcat のポート開閉確認
nc.exe -nvv -z 192.0.2.1 90
java.exe -Djava.security.policy=StreamRelay.policy -jar StreamRelay.jar -LocalPort 0 -RemoteHost 192.0.2.1 -RemotePort 90 -Verbose -ZeroIO


netcat のサーバ・モード
nc.exe -nvv -L -p 90
java.exe -Djava.security.policy=StreamRelay.policy -jar StreamRelay.jar -LocalPort 90 -RemotePort 0 -Verbose


ncat のようなブローカーモード
java.exe -Djava.security.policy=StreamRelay.policy -jar StreamRelay.jar -LocalPort 90 -RemotePort 0 -Broker


ncat のようなブローカーモードでログを記録
java.exe -Djava.security.policy=StreamRelay.policy -jar StreamRelay.jar -LocalPort 90 -RemotePort 0 -Broker -LoggingFile chatolog.txt


netcat のリモートシェル・サーバ・モード
nc.exe -nvv -L -p 90 -e cmd.exe
java.exe -Djava.security.policy=StreamRelay.policy -jar StreamRelay.jar -LocalPort 90 -RemoteProgram cmd.exe -RemotePort -1 -Verbose


netcat のリバース・リモートシェル・サーバ・モード
nc.exe -nvv 192.0.2.1 90 -e cmd.exe
java.exe -Djava.security.policy=StreamRelay.policy -jar StreamRelay.jar -LocalProgram cmd.exe -LocalPort -1 -RemoteHost 192.0.2.1 -RemotePort 90 -Verbose


OpenSSL のクライアント・モード
openssl.exe s_client -host 192.0.2.1 -port 443
java.exe -Djava.security.policy=StreamRelay.policy -jar StreamRelay.jar -LocalPort 0 -RemoteHost 192.0.2.1 -RemotePort 443 -Verbose -RemoteSSL


OpenSSL のクライアント・モード(SNI 必須なサーバへ接続する)
openssl.exe s_client -host sslserver.example.com -port 443
java.exe -Djava.security.policy=StreamRelay.policy -jar StreamRelay.jar -LocalPort 0 -RemoteHost sslserver.example.com -RemotePort 443 -Verbose -RemoteSSL
SNI 必須な SSL/TLS サーバへはホスト名で接続すること


winrelay と同等
winrelay.exe -lp 90 -dip 192.0.2.1 -dp 80
java.exe -Djava.security.policy=StreamRelay.policy -jar StreamRelay.jar -LocalPort 90 -RemoteHost 192.0.2.1 -RemotePort 80


winrelay と同等、さらに通信ログを画面に出力
winrelay.exe -lp 90 -dip 192.0.2.1 -dp 80
java.exe -Djava.security.policy=StreamRelay.policy -jar StreamRelay.jar -LocalPort 90 -RemoteHost 192.0.2.1 -RemotePort 80 -Logging


winrelay と同等、さらに通信ログを16進数で画面に出力
winrelay.exe -lp 90 -dip 192.0.2.1 -dp 80
java.exe -Djava.security.policy=StreamRelay.policy -jar StreamRelay.jar -LocalPort 90 -RemoteHost 192.0.2.1 -RemotePort 80 -Logging -LoggingHex


winrelay と同等、さらに通信ログのバイナリを UTF8 として変換しつつ画面に出力
winrelay.exe -lp 90 -dip 192.0.2.1 -dp 80
java.exe -Djava.security.policy=StreamRelay.policy -jar StreamRelay.jar -LocalPort 90 -RemoteHost 192.0.2.1 -RemotePort 80 -Logging -LoggingCharset UTF-8


sTunnel と同等
java.exe -Djava.security.policy=StreamRelay.policy -jar StreamRelay.jar -LocalPort 80 -RemoteHost 192.0.2.1 -RemotePort 443 -RemoteSSL


wsTunnel っぽく
java.exe -Djava.security.policy=StreamRelay.policy -jar StreamRelay.jar -RemoteSSL -GUI


ZeBeDee のような VPN
localhost -(平文)- localhost:90 -(暗号化)- 192.0.2.1:10990 -(平文)- サーバ(192.0.2.2)(80/tcp)
java.exe -Djava.security.policy=StreamRelay.policy -jar StreamRelay.jar -LocalPort 90 -RemoteHost 192.0.2.1 -RemotePort 10990 -RemoteCipherAlgorithm RC4 -RemoteCipherDH
java.exe -Djava.security.policy=StreamRelay.policy -jar StreamRelay.jar -LocalPort 10990 -RemoteHost 192.0.2.2 -RemotePort 80 -LocalCipherAlgorithm RC4 -LocalCipherDH


ZeBeDee のような VPN2(AES というブロック暗号をストリーム暗号のように使うモード)
localhost -(平文)- localhost:90 -(暗号化)- 192.0.2.1:10990 -(平文)- サーバ(192.0.2.2)(80/tcp)
java.exe -Djava.security.policy=StreamRelay.policy -jar StreamRelay.jar -LocalPort 90 -RemotePort 10990 -RemoteHost 192.0.2.1 -RemoteCipherAlgorithm AES/OFB8/NoPadding -RemoteCipherPassword abcdefgh -RemoteAlgorithmParameters <<サーバ側で出力されたAlgorithmParameterを指定する>>
java.exe -Djava.security.policy=StreamRelay.policy -jar StreamRelay.jar -LocalPort 10990 -RemotePort 80 -RemoteHost 192.0.2.2 -LocalCipherAlgorithm AES/OFB8/NoPadding -LocalCipherPassword abcdefgh -CalculateAlgorithmParameters


ZeBeDee のような VPN3(AES というブロック暗号をストリーム暗号のように使うモード{OFBよりこちらの方が推奨されるらしい})
localhost -(平文)- localhost:90 -(暗号化)- 192.0.2.1:10990 -(平文)- サーバ(192.0.2.2)(80/tcp)
java.exe -Djava.security.policy=StreamRelay.policy -jar StreamRelay.jar -LocalPort 90 -RemotePort 10990 -RemoteHost 192.0.2.1 -RemoteCipherAlgorithm AES/CTR/NoPadding -RemoteCipherPassword abcdefgh -RemoteAlgorithmParameters <<サーバ側で出力されたAlgorithmParameterを指定する>>
java.exe -Djava.security.policy=StreamRelay.policy -jar StreamRelay.jar -LocalPort 10990 -RemotePort 80 -RemoteHost 192.0.2.2 -LocalCipherAlgorithm AES/CTR/NoPadding -LocalCipherPassword abcdefgh -CalculateAlgorithmParameters


ZeBeDee のような VPN4(AES というブロック暗号をストリーム暗号のように使うモード{OFBよりこちらの方が推奨されるらしい})(さらに ZLIB のバッファリング無圧縮を実施する)
localhost -(平文)- localhost:90 -(暗号化)- 192.0.2.1:10990 -(平文)- サーバ(192.0.2.2)(80/tcp)
java.exe -Djava.security.policy=StreamRelay.policy -jar StreamRelay.jar -LocalPort 90 -RemotePort 10990 -RemoteHost 192.0.2.1 -RemoteZLIBCommpress=SyncFlush -RemoteCipherAlgorithm AES/CTR/NoPadding -RemoteCipherPassword abcdefgh -RemoteAlgorithmParameters <<サーバ側で出力されたAlgorithmParameterを指定する>>
java.exe -Djava.security.policy=StreamRelay.policy -jar StreamRelay.jar -LocalPort 10990 -RemotePort 80 -RemoteHost 192.0.2.2 -LocalZLIBCommpress=SyncFlush -LocalCipherAlgorithm AES/CTR/NoPadding -LocalCipherPassword abcdefgh -CalculateAlgorithmParameters


ファイル転送
java.exe -Djava.security.policy=StreamRelay.policy -jar StreamRelay.jar -LocalPort 0 -LocalInputFile abc.txt -RemoteHost 192.0.2.1 -RemotePort 90 -Verbose
java.exe -Djava.security.policy=StreamRelay.policy -jar StreamRelay.jar -LocalPort 90 -RemotePort 0 -RemoteOutputFile abc.txt -Verbose


netcat のクライアント・モードで、ファイルから入力
c:\> type abc.txt
HEAD / HTTP/1.0


c:\> nc.exe -nvv 192.0.2.1 90 < abc.txt
c:\> type abc.txt
HEAD / HTTP/1.0


c:\> java.exe -Djava.security.policy=StreamRelay.policy -jar StreamRelay.jar -LocalPort 0 -LocalInputFile abc.txt -AllowHalfOpen -RemoteHost 192.0.2.1 -RemotePort 90 -Verbose


netcat のサーバ・モードで、疑似 Web サーバ
c:\> type index.htm
HTTP/1.0 200 OK
Content-Type: text/html
Content-Length: 5

Hello
c:\> nc.exe -nvv -L -p 80 192.0.2.1 < index.htm
c:\> type index.htm
HTTP/1.0 200 OK
Content-Type: text/html
Content-Length: 5

Hello
c:\> java.exe -Djava.security.policy=StreamRelay.policy -jar StreamRelay.jar -LocalPort 80 -RemotePort 0 -RemoteInputFile index.htm -NonBroadCast -Verbose


HTTP Proxy(Connect) Server(192.0.2.3:8080) を経由して、192.0.2.4:80 へ接続する(自分は 91/tcp で待機)
java.exe -Djava.security.policy=StreamRelay.policy -jar StreamRelay.jar -LocalPort 91 -RemoteHost 192.0.2.4 -RemotePort 80 -Verbose -proxy connect://192.0.2.3:8080
StreamRelay016.png


SOCKSv4a(192.0.2.3:90) で接続して、さらに HTTP Proxy(Connect) Server(192.0.2.5:8080) を経由して、192.0.2.4:80 へ接続する(自分は 91/tcp で待機)
java.exe -Djava.security.policy=StreamRelay.policy -jar StreamRelay.jar -LocalPort 91 -RemoteHost 192.0.2.4 -RemotePort 80 -Verbose -proxy socks4a://192.0.2.3:90 -proxy connect://192.0.2.5:8080
StreamRelay018.png


HTTP Proxy(Connect) Server(192.0.2.1:8080) を経由して、192.0.2.2:443(SSL Server) へ接続する(自分は 91/tcp で待機)
java.exe -Djava.security.policy=StreamRelay.policy -jar StreamRelay.jar -localport 91 -remoteport 443 -remotehost 192.0.2.2 -Proxy connect://192.0.2.1:8080 -verbose -RemoteSSLAfterProxyConnection


Web Get の代替
wget.exe http://www.example.com/
java.exe -Djava.security.policy=StreamRelay.policy -jar StreamRelay.jar -LocalPort 0 -LocalInputUrlFile http://www.example.com/ -RemotePort 0


文字コードの変換
nkf.exe -S -e input.txt > output.txt
java.exe -Djava.security.policy=StreamRelay.policy -jar StreamRelay.jar -LocalPort 0 -LocalInputFile input.txt -LocalCharset Shift_JIS -RemotePort 0 -RemoteCharset EUC-JP -RemoteOutputFile output.txt


ファイルコピー
copy a.txt b.txt
java.exe -Djava.security.policy=StreamRelay.policy -jar StreamRelay.jar -LocalPort 0 -LocalInputFile a.txt -RemotePort 0 -RemoteOutputFile b.txt


二つのファイルコピー
copy a.txt b.txt && copy x.txt y.txt
java.exe -Djava.security.policy=StreamRelay.policy -jar StreamRelay.jar -LocalPort 0 -LocalInputFile a.txt -LocalOutputFile y.txt -RemotePort 0 -RemoteOutputFile b.txt -RemoteInputFile x.txt -AllowHalfOpen


スクリプト・コマンドっぽく
script outputLog.txt
java.exe -Djava.security.policy=StreamRelay.policy -jar StreamRelay.jar -LocalPort 0 -RemotePort -1 -RemoteProgram cmd.exe -LoggingFile outputLog.txt


ファイルの圧縮(java.util.zip.GZIPOutputStream は GZIP コマンドと互換性があるようだ)
gzip.exe a.txt
java.exe -Djava.security.policy=StreamRelay.policy -jar StreamRelay.jar -LocalPort 0 -LocalInputFile a.txt -RemotePort 0 -RemoteRequestGZIPCommpress -RemoteOutputFile a.txt.gz


ファイルの解凍(java.util.zip.GZIPInputStream は GZIP コマンドと互換性があるようだ)
gzip.exe -d a.txt.gz
java.exe -Djava.security.policy=StreamRelay.policy -jar StreamRelay.jar -LocalPort 0 -LocalInputFile a.txt.gz -RemotePort 0 -LocalRequestGZIPCommpress -RemoteOutputFile a.txt


ハッシュ値の計算
md5sum.exe a.txt
java.exe -Djava.security.policy=StreamRelay.policy -jar StreamRelay.jar -LocalPort 0 -LocalInputFile a.txt.gz -RemotePort 0 -LocalRequestHashAlgorithm MD5


NodeJS っぽく (動かすスクリプトは ECHO サーバ)
java.exe -Djava.security.policy=StreamRelay.policy -jar StreamRelay.jar -localport 90 -remoteport 0 -ScriptFile echo.js -verbose -debugmode


ファイルを圧縮しつつ、圧縮前と圧縮後のチェックサムとハッシュ値を表示
java.exe -Djava.security.policy=StreamRelay.policy -jar StreamRelay.jar -LocalPort 0 -LocalInputFile a.txt -RemotePort 0 -RemoteRequestGZIPCommpress -RemoteOutputFile a.txt.gz -LocalRequestHashAlgorithm MD5 -RemoteRequestHashAlgorithm MD5 -LocalRequestCRC32 -RemoteRequestCRC32


ファイルを圧縮しつつ、圧縮前と圧縮後のハッシュと HMAC とチェックサムとカウント値を全て表示
java.exe -Djava.security.policy=StreamRelay.policy -jar StreamRelay.jar -LocalPort 0 -LocalInputFile a.txt -RemotePort 0 -RemoteRequestGZIPCommpress -RemoteOutputFile a.txt.gz -LocalRequestAllHMACAlgorithm <<Key>> -RemoteRequestAllHMACAlgorithm <<Key>>


ファイルを圧縮しつつ、圧縮前と圧縮後のハッシュとチェックサムとカウント値を全て表示
java.exe -Djava.security.policy=StreamRelay.policy -jar StreamRelay.jar -LocalPort 0 -LocalInputFile a.txt -RemotePort 0 -RemoteRequestGZIPCommpress -RemoteOutputFile a.txt.gz -LocalRequestAllHashAlgorithm -RemoteRequestAllHashAlgorithm


ファイルのハッシュ値を全て表示
java.exe -Djava.security.policy=StreamRelay.policy -jar StreamRelay.jar -LocalPort 0 -RemotePort 0 -LocalInputFile a.txt -RemoteOutputFile nul -RemoteRequestAllHashAlgorithm
FOR /F "usebackq skip=2" %I in (`java.exe -Djava.security.policy=StreamRelay.policy -jar StreamRelay.jar -ListHash`) do @java.exe -Djava.security.policy=StreamRelay.policy -jar StreamRelay.jar -LocalPort0 -RemotePort 0 -LocalInputFile a.txt -RemoteOutputFile nul -RemoteRequestHashAlgorithm %I


ストリームにスクリプトを割り当てる
java.exe -Djava.security.policy=StreamRelay.policy -jar StreamRelay.jar -LocalPort 90 -RemoteHost 192.0.2.1 -RemotePort 80 -ScriptFile script.js


サウンド・レコーダー
java.exe -Djava.security.policy=StreamRelay.policy -jar StreamRelay.jar -LocalPort 0 -LocalInputMic -RemotePort 0 -RemoteOutputFile AudioSaveFile.pcm -Verbose


サウンド・レコーダーで保存したデータファイルを au 形式に変換
java.exe SoundFormatChange AudioSaveFile.pcm AudioSaveFile.au


音声チャット(片方がイヤホンなどでハウリング対策をする必要があるでしょう)
java.exe -Djava.security.policy=StreamRelay.policy -jar StreamRelay.jar -Verbose -LocalPort 99 -RemotePort 0 -RemoteInputMic -RemoteOutputSpeaker
java.exe -Djava.security.policy=StreamRelay.policy -jar StreamRelay.jar -Verbose -LocalPort 0 -RemotePort 99 -RemoteHost 192.0.2.1 -LocalInputMic -LocalOutputSpeaker


電話会議
java.exe -Djava.security.policy=StreamRelay.policy -jar StreamRelay.jar -Verbose -LocalPort 99 -RemotePort 0 -RemoteInputMic -RemoteOutputSpeaker -Broker
java.exe -Djava.security.policy=StreamRelay.policy -jar StreamRelay.jar -Verbose -LocalPort 0 -RemotePort 99 -RemoteHost 192.0.2.1 -LocalInputMic -LocalOutputSpeaker


SSL のプロトコル/暗号方式の確認
sslscan 192.0.2.1:443
for /F "usebackq skip=2" %i in (`java.exe -Djava.security.policy=StreamRelay.policy -jar StreamRelay.jar -ListSSLProtocol`) do @for /F "usebackq skip=2" %j in (`java.exe -Djava.security.policy=StreamRelay.policy -jar StreamRelay.jar -ListSSLCipherSuite`) do @java.exe -Djava.security.policy=StreamRelay.policy -jar StreamRelay.jar -localport 0 -zeroio -remoteport 443 -remotehost 192.0.2.1 -remotessl -UseSSLProtocols %i -UseSSLCipherSuites %j -verbosessl 2> nul


SSHのcipherをscanしたい時、wireshark起動するのは非効率なので、sslscanみたいなのを探してみたらあった!
c:\> nmap.exe --script ssh2-enum-algos -sV -p <port> <host>

link https://nmap.org/nsedoc/scripts/ssh2-enum-algos.html


SSL のプロトコルを制限して接続する
java.exe -Djava.security.policy=StreamRelay.policy -jar StreamRelay.jar -LocalPort 0 -RemotePort 443 -RemoteSSL -VerboseSSL -RemoteHost 192.0.2.1 -RistrictSSLCipherSuites .*RC4.*


wget, curl っぽく
java.exe -Djava.security.policy=StreamRelay.policy -jar StreamRelay.jar -LocalPort 0 -RemotePort 0 -RemoteSSL -VerboseSSL -LocalInputUrlFile http://www.example.com/index.html


WavDAV クライアントっぽく(a.txt をアップロードする)
java.exe -Djava.security.policy=StreamRelay.policy -jar StreamRelay.jar -LocalPort 0 -RemotePort 0 -RemoteSSL -VerboseSSL -LocalInputFile a.txt -RemoteOutputUrlFile http://www.example.com/index.html#header=Translate:f






ライセンス形態を ver5.4(2014/07/12) から修正 BSD ライセンスにします。

当然ですが、悪用厳禁です。

著作権は保持します。(とりあえず...)
しかし、プログラムの実行においては、各自の責任で行ってください。

このソフトを使用したいかなる不正使用に関する責任は、
すべて、本プログラムの利用者に属します。

プログラムの改変については、各自の責任で行う分については、自由に行って結構です。(参考になりましたメールをくれると、うれしい...(*^_^*))

(修正BSDライセンスにしても、あまり、ライセンス条項って変わっていないような気がするんだよなぁ〜)


C:\>StreamRelay.bat
StreamRelay for JAVA ver 8.4
        create by active@window.goukaku.com

  java.exe -Djava.security.policy=StreamRelay.policy -jar StreamRelay.jar [options]
   if port=0  stdio/stdout
   if port=-1 <<RemoteProgram|LocalProgram>> load Program

  options
    ------------------------------------------------
    -LocalPort  <<num>>       : Bind Port
                                if 0 is stdin/out
                                if -1 is program
    -LocalHost <<Hostname>>   : Bind Host
    -RemotePort <<num>>       : Redirect Port
                                if 0 is stdin/out
                                if -1 is program
    -RemoteHost <<Hostname>>  : Redirect Host
    ------------------------------------------------
    -[Local|Remote]SourceHost <<Hostname>>  : Source Host
    -[Local|Remote]SourcePort <<num>>       : Source Port
    ------------------------------------------------
    -[Local|Remote]UDP        : Local/Remote Protocol is UDP
    -[Local|Remote]RMI        : Local/Remote Protocol is RMI
                             SET CLASSPATH=%CLASSPATH%;.
                             START /min rmiregistry.exe
                            or
                             START /min rmiregistry.exe <<port>>
                                                 (default RMIPort is 1099
    -[Local|Remote]CORBA      : Local/Remote Protocol is CORBA
                             START /min orbd.exe -ORBInitialPort <<port>>
                                                 (default ORBInitialPort is 1050
    -[Local|Remote]ObjectName <<String>>      : RMI/CORBA RemoteID
                                                 (default StreamRelay)
    -[Local|Remote]Heartbeat  : RMI/CORBA Heartbeat is trues
    ------------------------------------------------
    -[Local|Remote]Program <<Program>>        : Bind Program
    -[Local|Remote]Environment <<name=value>> : Environment for Bind Program
    -[Local|Remote]TempDir <<path>>           : Temporary Directory
                                                            for Bind Program
    ------------------------------------------------
    -[Local|Remote]InputFile <<FileName>>  : if Port=0 stdin redirect to file
    -[Local|Remote]OutputFile <<FileName>> : if Port=0 stdout redirect to file
    -[Local|Remote]InputMic                : if Port=0 stdin redirect to microphone
    -[Local|Remote]OutputSpeaker           : if Port=0 stdout redirect to speaker
    -[Local|Remote]InputUrlFile <<url>>    : if Port=0 stdin redirect to http[s]://user:pass@host:port/path?query#options&options...
    -[Local|Remote]OutputUrlFile <<url>>
                                              checkcert
                                              header=name:value
                                              post=<<postedFile(HTTPMethod=POST{default})>> (Download Only,Upload is RequestBody is StreamData)
                                              ProxyHost=<<host>>
                                              ProxyPort=<<port>>
                                              ProxySocks : ProxyType is SOCKS
                                              ProxyHttp  : ProxyType is HTTP
                                              UseSSL2    : >SSL2
                                              UseSSL3    : >SSL3.0
                                              UseTLS10   : >TLS1.0
                                              UseTLS11   : >TLS1.1
                                              UseTLS12   : >TLS1.2
                                              UseWeakAlgorithm
                                              DisableTlsSni
                                              CheckCert  : defaul NoCheck
                                              AutoRedirect
                                              TempMem  (Upload Only, useMemoryBuffuring)
                                              TempFile (Upload Only, useTemporaryFileBuffuring)
                                              Method=[POST|GET|HEAD|OPTIONS|PUT|DELETE|TRACE]
                                                Downlaod Default is GET
                                                  Uplaod Default is PUT
    ------------------------------------------------
    -RemoteSSL                : Redirect is SSL Server
    -RemoteSSLAfterProxyConnection : Redirect is SSL Server
                                     (After Proxy Connection)(-Proxy option)
    -RemoteSSLMode [SSL|TLS]  : SSL mode OR TLS mode
                             (default TLS mode)
    -RemoteSSLName <<FQDN>> : Set Check SSL RemoteCommonName
    -DisableSNI             : Disable TLS SNI Java7
    -UseWeakAlgorithm       : Use Weak Algorithm ristricted Java7
    -UseAllSSLProtocols               : Use All SSL Protocol
    -UseSSLProtocol <<protocol>>      : Use SSL Protocol
    -RistrictSSLProtocol <<protocol>> : Ristrict SSL Protocol
    -ListSSLProtocol                  : Listing SSL Protocol
    -UseAllSSLCipherSuites            : Use All SSL Cipher Suite
    -UseSSLCipherSuites <<name>>      : Use SSL Cipher Suite
    -RistrictSSLCipherSuite <<name>>  : Ristrict SSL Cipher Suite
    -ListSSLCipherSuite               : Listing SSL CipherSuite Algorithm
    -RemoteProxy            : HTTP ProxyMode (recommend "-RemoteSSL")
    ------------------------------------------------
    ------------------------------------------------
    -Proxy [uri]      : setting Proxy Server
           "Socks4://[<username>@]<host>:<port>"
           "Socks4a://[<username>@]<host>:<port>"
           "Socks5://[<username>[:<password>]@]<host>:<port>"
           "CONNECT://[<username>[:<password>]@]<host>:<port>"
           "SSH://[<username>[:<password>]@]<host>:<port>[/[SecretKeyFilePath]]"
           "JavaStream://[<OptionName>[=<OptionValue>]][,]...."
                  DH   : use DH Key Exchange
                  ECDH : use ECDH Key Exchange
                  Cipher=<name>
                  CipherKeyword=<password>
                  CipherKeywordFromGUI
                  CipherKeywordHashName=<name>
                  [Request|Response][BZIP|XZ|Pack200|LZ4]Compress
                  Request[Deflate|ZLIB]Compress[=<lv>[;SyncFlush]]
                  Response[Deflate|ZLIB]Compress
                  [Request|Response]GZIPCompress[=SyncFlush]
                  [Request|Response][Adler32|CRC32|CRC64|XXHash32|XXHash64]
                  [Request|Response]HashAlgorithm=<name>
                  [Request|Response]HMacAlgorithm=<name>;<key>
                  [Request|Response]HMacAlgorithmHex=<name>;<hex key>
                  [BZIP|XZ|Pack200|Lz4]Compress
                   = Request[BZIP|XZ|Pack200|Lz4]Compress,
                     Response[BZIP|XZ|Pack200|Lz4]Compress
                  [Deflate|ZLIB]Compress[=<lv>[,SyncFlush]]
                   = Request[Deflate|ZLIB]Compress[=<lv>[;SyncFlush]],
                     Response[Deflate|ZLIB]Compress
                  GZIPCompress[=SyncFlush]
                   = RequestGZIPCompress[=SyncFlush],
                     ResponseGZIPCompress
           "WebSocket://[<username>[:<password>]@][<host>[:<port>]][<URI>][?<OptionName>[=<OptionValue>]][,]...."
                  host=<hostname>
                  uri=<URI> (defaule:/)
                  method=<value> (defaule:GET)
                  Sec-WebSocket-Key=<base64encoded>
                  Sec-WebSocket-Key-Auto
                  Sec-WebSocket-Protocol=<chat/superchat>
                  Sec-WebSocket-Extensions=<string>
                  Origin=<value>
           "HTTP2://[<username>[:<password>]@][<host>[:<port>]][<URI>][?<OptionName>[=<OptionValue>]][,]...."
                  host=<hostname>
                  uri=<URI> (defaule:/)
                  method=<value> (defaule:GET)
                  HTTP2mode=<value(h2|h2c)> (defaule:h2c)
    Data Cipher Option
    -[Local|Remote]CipherAlgorithm <<name>>     : Chipher Algorithm
    -ListCipher                                 : Listing Cipher Algorithm
    -[Local|Remote]CipherPassword <<name>>         : Chipher Key
    -[Local|Remote]CipherPasswordFromGUI           : Chipher Key From InputDialog
    -[Local|Remote]CipherPasswordHashAlgorithm <<name>> : Hash Algorithm
                                                               for Chipher Key
               (ex.SHA-384,SHA-224,SHA-256,MD2,SHA,SHA-512,MD5,MD4)
    -[Local|Remote]AlgorithmParameters <<HexData>> : used Cipher's class
                                                               init() func
    -CalculateAlgorithmParameters                  : calculation
                                                       AlgorithmParameters
    -[Local|Remote]CipherDH                        : DH Key Exchange
    -[Local|Remote]CipherECDH                      : ECDH Key Exchange
    -[Local|Remote][Request|Response]HashAlgorithm <<name>>
    -[Local|Remote][Input|Output]HashAlgorithm <<name>>
                                                   : Stream Hash calc
    -ListHash                                      : Listing Hash Algorithm
    -ListHMAC                                      : Listing HMAC Algorithm
    -[Local|Remote][Request|Response]HMACAlgorithm <<name>> <<key>>
    -[Local|Remote][Input|Output]HMACAlgorithm <<name>>  <<key>>
    -[Local|Remote][Request|Response]HMACAlgorithmHex <<name>> <<hex key>>
    -[Local|Remote][Input|Output]HMACAlgorithmHex <<name>>  <<hex key>>
                                                   : Stream HMAC calc
               (ex.PBEWITHHMACSHA512,PBEWITHHMACSHA224,PBEWITHHMACSHA256,HMACSHA384,PBEWITHHMACSHA384,HMACSHA256,HMACPBESHA1,HMACSHA224,HMACMD5,PBEWITHHMACSHA1,SSLMACSHA1,HMACSHA512,SSLMACMD5,HMACSHA1)
    -[Local|Remote][Request|Response][Adler32|CRC32|CRC64|XXHash32|XXHash64]
    -[Local|Remote][Input|Output][Adler32|CRC32|CRC64|XXHash32|XXHash64]
                                                   : Stream Checksum calc
    -[Local|Remote][Request|Response]Count : Stream Counting Bytes
    -[Local|Remote][Input|Output]Count     : Stream Counting Bytes
    ------------------------------------------------
    -[Local|Remote][Request|Response]AllHashAlgorithm
    -[Local|Remote][Input|Output]AllHashAlgorithm
                                 : Stream All Hash/CheckSum/Counting
    -[Local|Remote][Request|Response]AllHMACAlgorithm <<key>>
    -[Local|Remote][Input|Output]AllHMACAlgorithm <<key>>
    -[Local|Remote][Request|Response]AllHMACAlgorithmHex <<hex key>>
    -[Local|Remote][Input|Output]AllHMACAlgorithmHex <<hex key>>
                                 : Stream All Hash/CheckSum/Counting/Hmac
    ------------------------------------------------
    Data En/De-Coding Option
    -[Local|Remote][Request|Response][Base64|Base32|WebSocket[=[text|bin|mask[=<Hex>]]]]
    Data Compression Option
    -[Local|Remote][Request|Response][BZIP|Xz|Pack200|LZ4]Commpress
    -LocalRequest[deflate|ZLIB]Commpress]
    -LocalResponse[deflate|ZLIB]Commpress[=<lv>[;SyncFlush]]
    -RemoteRequest[deflate|ZLIB]Commpress[=<lv>[;SyncFlush]]
    -RemoteResponse[deflate|ZLIB]Commpress
    -LocalRequestGZIPCommpress
    -LocalResponseGZIPCommpress[=SyncFlush]
    -RemoteRequestGZIPCommpress[=SyncFlush]
    -RemoteResponseGZIPCommpress
    -[Local|Remote][BZIP|Xz|Pack200|LZ4]Commpress
    -[Local|Remote][deflate|ZLIB]Commpress[=<lv>[;SyncFlush]]
    -[Local|Remote]GZIPCommpress[=SyncFlush]
    ------------------------------------------------
    -DebugMode                        : Debug mode
    -Verbose/-VerboseMode             : Verbose mode
    -Verbosessl                       : SSL Verbose mode
    -Logging                          : DATA output to stdout
    -LoggingHex                       : DATA(Hex) output to stdout
    -LoggingFile <<FileName>>         : DATA output to <<File>>
    -LoggingCharset <<CharName>>      : DATA output by CharsetName
    -LoggingFileCharset <<CharName>>  : LoggingFile CharsetName
    ------------------------------------------------
    -AllowHalfOpen                    : HalfOpen Allowed
    -ZeroIO                           : Zero I/O
     only 0<LocalPort & 0=RemoteHost & NoRemoteInputFile
    ------------------------------------------------
    -NonBroadcast                     : Legacy mode ... (^_^;)
    -Broker                           : like chat
    ------------------------------------------------
    -ThreadInterval <<num>>           : ThreadInterval Time (ms)
                             (default 500(ms)
    -ConnectionLimit <<num>>          : Limit Connection
                             (default 0 is no limit)
    -BufferSize <<num>>               : InputStream Buffer Size (byte)
                             (default 1024 (byte)or(char counts)
    -ConnectedDelayTime <<(num)|(min-max)(,<<Randomize Option>>)>>
    -[Local|Remote]FragmentSize <<(num)|(min-max)(,<<Randomize Option>>)>>
    -[Local|Remote]FragmentInterval <<(num)|(min-max)(,<<Randomize Option>>)>>
        Randomize Option:
           SecureRandom : Use java.security.SecureRandom
           mtRandom     : Use Mersenne Twister Random
    -CRLF         : Lf=>CrLf
    -CRLFrequest  : Lf=>CrLf (only Request Message)
    -CRLFresponse : Lf=>CrLf (only Response Message)
    -LF           : CrLf=>Lf
    -LFrequest    : CrLf=>Lf (only Request Message)
    -LFresponse   : CrLf=>Lf (only Response Message)
    -[Local|Remote]Charset <<CharName>>                   : CharsetName
    -[Local|Remote][Request|Response]Charset <<CharName>> : CharsetName
    -ListCharset                : Display Charsets
    ------------------------------------------------
    -ScriptFile <<FileName>>          : ScriptFile
    -ScriptCharset <<CharName>>       : ScriptFile CharsetName
    -ScriptLanguage <<name>>          : ScriptLanguage
    -ListScriptLanguage               : Display ScriptLanguages
                             (default JavaScript)
    ------------------------------------------------
    -ConfigFile <<FileName>> : Configuration from File
    -GUI          : GUI mode
    -ListSetting  : Display VM Configuration
    ------------------------------------------------

  ex.
     java.exe StreamRelay -LocalPort 80 -RemoteHost www.example.com -RemotePort 443 -RemoteSSL
         -> like stunnel client mode
     java.exe StreamRelay -LocalPort 0 -RemoteHost www.example.com -RemotePort 80
         -> like netcat client mode
     java.exe StreamRelay -LocalPort 0 -RemoteHost www.example.com -RemotePort 80 -RemoteSSL
         -> like openssl client mode
     java.exe StreamRelay -LocalPort 90 -RemoteProgram cmd.exe -RemotePort -1
         -> like telnet server mode

                 This uses Apache Commons Compress ver1.17
                      http://commons.apache.org/proper/commons-compress/
                 This uses Apache Commons Cpdec ver1.11
                      http://commons.apache.org/proper/commons-codec/
                 This uses bzip2 library from Apache Ant
                      http://www.kohsuke.org/bzip2/
                 This uses Base64Coder - an open-source Base64 encoder/decoder in Java
                      http://www.source-code.biz/base64coder/java/
                 This uses XZ for Java ver1.8
                      http://tukaani.org/xz/java.html
                 This uses lz4-java ver1.4.1
                      https://github.com/lz4/lz4-java
                 This uses OpenJDK's MD4
                      http://hg.openjdk.java.net/jdk6/jdk6/jdk/file/2d585507a41b/src/share/classes/sun/security/provider/MD4.java
                 This uses Rabbit.java
                      https://gist.github.com/xSAVIKx/6783c424ee618ee8127e
                 This uses jsch ver1.50 customized
                      http://www.jcraft.com/jsch/
                 This uses Mersenne Twister
                      http://homepage2.nifty.com/mathpara/programing/MersenneTwister.htm



download
All files set
StreamRelay.lzh LZH file (1,442,523byte) (StreamRelay.lzh.base64)

ソースの説明

省略


付属ツール

SoundFormatChange
サウンドの入出力は、PCM 固定の Raw データであるため、一般的なサウンド・プレーヤーで再生するための音声フォーマット(au形式)の変換を行う
java.exe SoundFormatChange 《InputFile(PCM)》 《OutputFile(au)》


ZipStream
Zip アーカイブ内部の特定のファイルと標準入出力を結びつける
つまり という機能を有する
java.exe ZipStream list 《ZipFile》 [-v]
java.exe ZipStream read 《ZipFile》 《File》
java.exe ZipStream write 《ZipFile》 《File》
java.exe ZipStream read 《ZipFile》 《File》 > 《File》
type 《File》 | java.exe ZipStream write 《ZipFile》 《File》
java.exe ZipStream write 《ZipFile》 《File》 < 《File》


ArchiveStream
アーカイブ内部の特定のファイルと標準入出力を結びつける
つまり という機能を有する
ArchiveStream.bat 《cpio|tar|ar|zip|arj|7z|lha》 list 《ArcFile》 [-v]
ArchiveStream.bat 《cpio|tar|ar|zip|arj|7z|lha》 read 《ArcFile》 《File》
ArchiveStream.bat 《cpio|tar|ar|zip|arj|7z|lha》 write 《ArcFile》 《File》
ArchiveStream.bat 《cpio|tar|ar|zip|arj|7z|lha》 read 《ArcFile》 《File》 > 《File》
type 《File》 | ArchiveStream.bat 《cpio|tar|ar|zip|arj|7z|lha》 write 《ArcFile》 《File》
ArchiveStream.bat 《cpio|tar|ar|zip|arj|7z|lha》 write 《ArcFile》 《File》 < 《File》





.NET Framewrk 版

ここ


Qiita に記事他を書いた

二つのストリームで双方向で通信するツール「StreamRelay.NET.exe」と「StreamRelay.jar」


mail to active@window.goukaku.com