2013-10-02 2 views
1

제 업무에서 응용 프로그램을 리버스 엔지니어링하는 작업이 있습니다.중간에 사람을 피하십시오. (안드로이드)

다른 응용 프로그램과 함께 Charles Proxy 번을 아무런 문제없이 여러 번 사용했으며 Fiddler도 시도했습니다. 나는 항상 요청/응답을 모니터 할 수있었습니다.

하지만 지금 시도하고있는 응용 프로그램은 Charles 또는 Fiddler의 활동을 보여줍니다. 처음에는 인증서를 확인하고 연결을 끊지 만 응용 프로그램은 딸꾹질없이 정상적으로 작동한다고 생각했습니다.

응용 프로그램이 프록시 설정을 피할 수있는 방법이 있습니까? 무엇이 누락 되었습니까?

저는 apktooldex2jar을 사용하여이 코드를 발견했습니다. 아마 100 % 정확하지는 않지만 일어난 일에 대한 단서를 줄 수 있습니다.

public final void a(int paramInt1, int paramInt2) 
    { 
    this.b = paramInt2; 
    InetSocketAddress localInetSocketAddress = new InetSocketAddress(InetAddress.getByName(this.a), this.b); 
    while (true) 
    { 
     try 
     { 
     SSLContext localSSLContext = SSLContext.getInstance("TLS"); 
     X509TrustManager[] arrayOfX509TrustManager = new X509TrustManager[1]; 
     arrayOfX509TrustManager[0] = new c(this); 
     localSSLContext.init(null, arrayOfX509TrustManager, new SecureRandom()); 
     this.e = ((SSLSocket)localSSLContext.getSocketFactory().createSocket()); 
     this.e.connect(localInetSocketAddress, paramInt1); 
     this.d.clear(); 
     if (Arrays.asList(this.e.getSupportedProtocols()).contains("TLSv1.2")) 
     { 
      this.d.add("TLSv1.2"); 
      String[] arrayOfString1 = (String[])this.d.toArray(new String[this.d.size()]); 
      SSLSocket localSSLSocket1 = this.e; 
      if (arrayOfString1.length > 0) 
      localSSLSocket1.setEnabledProtocols(arrayOfString1); 
      this.c.clear(); 
      if (!Arrays.asList(this.e.getSupportedCipherSuites()).contains("TLS_RSA_WITH_AES_256_CBC_SHA")) 
      break label374; 
      this.c.add("TLS_RSA_WITH_AES_256_CBC_SHA"); 
      String[] arrayOfString2 = (String[])this.c.toArray(new String[this.c.size()]); 
      SSLSocket localSSLSocket2 = this.e; 
      if (arrayOfString2.length > 0) 
      localSSLSocket2.setEnabledCipherSuites(arrayOfString2); 
      e.a().a(this.e.getLocalAddress().getAddress()); 
      e.a().a(this.e.getLocalPort()); 
      a(5000); 
      this.e.startHandshake(); 
      a(0); 
      return; 
     } 
     } 
     catch (Exception localException) 
     { 
     throw new IOException(localException.toString()); 
     } 
     if (Arrays.asList(this.e.getSupportedProtocols()).contains("TLSv1.1")) 
     { 
     this.d.add("TLSv1.1"); 
     } 
     else if (Arrays.asList(this.e.getSupportedProtocols()).contains("TLSv1")) 
     { 
     this.d.add("TLSv1"); 
     continue; 
     label374: if (Arrays.asList(this.e.getSupportedCipherSuites()).contains("TLS_RSA_WITH_AES_128_CBC_SHA")) 
      this.c.add("TLS_RSA_WITH_AES_128_CBC_SHA"); 
     else if (Arrays.asList(this.e.getSupportedCipherSuites()).contains("SSL_RSA_WITH_3DES_EDE_CBC_SHA")) 
      this.c.add("SSL_RSA_WITH_3DES_EDE_CBC_SHA"); 
     else if (Arrays.asList(this.e.getSupportedCipherSuites()).contains("DES-CBC3-SHA")) 
      this.c.add("DES-CBC3-SHA"); 
     } 
    } 
    } 

TLS 1.2에 대해 많이 알지는 못하지만 좀 더 견고하다는 것을 알고 있습니까? 하지만 프록시를 피할 수 있습니까?

