huolong blog

Android抓包对抗

Android抓包原理

Android抓包的原理其实和中间人攻击的原理差不多,用下面一张图概括一下: 经过这么一通操作后中间人与客户端建立了一个加密连接,也与服务器建立了一个加密连接,中间的流量内容是什么便一清二楚了。

反抓包第一计,找代理

应用想要知道自己是不是处于一个被抓包的环境,最容易的方法就是查找有没有代理的存在。

检测WiFi代理

通过配置WiFi代理,并将抓包软件的证书以magisk模块的方式安装到系统中,就可以抓Android应用的数据包。相关的Java层API如下:

  • Proxy.getDefaultHost
  • ConnectivityManager.getDefaultProxy
  • System.getProperty(“http.proxyHost”)
private void getWiFiProxyStatus() {  
    ConnectivityManager cm = (ConnectivityManager) getSystemService(Service.CONNECTIVITY_SERVICE);  
    NetworkInfo activeNetworkInfo = cm.getActiveNetworkInfo();  
    if(activeNetworkInfo!=null &&activeNetworkInfo.isConnected())  
    {  
        Log.d(TAG, "getWiFiProxyStatus: "+ activeNetworkInfo.getTypeName());  
        Log.d(TAG, "getWiFiProxyStatus: Host: " + Proxy.getDefaultHost()+ " Port: " +Proxy.getDefaultPort());  
        if(cm.getDefaultProxy() != null)  
            Log.d(TAG, "getWiFiProxyStatus: Host: " + cm.getDefaultProxy().getHost() + " Port: " + cm.getDefaultProxy().getPort());  
        Log.d(TAG, "getWiFiProxyStatus: Host: "+ System.getProperty("http.proxyHost")+" Port: "+ System.getProperty("http.proxyPort"));  
    }  
}

值得注意的是第一种方法和第三种方法其实是重复的,Proxy.getDefaultHost方法内部其实调用了System.getProperty("http.proxyHost")

检测VPN存在

除了通过配置WiFi代理进行抓包,很多情况下还会通过VPN协议将流量发送到中间人进行抓包,因此检测VPN是否存在也是一种反抓包的方法。相关的Java层API如下:

  • ConnectivityManager.getNetworkInfo(17).isConnected()
  • ConnectivityManager.getNetworkCapabilities(cm.getActiveNetwork()).hasTransport(NetworkCapabilities.TRANSPORT_VPN)
  • ConnectivityManager.getActiveNetworkInfo().getType()==cm.TYPE_VPN
  • NetworkInterface.getNetworkInterfaces()
private void getVPNStatus() {  
    ConnectivityManager cm = (ConnectivityManager) getSystemService(Service.CONNECTIVITY_SERVICE);  
    Log.d(TAG, "getVPNStatus: "+ cm.getNetworkInfo(17).isConnected());  
    Log.d(TAG, "getVPNStatus: Transport VPN: " + cm.getNetworkCapabilities(cm.getActiveNetwork()).hasTransport(NetworkCapabilities.TRANSPORT_VPN));  
    Log.d(TAG, "getVPNStatus: TYPE_VPN: "+ (cm.getActiveNetworkInfo().getType()==cm.TYPE_VPN));  
  
    try {  
        Enumeration<NetworkInterface> networkInterfaces = NetworkInterface.getNetworkInterfaces();  
		  \\ 枚举网卡,如果存在tun0或ppp0,可能存在VPN
        while (networkInterfaces.hasMoreElements()) {  
            NetworkInterface networkInterface = networkInterfaces.nextElement();  
            if(networkInterface.toString().contains("ppp") || networkInterface.toString().contains("tun"))  
                Log.d(TAG, "getVPNStatus: networkInterface: true");  
        }  
    } catch (Exception e) {  
        e.printStackTrace();  
    }  
}

反抓包第二计,判证书

在Android抓包原理图中我们可以发现,中间人会将自己的证书发给客户端,客户端可以通过判断证书的合法性来判断是否处于被抓包的状态。