专栏名称: 安全客
打破黑箱 客说安全
目录
相关文章推荐
生信人  ·  抓紧上车,焦亡巨噬细胞 ·  2 天前  
生信人  ·  动态演变:从癌前病变到侵袭性肺腺癌 ·  3 天前  
生物学霸  ·  细胞内物质提取,7 ... ·  2 天前  
BioArt  ·  Nat ... ·  2 天前  
BioArt  ·  Cell|王皞鹏/许琛琦/Dario ... ·  3 天前  
51好读  ›  专栏  ›  安全客

Android https过反抓包总结

安全客  · 公众号  ·  · 2020-03-26 18:00

正文

大家在分析app的协议时,经常会遇到一些app存在反抓包,增加逆向难度。下面小弟我就分情况讨论一下如何解决反抓包问题。
:

情况1:抓包工具无法抓到包,但app可以正常联网使用

可能原因:app内部使用的非http协议,可能是websocket或是tcp协议(qq,微信,百度贴吧等)
解决方案:对于这种情况,只能逆向app进一步去分析底层的二进制协议,暂无其他方法
可能原因:app内部设置了http协议不走代理流量(支付宝,美团等)
解决方案:可以使用一些第三方代理app(如Drony),通过使用vpn,来强制app的http协议走代理流量,从而实现抓包。但如果是需要翻墙的app,则该方法无效,因为翻墙本身需要海外vpn连接,无法再去使用这些代理软件来开启另一个vpn。

情况2:抓包工具无法抓到https包,且app无法联网

原因:大部分是app有对服务器证书的校验,因为我们使用的是抓包工具自己的证书,所以app证书校验不过去,也就自然拒绝发送请求,在外界看来app就相当于一个断网的状态。
解决方案1:逆向app,找到发包接口,动态调试下断点来获取https请求和返回的数据
解决方案2:逆向app,找到证书校验的位置,通过hook的方式来过掉校验。
下面我总结了android常用的一些网络框架的过证书校验的方法:
HttpUrlConnection(较其他框架相比性能不高,使用的app较少):
TrustManager[] trustAllCerts = new TrustManager[]{new X509TrustManager() {    public X509Certificate[] getAcceptedIssuers() {        return null;    }    //重写校验方法,直接返回null通过证书校验    public void checkClientTrusted(X509Certificate[] certs, String authType) {    }    public void checkServerTrusted(X509Certificate[] certs, String authType) {    } }}; HostnameVerifier hv = new HostnameVerifier() {     @Override    public boolean verify(String s, SSLSession sslSession) {        //返回true,表示信任该主机名        return true;    }};SSLContext sc = SSLContext.getInstance("TLS");sc.init(null, trustAllCerts, new SecureRandom());SSLSocketFactory ssf=sc.getSocketFactory();//hook证书校验XposedHelpers.findAndHookMethod(HttpsURLConnection.Class, "setDefaultSSLSocketFactory",                SSLSocketFactory.class,                new XC_MethodHook() {                    @Override                    protected Object beforeHookedMethod(MethodHookParam param) throws Throwable {                        param.args[0]=ssf;                    }                });//hook域名校验XposedHelpers.findAndHookMethod(HttpsURLConnection.Class, "setDefaultHostnameVerifier",                HostnameVerifier.class,                new XC_MethodHook() {                    @Override                    protected Object beforeHookedMethod(MethodHookParam param) throws Throwable {                        param.args[0]=hv;                    }                });
okhttp3(大多数小众app使用的网络框架):
TrustManager[] trustAllCerts = new TrustManager[]{new X509TrustManager() {    public X509Certificate[] getAcceptedIssuers() {        return null;    }    //重写校验方法,直接返回null通过证书校验    public void checkClientTrusted(X509Certificate[] certs, String authType) {    }    public void checkServerTrusted(X509Certificate[] certs, String authType) {    } }}; HostnameVerifier hv = new HostnameVerifier() {     @Override    public boolean verify(String s, SSLSession sslSession) {        //返回true,表示信任该主机名        return true;    }};SSLContext sc = SSLContext.getInstance("TLS");sc.init(null, trustAllCerts, new SecureRandom());SSLSocketFactory ssf=sc.getSocketFactory();//HookClass> okc_builder=XposedHelpers.findClass("okhttp3.OkHttpClient$Builder",classLoader);Class> pinner=XposedHelpers.findClass("okhttp3.CertificatePinner",classLoader);//hook证书校验XposedHelpers.findAndHookMethod(okc_builder, "sslSocketFactory",SSLSocketFactory.class,                new XC_MethodHook() {                    @Override                    protected Object beforeHookedMethod(MethodHookParam param) throws






请到「今天看啥」查看全文