나는 또한 작동 한 Wireshark을 사용하여 트래픽을 버렸지 만 정보는 예상대로 암호화되어 있으므로별로 사용하지 않습니다.

도움을 주시면 감사하겠습니다.

+0

기기에서 오는 모든 트래픽을 스니핑 했습니까? 즉, 안드로이드 앱에서 트래픽을 가로채는 것을 진지하게 생각한다면 원하는 것을 포착 할 수있는 후크가 포함 된 나만의 안드로이드 배포판을 만들고 그 맞춤 빌드로 애플리케이션을 실행하는 것이 가장 좋습니다. 실제 장치 또는 훨씬 쉽게, 에뮬레이터에서). – mah

+0

흠 ... 네, 맞춤 빌드를 할 수있을 것 같아요. 내가 원하는 것보다 더 복잡한 해결책이 될 수는 있겠지만, 아무 것도 작동하지 않는다면 ...하지만 찰스 프록시 나 피들러에서 트래픽을 볼 수없는 이유는 무엇입니까? – M3rd0n

답변

2

이 코드는 직접 소켓을 만들기 때문에 프록시를 피할 것입니다. HttpURLConnection과 같은 상위 API를 사용하고 있다면 프록시 설정을 존중합니다. http://developer.android.com/reference/java/net/HttpURLConnection.html

SandroProxy를 사용하여 어떤 포트에서 통신이 이루어지는 지 확인할 수 있습니다. > 웹, 8021 - - 크롬 DevTools로 PC에서

  • 시작 크롬에 대한> WebSocket을 SandroProxy는 두 개의 새로운 포트 8020에서 수신합니다

    http://code.google.com/p/sandrop/issues/detail?id=76

    1. HTTP 탭으로 이동하여 대가는 acction 줄 에 재생 버튼을 URL의 HTTP your_device_ip : 8020
    2. 확인 연결 탭, 마지막 두 열은 프로세스 UID와 이름이

    으로 (이상 하나가 될 수 있습니다)입니다 데이터를 캡처 할 때 SandroProxy를 사용하고 iptable 리디렉션을 강제 실행할 수도 있습니다. 루팅 된 전화가 필요합니다.

    은 BTW :

  • +0

    안녕하세요, 고마워요, 당신의 권리, 그건 직접 프록시 그래서 내가 트래픽을 모니터링 할 수 없었어요, 내가 다른 도구와 함께 작동하도록 이미 가지고 있지만 난 단지 암호화 된 트래픽을 모니터 할 수있는 방법이 있습니다 중간에 남자를 위해 샌드 프로 프록을 구성 할 수 있습니까? – M3rd0n

    +0

    예. 캡처 데이터, 투명 프록시 설정을 사용합니다. 또한 App 탭에서 iptable 규칙을 활성화하십시오. ssl을 가로 채려면 메뉴 -> 내보내기 CA를 사용하여 SandroProxy CA 인증서를 android os cert store로 가져와야합니다. 그런 다음 Http 탭이나 네트워크 패널의 크롬에서 트래픽을 모니터링 할 수 있습니다. –

    +0

    최근 응답이 늦어지기 때문에 다른 작업이이보다 먼저 우선 순위가 지정되었습니다. 어쨌든. 내가 어떻게 iptables를 설정해야하는지에 대한 조언이 있습니까? 응용 프로그램은 발신 포트 4710과 수신 주소 (임의의 포트)를 사용하여 111.111.111.111을 말합니다. iptables를 설정하여 SandroProxy를 통해 연결할 수 있습니까? APPS 탭이 작동하지 않는 것 같습니다. 연결이 포트 4710을 사용하기 때문입니다. 이 작품은 기부에 꽤 많은 맥주를 줄 것이다 :) – M3rd0n

    0

    당신은 당신의 워크 스테이션에서 3456로 리디렉션 모든 포트 80 트래픽을 가지고 장치 또는 에뮬레이터에 대한 adb forward 80 3456 같은 것을 사용하여 시도 할 수 sandroproxy 지원 :)으로 보냅니다. 그런 다음 프록시가 해당 포트에서 청취하도록합니다.

    관련 문제