Charles 可以使用安装根证书的方式抓取 HTTPS 数据包,但是如果 SSL 双向认证的话就没办法抓包了,打开 App Store 会向苹果服务器发送 HTTPS 数据包,大部分都做了双向认证,如下图所示:
借助插件 SSL Kill Switch 2 可以突破 SSL 双向认证,下载地址:https://github.com/nabla-c0d3/ssl-kill-switch2。
首先使用 Cydia 安装 Debian Packager、Cydia Substrate、PreferenceLoader,然后下载 ssl-kill-switch2 安装包,将安装包上传到 /var/mobile 目录,执行命令安装:
1 |
dpkg -i com.nablac0d3.SSLKillSwitch2_0.11.deb |
安装完成之后重启,命令如下:
1 |
killall -HUP SpringBoard |
然后打开设置,往下拉会发现多了一个SSL Kill Switch 2,打开开关,然后再打开 App Store,会发现 Charles 能够成功解析数据包,如下图所示:
SSL Kill Switch 2 工作的原理是 Hook 安全传输相关的函数 SSLHandshake、SSLSetSessionOption、SSLCreateContext,核心代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
// 安全传输相关的函数 hook, 最高支持 iOS 9 MSHookFunction((void *) SSLHandshake,(void *) replaced_SSLHandshake, (void **) &original_SSLHandshake); MSHookFunction((void *) SSLSetSessionOption,(void *) replaced_SSLSetSessionOption, (void **) &original_SSLSetSessionOption); MSHookFunction((void *) SSLCreateContext,(void *) replaced_SSLCreateContext, (void **) &original_SSLCreateContext); // libsystem_coretls.dylib hook,只支持 iOS 10 及以上 NSProcessInfo *processInfo = [NSProcessInfo processInfo]; if ([processInfo respondsToSelector:@selector(isOperatingSystemAtLeastVersion:)] && [processInfo isOperatingSystemAtLeastVersion:(NSOperatingSystemVersion){11, 0, 0}]) { // 支持 iOS 11 void* handle = dlopen("/usr/lib/libnetwork.dylib", RTLD_NOW); void *tls_helper_create_peer_trust = dlsym(handle, "nw_tls_create_peer_trust"); if (tls_helper_create_peer_trust) { MSHookFunction((void *) tls_helper_create_peer_trust, (void *) replaced_tls_helper_create_peer_trust, (void **) &original_tls_helper_create_peer_trust); } } else if ([processInfo respondsToSelector:@selector(isOperatingSystemAtLeastVersion:)] && [processInfo isOperatingSystemAtLeastVersion:(NSOperatingSystemVersion){10, 0, 0}]) { // 支持 iOS 10 void *tls_helper_create_peer_trust = dlsym(RTLD_DEFAULT, "tls_helper_create_peer_trust"); MSHookFunction((void *) tls_helper_create_peer_trust, (void *) replaced_tls_helper_create_peer_trust, (void **) &original_tls_helper_create_peer_trust); } |
如果不需要使用插件,卸载命令如下:
1 |
dpkg -r com.nablac0d3.SSLKillSwitch2_0.11.deb |