前言 在前天的沙龙上,师傅们积极探讨,期间提出了一些关于app抓包的相关问题。在此小小的总结一波有关的分析以及解决办法。 检测代理 首先是当设置手机代理后,APP无法获取网络数据。会出现无法连接网络的情况出现。这就说明app设置了代理检测。常见的检测代码如下 public static boolean isWifiProxy(Context context) { final boolean IS_ICS_OR_LATER = Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH; String proxyAddress; int proxyPort; if (IS_ICS_OR_LATER) { proxyAddress = System.getProperty("http.proxyHost"); //获取代理主机 String portStr = System.getProperty("http.proxyPort"); //获取代理端口 proxyPort = Integer.parseInt((portStr != null ? portStr : "-1")); } else { proxyAddress = android.net.Proxy.getHost(context); proxyPort = android.net.Proxy.getPort(context); } Log.i("代理信息","proxyAddress :"+proxyAddress + "prot : " proxyPort") return (!TextUtils.isEmpty(proxyAddress)) && (proxyPort != -1); } 此时可以利用postern等工具,进行全局的流量转发,跳过代理检测。另外的方法就是反编译app,进行hook或者是直接修改smali代码重打包。关于修改smali代码这个也很适用于Android7以上,系统不再信任用户级的证书,只信任系统级的证书。换一条路,不改证书,改app也是可以达到这个效果。 No Proxy 其次就是通信协议代码中使用了proxy(Proxy.NO_PROXY),即使是设置了代理也是会被绕过的。此时是网络可以正常使用,但是就是抓不到包。这时候可能就是这个原因了。 public void run() { Looper.prepare(); OkHttpClient okHttpClient = new OkHttpClient.Builder(). proxy(Proxy.NO_PROXY). //使用此参数,可绕过系统代理直接发包 build(); Request request = new Request.Builder() .url("http://www.baidu.com") .build(); Response response = null; try { response = okHttpClient.newCall(request).execute(); Toast.makeText(this, Objects.requireNonNull(response.body()).string(), Toast.LENGTH_SHORT).show(); } catch (IOException e) { e.printStackTrace(); } Looper.loop(); }
public static boolean isWifiProxy(Context context) { final boolean IS_ICS_OR_LATER = Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH; String proxyAddress; int proxyPort; if (IS_ICS_OR_LATER) { proxyAddress = System.getProperty("http.proxyHost"); //获取代理主机 String portStr = System.getProperty("http.proxyPort"); //获取代理端口 proxyPort = Integer.parseInt((portStr != null ? portStr : "-1")); } else { proxyAddress = android.net.Proxy.getHost(context); proxyPort = android.net.Proxy.getPort(context); } Log.i("代理信息","proxyAddress :"+proxyAddress + "prot : " proxyPort") return (!TextUtils.isEmpty(proxyAddress)) && (proxyPort != -1); }
public void run() { Looper.prepare(); OkHttpClient okHttpClient = new OkHttpClient.Builder(). proxy(Proxy.NO_PROXY). //使用此参数,可绕过系统代理直接发包 build(); Request request = new Request.Builder() .url("http://www.baidu.com") .build(); Response response = null; try { response = okHttpClient.newCall(request).execute(); Toast.makeText(this, Objects.requireNonNull(response.body()).string(), Toast.LENGTH_SHORT).show(); } catch (IOException e) { e.printStackTrace(); } Looper.loop(); }
此时也是可以使用全局系统代理工具,如HttpCanary等工具进行绕过,或者是直接hook该方法。 SSL Pinning证书锁定 抓包时,无法连接网络并且也接收不到任何数据 将APP代码内置仅接受指定域名的证书,而不接受操作系统或者浏览器内置的CA根证书对应的任何证书。通过这种授权方式,保障了APP与服务端通信的唯一性和安全性,因此移动端APP与服务端(例如API网关)之间的通信可以保证绝对的安全。 这种方法有多种实现,比如说开发者将SSL证书的某些字节码硬编码在APP中。当应用程序与服务器通信时,它将检查证书中是否存在相同的字节码。如果存在,则应用程序将请求发送到服务器。如果字节码不匹配,它将抛出SSL证书错误。此技术可防止攻击者使用自己的自签名证书。 这个时候就需要往抓包工具中导入app的证书, 通常在assets文件夹中,.p12 .pem .cer。 然后再hook。不过此时要对抗混淆。 搬运之前的文章https://www.52pojie.cn/thread-1405170-1-1.html 总结 其次最强工具目前就是肉丝师傅的r0capture。 可以通杀任何抓包问题。让天底下没有抓不到的包。在之前的文章中,也提供了一份frida的justTrustme的脚本,可以hook常见的通信协议的代理检测。大家可以用一下测试一下。 最后,求赞求赞求赞! 😃
推荐一个工具可以应对双向认证证书加密的问题https://github.com/CreditTone/hooker 其中的keystore_dump.js可以hook。原理是hook java.security.KeyStore的getPrivateKey和getCertificate方法,因为客户端向服务发送证书必调这个方法。
牛呀 大师傅
yyds