2013-10-02 19 views
1

我在我的工作中得到了一項任務來逆向工程應用程序。避免在中間的人(代理)Android

我一直使用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,這工作,但信息加密,如預期,所以它沒有太多的使用。

任何幫助,將不勝感激。

+0

你試過嗅探來自你的設備的所有流量?話雖如此,如果您認真對待攔截來自Android應用程序的流量,最好爲您構建自己的Android發行版,其中包含可捕獲所需內容的掛鉤,並在該自定義構建下運行應用程序(在真實的設備,或者更容易,在模擬器中)。 – mah

+0

嗯......是的,我猜想我可以自定義構建,比我希望的更復雜的解決方案,但如果沒有其他工作......但仍然有任何想法,爲什麼我不能看到在查爾斯代理或提琴手的流量? – M3rd0n

回答

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選項卡,並PRES發揮acction酒吧 按鈕SandroProxy會監聽兩個新的端口8020 - >網絡,8021 - 鍍鉻devtools從PC
  2. 開始鑲邊>的WebSockets網址HTTP your_device_ip:8020
  3. 檢查連接選項卡,最後兩列是進程UID和名稱(可以是多個)

要捕獲數據,你也可以使用SandroProxy並強制iptable重定向。你將需要植根於手機。

BTW:由sandroproxy支持:)發送

+0

嗨,您好,這是一個直接代理,所以這就是爲什麼我一直無法監控流量,我已經與其他工具一起工作,但我只能監控加密流量,有沒有辦法我可以在中間爲男性配置sandroproxy? – M3rd0n

+0

是的。在設置中啓用捕獲數據,透明代理。同時在App選項卡中激活iptable規則。要攔截ssl,您還應該使用Menu-> Export CA將SandroProxy ca證書導入到android os證書商店。然後,您可以在網絡面板 –

+0

中監控Http選項卡或Chrome中的流量以進行遲到響應,其他任務在此之前已被優先處理。無論如何。你有關於如何設置iptables的提示嗎?應用程序使用傳出端口4710和傳入(隨機端口)到一個地址,可以說111.111.111.111。我如何設置iptables使其通過SandroProxy連接?應用程序水龍頭似乎不工作,猜測它是因爲連接使用端口4710?如果這個工程,我會給你一個不少啤酒在捐贈:) – M3rd0n

0

你可以嘗試使用像adb forward 80 3456對設備或模擬器的東西都重定向到3456工作站上的所有端口80的流量。然後讓您的代理在該端口上偵聽。