2016-09-03 4 views
2

토큰에 연결하기 위해 SOCKS 프록시가있는 Java 소켓을 사용하려고합니다 (Orbot를 사용 중이며 Tor 서비스가 포트 9050에서 실행 중입니다). 내가/System.out에이안드로이드 - Tor 서비스가 Socket을 사용하여 DNS 확인을 수행하도록하는 방법은 무엇입니까?

: 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); 

안드로이드는 아마도 네트워크 구성에 지정된 DNS 서버를 통해 DNS 확인을 수행하고 니온 주소는 작동하지 않습니다.

Tor 서비스가 DNS 확인을 수행하도록 지정하려면 어떻게해야합니까 (Tor는 일반적으로 TCP 패킷에서 호스트 이름을 처리합니다)?

+0

행운을 빕니다 일부 집중적 인 검색 및 운동을! –

+0

@Am_I_Helpful 추가 정보가 있습니까? 나는 자바 dns 해결 함수를 reimplementing에 대해 생각하고 있었지만, 더 간단한 해결책이 있기를 바란다. :) –

+0

이것을 달성하기 위해 아마 자바에서 dns-resolution을 다시 구현해야 할 것이다! 나는 구출 할 API가 없다고 생각합니다. 행운을 빕니다 ... –

답변

0

해결되지 않은 소켓을 Orbot 라이브러리에 전달해야합니다. 그것은 다음과 같이 작성해야합니다 : 그런데

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

, 당신은 아파치의 세션 객체를 사용하는 경우, 당신은 샘플 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