前言
众所周知,Android7.0以后系统不在信任用户的证书.这一改动使得我们在抓包的时候产生了诸多不便。在Android端很多人的做法是先刷入Magsik在通过Magsik模块的方式来将抓包证书修改成系统证书。
比较出名的就是大名鼎鼎的HttpCanary(小黄鸟),只是它虽然抓包方便,调试起来却没有Fiddler Charles等抓包工具方便。
接下来,我将介绍几种方法能让你像装了Magsik模块的小黄鸟一样方便的抓包,并且方便的调试,希望能对你有所帮助。
1.懒人专用法
Android系统对证书的不信任是从高版本开始的,那==直接用低版本的Android系统==即可完美解决这一问题。如果你手头没有低版本的安卓真机进行调试,可以尝试用PC端的Android模拟器来解决。诸如夜神(Nox),MuMu等等,绝大多数的模拟器都提供了Android5.0版本等低Android版本的系统。
在使用这些低版本的系统进行抓包时,除了APP使用上可能不如高版本流畅,在抓包这一方面效率绝对是相当的不错。
注意 --> 某些APP由于不支持32位可能无法运行。
2.逆向破解法
此法虽然名字高大上,实际上比较针对于自己写APP进行调试时使用。不过对于一些冷门的小软件或者是没那么注重安全的开发者所作出的产品来说,可能会有奇效。
⑴. ==让apk的targetSDKVersion <= 23== 即可解决. 碰到做了反编译等保护的很难实现
⑵. ==在res/xml目录下添加network_security_config.xml文件,并在application下设置好如下属性:
android:networkSecurityConfig="@xml/network_security_config"
xml文件模板:
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<!-- 设置允许http明文传输-->
<base-config cleartextTrafficPermitted="true">
<trust-anchors>
<!-- 设置信任系统级别证书-->
<certificates src="system" />
<!-- 设置信任用户自定义证书-->
<certificates src="user" />
</trust-anchors>
</base-config>
</network-security-config>
3.移动证书法
本文的重点方法,通过==将证书移动至系统证书目录==,来解决不信任证书造成的无法抓包问题。
(1). 导出证书
这里根据你的抓包工具来自行导出,但是你需要注意的是,现阶段的Android有效时间超过两年的证书。所以你导出的来的证书最好有效期不要超过这个时长,以避免不必要的麻烦。
此处以Fiddler为例,我们使用Fiddler的证书制作工具来导出一个证书。
(2).转换证书格式
使用OpenSSL对cer证书进行格式转换,变为pem格式
openssl x509 -inform DER -in FiddlerRoot.cer -out FiddlerRoot.pem
注意自己替换证书路径
在转换成pem格式后查看证书的hash值
openssl x509 -inform PEM -subject_hash_old -in FiddlerRoot.pem
如图所示:
记住图中圈出来的hash值,这个hash值就是最后转换出来的文件的文件名。
此时我们直接将转换好的pem证书进行重命名即可,如果你想用命令的话,Windows下可以用ren命令
ren FiddlerRoot.pem e5c3944b.0
如果你在Linux操作或者Android中使用终端模拟器的话就用mv命令
最后你将获得一个e5c3944b.0文件
(3).推送证书
将转换好的证书推送到Android的 /system/etc/security 目录下并赋予文件可读权限即可,这个目录就是系统证书的目录。
推送方法1:使用adb进行推送
首先Android端打开adb调试,这里我是用的网络调试,也可以自己接线,如果是模拟器的话,也可以用模拟器的办法连接模拟器的adb。
PC端使用adb命令连接设备
首先与设备进行配对
adb pair 192.168.2.43:41053
随后连接设备
adb connect 192.168.2.43:37877
最后进入shell环境
adb shell
注意上面连接设备时输入的ip和端口,是与设备截图中一一对应的。
连接好设备后,来到目标目录
cd /system/etc/security
注意这里的目录权限,是755
而我们想要往目录中存放文件需要写的权限,此处采用adb临时赋予777
权限
chmod 777 cacerts
这里可能会失败,由于我是真机且已经获取了root,所以直接su
获取权限给目录加上了777
如果你是带root的模拟器,一般不需要专门su获取权限
如果碰到==提示Read-only file system==,可以使用mount -o remount,rw /system
,将系统文件夹挂载为可读写。然后再用chmod赋予777权限。
修改好权限后,输入exit
退出shell(如果你su了需要两次exit才能退出)。再用adb命令来推送证书文件
adb push E:\Desktop\e5c3944b.0 /system/etc/security/cacerts
这里的证书文件目录记得自己替换
如果你是模拟器的话,经过上边的操作应该已经推送成功了,不过我这里是真机所以无法直接推送到/system下,所以我这里稍微绕一下,先推送到手机内存中,然后再进入shell转移到cacerts目录下
adb push E:\Desktop\e5c3944b.0 /sdcard/
su
mv /sdcard/e5c3944b.0 /system/etc/security/cacerts
这里还要检查下你把文件推送过去,一定要给读的权限,不然在已信任的证书中是看不到这个证书的
chmod 666 e5c3944b.0
同样是真机的话记得推送完文件以后把目录的权限改回755
推送方法2:Root权限直接转移
既然你已经有了root权限,完全可以通过软件直接在Android端直接进行转移
图示为使用MT管理器直接将证书移动到系统证书目录中
总结:
不管你用什么办法,只要把证书文件移动到/system/etc/security/cacerts
这个目录下,并赋予证书文件可读的权限即可.
4.全局代{过}{滤}理法
这个办法我并没有试验过,不过据说雷电模拟器是可行的
adb shell settings put global http_proxy <代{过}{滤}理ip>:<代{过}{滤}理端口>