大家在分析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;
}
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) {
return true;
}
};
SSLContext sc = SSLContext.getInstance("TLS");
sc.init(null, trustAllCerts, new SecureRandom());
SSLSocketFactory ssf=sc.getSocketFactory();
XposedHelpers.findAndHookMethod(HttpsURLConnection.Class, "setDefaultSSLSocketFactory",
SSLSocketFactory.class,
new XC_MethodHook() {
@Override
protected Object beforeHookedMethod(MethodHookParam param) throws Throwable {
param.args[0]=ssf;
}
});
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;
}
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) {
return true;
}
};
SSLContext sc = SSLContext.getInstance("TLS");
sc.init(null, trustAllCerts, new SecureRandom());
SSLSocketFactory ssf=sc.getSocketFactory();
Class> okc_builder=XposedHelpers.findClass("okhttp3.OkHttpClient$Builder",classLoader);
Class> pinner=XposedHelpers.findClass("okhttp3.CertificatePinner",classLoader);
XposedHelpers.findAndHookMethod(okc_builder, "sslSocketFactory",SSLSocketFactory.class,
new XC_MethodHook() {
@Override
protected Object beforeHookedMethod(MethodHookParam param) throws