APP抓包问题总结及常见绕过方法
前言
在前天的沙龙上,师傅们积极探讨,期间提出了一些关于app抓包的相关问题。在此小小的总结一波有关的分析以及解决办法。
01 检测代理
首先是当设置手机代理后,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也是可以达到这个效果。
02 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();}
此时也是可以使用全局系统代理工具,如HttpCanary等工具进行绕过,或者是直接hook该方法。
03 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常见的通信协议的代理检测。大家可以用一下测试一下。
