避免男人在中间(代理)Android

时间:2013-10-02 11:11:08

标签: android ssl proxy reverse-engineering man-in-the-middle

我的工作任务是对应用程序进行逆向工程。

我已经多次使用Charles Proxy与其他应用程序没有任何问题,并且还尝试了Fiddler。我一直能够监控所做的请求/回复。

但我现在正在尝试的应用程序现在显示CharlesFiddler中的任何活动。首先,我认为他们检查证书并终止连接,但应用程序正常工作,没有任何打嗝。

应用程序是否有办法避免代理设置或我缺少什么?

我一直在使用apktool以及dex2jar,并发现了这种代码的和平。可能不是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转储了流量,但是信息是按预期加密的,所以它没有多大用处。

任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:2)

此代码可能会避免代理,因为它是直接套接字。如果你正在使用一些更高级别的api,比如HttpURLConnection,它会尊重代理设置。 http://developer.android.com/reference/java/net/HttpURLConnection.html

您可以尝试使用SandroProxy查找进行的端口通信。

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

  1. 转到操作栏上的HTTP选项卡和预播放按钮 SandroProxy将收听两个新端口8020 - > web,8021 - > chrome devtools的websockets
  2. 使用网址http your your_device_ip:8020
  3. 从PC启动Chrome
  4. 检查连接选项卡,最后两列是流程uid和名称(可以是多个)
  5. 要捕获数据,您还可以使用SandroProxy并强制iptable重定向。你需要root电话。

    btw:通过sandroproxy支持发送:)

答案 1 :(得分:0)

您可以尝试对设备或模拟器使用类似adb forward 80 3456的内容,以便将所有端口80流量重定向到工作站上的3456。然后让你的代理人听那个端口。