Избегайте человека посередине (прокси) Android

У меня есть задача на моей работе реконструировать приложение.

Я без проблем использовал 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, это сработало, но информация зашифрована, как и ожидалось, так что это не так. много пользы.

Любая помощь будет оценена по достоинству.


person M3rd0n    schedule 02.10.2013    source источник
comment
Пробовали ли вы прослушивать весь трафик, поступающий с вашего устройства? При этом, если вы серьезно относитесь к перехвату трафика из Android-приложения, вам лучше всего создать собственный дистрибутив Android, который включает в себя хуки для захвата того, что вы хотите, и запускать приложение в этой настраиваемой сборке (либо на реальное устройство или, что гораздо проще, в эмуляторе).   -  person mah    schedule 02.10.2013
comment
хм... да, думаю, я мог бы создать пользовательскую сборку, более сложное решение, чем то, на что я надеялся, но если больше ничего не работает... Но все же есть идеи, почему я не могу видеть трафик в Charles Proxy или Fiddler?   -  person M3rd0n    schedule 02.10.2013


Ответы (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 -> веб, 8021 -> веб-сокеты для chrome devtools
  2. запустить хром с ПК с URL-адресом http your_device_ip:8020
  3. Проверьте вкладку «Подключение», последние два столбца — это идентификатор процесса и имена (может быть более одного)

Для сбора данных вы также можете использовать SandroProxy и принудительно перенаправлять iptable. Вам понадобится рутированный телефон.

Кстати: отправить через поддержку sandroproxy :)

person SandroProxy support    schedule 02.10.2013
comment
Привет, спасибо, вы правы, это прямой прокси-сервер, поэтому я не смог отслеживать трафик, я уже заставил его работать с некоторыми другими инструментами, но я могу отслеживать только зашифрованный трафик, есть ли способ можно настроить sandroproxy для человека посередине? - person M3rd0n; 06.10.2013
comment
Да. Включите захват данных, прозрачный прокси в настройках. Также активируйте правила iptable на вкладке «Приложение». Чтобы перехватить ssl, вы также должны импортировать сертификат SandroProxy ca в хранилище сертификатов android os с помощью Menu->Export CA. Затем вы можете отслеживать трафик на вкладке Http или в хроме на панели «Сеть». - person SandroProxy support; 06.10.2013
comment
извините за поздний ответ, другие задачи были приоритетными до этого. В любом случае. Есть ли у вас какие-либо советы о том, как мне настроить iptables? Приложение использует исходящий порт 4710 и входящий (случайный порт) на адрес, скажем, 111.111.111.111. Как настроить iptables, чтобы он подключался через SandroProxy? кран APPS, кажется, не работает, думаю, это потому, что соединение использует порт 4710? Если это сработает, я дам вам немного пива в качестве пожертвования :) - person M3rd0n; 14.10.2013
comment
iptables -t nat -I ВЫВОД -m владелец! --uid-owner 10062 -p tcp --dport 4710 -j DNAT --to 127.0.0.1:8010 -›где uid-owner(10062) — это uid процесса для sandroproxy. его необходимо исключить, чтобы он мог подключиться к реальному 4710. Возможно, вам также понадобятся настройки-сертификат CA->[Доверять всем SSL-сертификатам], если на сервере есть какой-то ненадежный ca. Наверное какая-то новая версия сандропрокси будет иметь еще и кастомное перенаправление портов, а не только 443 и 80. о каком пиве идет речь? :) - person SandroProxy support; 14.10.2013

Вы можете попробовать использовать что-то вроде adb forward 80 3456 для устройства или эмулятора, чтобы весь трафик порта 80 перенаправлялся на 3456 на вашей рабочей станции. Затем пусть ваш прокси прослушивает этот порт.

person WMIF    schedule 03.10.2013