1

仕事で、アプリケーションをリバース エンジニアリングする仕事がありました。

私はCharles Proxyを他のアプリケーションで問題なく数回使用しており、 Fiddlerも試しました。私は常にリクエスト/レスポンスを監視することができました。

しかし、私が今試しているアプリケーションでは、CharlesまたはFiddlerのいずれかでアクティビティが表示されるようになりました。最初は、証明書をチェックして接続を切断すると思っていましたが、アプリケーションは問題なく正常に動作します。

アプリケーションがプロキシ設定を回避できる方法はありますか、または何が欠けていますか?

私は 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を使用してトラフィックをダンプしましたが、これは機能しましたが、期待どおりに情報が暗号化されているため、あまり役に立ちません。

どんな助けでも大歓迎です。

4

2 に答える 2

2

このコードは、直接ソケットを作成しているため、おそらくプロキシを回避します。HttpURLConnection などの上位レベルの API を使用している場合は、プロキシ設定が考慮されます。 http://developer.android.com/reference/java/net/HttpURLConnection.html

SandroProxy を使用して、どのポートで通信が行われているかを調べることができます。

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

  1. HTTP タブに移動し、アクション バーの事前再生ボタン SandroProxy は、2 つの新しいポート 8020 -> web 、8021 -> chrome devtools の websockets でリッスンします。
  2. URL http your_device_ip:8020 を使用して PC から Chrome を起動します。
  3. [接続] タブを確認します。最後の 2 列はプロセスの uid と名前です (複数の場合があります)。

データをキャプチャするには、SandroProxy を使用して iptable リダイレクトを強制することもできます。root化された電話が必要です。

ところで:サンドロプロキシサポートで送信:)

于 2013-10-02T17:58:52.527 に答える