对于移动端开发,抓包应该是必备技能之一了。
比如,做一个新业务,接口设计可以参考一下竞品。这样可以少走弯路,还能在竞品的基础上做出优化。
抓http?真没必要写这篇博客。咱们今天聊一聊抓https。
抓包方式科普
- tcpdump + wireshark(原理:tcpdump通过hook操作系统函数,需要root权限。优点是可以抓取非http、https协议的数据包,缺点是操作繁琐。)
- charles(原理:局域网代理)
使用charles抓取https的包
教程,网络上一堆。但是有几点需要注意的:
-
安装根证书之前必须设置手机锁屏密码!不然证书安装不上。
-
安装charles的根证书:
手机设置代理后,访问
http://chls.pro/ssl来下载根证书,然后安装。 -
有些手机(如oppo)安装根证书有点不一样 如下图这样,下载根证书,另存为
charles.pem(如果不行就选择.cer格式)。push到手机。在手机设置-wlan-高级设置-从存储设备安装-找到证书后点击安装。 -
不要忘记
Enable SSL Proxying -
当然也支持通配符
Android 7.0及以上的,继续看
我有Android 5.0的手机,可以不用往下看了吧?想偷懒?不可能的,如果遇到SSL Pinning(证书锁定、公钥锁定)或者双向认证的app。Android 5.0也不行!请继续!
需要反编译
修改network_security_config.xml,信任用户证书,然后重新编译apk
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<base-config cleartextTrafficPermitted="true">
<trust-anchors>
<certificates src="system" />
<certificates src="user" /><!-- 加入它,信任用户导入的证书 -->
</trust-anchors>
</base-config>
</network-security-config>
有些应用会有防止反编译的机制。往下看。
不需要反编译,需要hook
不需要反编译,肯定是运行时Hook啦,对应Hook类android.security.net.config.ManifestConfigSource
xposed试一下,frida试一下
直接添加成为系统证书(需要root权限)
openssl x509 -inform DER -subject_hash_old -in cert.cer
#复制输出结果的第一行哈希字符串,如7ef3ba8a
openssl x509 -inform DER -text -in cert.cer -out 7ef3ba8a.0
adb push 7ef3ba8a.0 /system/etc/security/cacerts/
adb shell
cd /system/etc/security/cacerts
chmod 644 7ef3ba8a.0
其它防抓包机制
-
破解方法:反编译替换证书、公钥,或者hook签证方法(如Xposed+JustTrustme)
-
破解方法:添加客户端证书到charles
我们的产品怎么防抓包?
看到这里,小伙伴们是不是觉得,做什么都没用,我直接用http吧,也不做任何防护了。
其实,我部分赞同这样的观点。但是https主要的目的是防止“中间人攻击”,我们添加证书到自己的手机上,这个操作“中间人”是做不到的。
所以,https还是要上,只是要加强各种防护措施。目前 我能想到的做法:
- 加固,尽可能防止反编译
- 混淆代码,提高静态分析的难度
- 双向认证
- “jni+复杂算法”保护客户端证书的密钥
- 各种逆向工具都有一些缺陷,我们的app可以针对主流的逆向工具做相应的陷阱。至少让我这样的小白不能逆向成功。
参考、及扩展阅读
SSL/TLS协议运行机制的概述 公钥放在数字证书中。只要证书是可信的,公钥就是可信的。