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