2016-09-03 11 views
2

は、私は(私はORBOTを使用していますが、Torのサービスがポート9050で実行されている)のTorに接続するためにSOCKSプロキシを使用してJavaソケットを使用します。Android - TorサービスがSocketを使用してDNS解決を実行する方法

I /のSystem.out:

私はエラーを得たjava.net.UnknownHostExceptionを発行:ホストが未解決である: 3g2upl4pq6kufc4m.onion

私のコードは次の通りである:

// setup proxy 
address = new InetSocketAddress('localhost', 9050); 
proxy = new java.net.Proxy(java.net.Proxy.Type.SOCKS,address); 
// setup socket 
client = new Socket(proxy); 
inet = new InetSocketAddress("3g2upl4pq6kufc4m.onion", 80); 
// connect 
client.connect(inet); 

Androidは、おそらくDNSのネットワーク構成で指定されたサーバとoの解像度を経由してDNS解決を実行しますので、これは、正当なものですNionアドレスは機能しません。

どのように私は(Torは通常、TCPパケットからホスト名を処理します)Torのサービスは、DNS解決を実行するためにできるように指定するのですか?

+0

グッドラックいくつかの集中的な検索や運動をしている私たちはここのようなソックス自分自身を実装する必要が回避策として

! –

+0

@Am_I_Helpfulさらに詳しい情報がありますか?私は、Java DDL解決機能を再実装することを考えていましたが、もっと簡単な解決方法があることを願っています:) –

+0

これを達成するには、おそらくJavaでdns-resolutionを再実装する必要があります。私は救助になるAPIはないと思います。幸運... –

答えて

0

あなたはORBOTライブラリに、未解決のソケットを渡す必要があります。それは、次のように作成する必要があります。ところで

InetSocketAddress unresolvedRemote = InetSocketAddress. 
createUnresolved(host.getHostName(), remoteAddress.getPort()); 

、あなたがApacheのHttpClientをを使用する場合は、サンプルhereを見つけることができます。

+0

これにより、未解決のホストの例外が発生します。 – palindrom

1

これを行うための正しい方法はInetSocketAddress.createUnresolved(...)メソッドを使用することですが、これは、Android上の例外をスローします。 http://www.mit.edu/~foley/TinFoil/src/tinfoil/TorLib.java

説明はここにある:https://github.com/acomminos/OnionKit/blob/master/libnetcipher/src/info/guardianproject/onionkit/proxy/SocksProxyClientConnOperator.java

基本的には:

 socket = new Socket(); 
     socket.setSoTimeout(READ_TIMEOUT_MILLISECONDS); 
     socket.connect(new InetSocketAddress(mProxyHost, mProxyPort), CONNECT_TIMEOUT_MILLISECONDS); 

     DataOutputStream outputStream = new DataOutputStream(socket.getOutputStream()); 
     outputStream.write((byte)0x04); 
     outputStream.write((byte)0x01); 
     outputStream.writeShort((short)port); 
     outputStream.writeInt(0x01); 
     outputStream.write((byte)0x00); 
     outputStream.write(host.getBytes()); 
     outputStream.write((byte)0x00); 

     DataInputStream inputStream = new DataInputStream(socket.getInputStream()); 
     if (inputStream.readByte() != (byte)0x00 || inputStream.readByte() != (byte)0x5a) { 
      throw new IOException("SOCKS4a connect failed"); 
     } 
     inputStream.readShort(); 
     inputStream.readInt(); 
     //socket is ready to use 
関連する問題