目前,越来越多的app采取双向认证证书,给抓包分析带来了诸多不便。
常见的思路中,通常需要定位到代码中加载证书的位置,在此处的附近寻找证书文件以及密码。在app加固的情况下,首先需要将app脱壳,在加固的情况下,资源文件也经常会加密,拿不到真实的证书。由此可见,该种方法精准,但是工作量较大。
在另一种思路中,可以在不反编译app的情况下轻松拿到证书。可见下面的代码:
Class<?> KeyStore = cl.loadClass("java.security.KeyStore");
XposedHelpers.findAndHookMethod(KeyStore, "load",
InputStream.class,
char[].class,
new XC_MethodHook() {
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
File sdCardDir = Environment.getExternalStorageDirectory();
File sdFile = new File(sdCardDir, "client.pfx");
OutputStream out = new FileOutputStream(sdFile);
KeyStore ks = (KeyStore)param.thisObject;
ks.store(out, "123456".toCharArray());
}
}
);
app在加载证书的时候,会new一个KeyStore对象,接着调用load方法进行加载证书文件。在load方法加载完毕后,便可以直接调用store方法将证书输出。输出的证书经过处理便可以用来抓包。具体处理流程可参考服务器校验客户端证书分析及代码
双向认证流程可参考:SSL双向认证和SSL单向认证的区别
在客户端校验证书中,通用方法可以采用JustTrustMe模块来过掉。
基于上述方法,大部分情况下,不需要对app进行逆向,即可完成双向认证情况下的抓包。