1.简介
上一篇中,宏哥讲解和分享了一些如何快速解决的临时应急的的方法,但是小伙伴或者童鞋们是不是觉得是一些头痛医头脚痛医脚的方法,治标不治本,或者是一些对于测试人员实现起来比较有一定难度。所以今天宏哥再介绍和分享一下治本的方法。
2.追本溯源
要想从根本上解决问题,我们找到根源从跟上解决问题即可!究其根源,targetSdkVersion >= 24的应用在android 7.0 系统的设备中之所以没法被抓包,是因为android 7.0之后的应用是默认只信任系统证书,不信任用户证书,那么我们可以想办法将Fiddler证书装到系统证书目录下,伪装成系统证书,那么就不存在因为fiddler证书不被信任而无法抓包的问题了。找到根源了,既然是用户证书不被信任,那么我们制作一个系统证书安装在手机上你就解决这一问题了。接下来宏哥就按这个思路解决问题。
1.宏哥之前演示可以抓安卓手机的https的包,是因为宏哥的夜神模拟器的Android版本是5.1.1,所以可以抓到包。
2.宏哥点击夜神模拟器右边菜单里的夜神多开器,如下图所示:
3.添加一个Android版本大于7.0的模拟器,如下图所示:
4.设置好代理,再次使用Fiddler抓包百度手机助手。提示网络繁忙。具体表现为APP中的WebView无法打开内容,抓不到APP的包了,如下图所示:
5.Fiddler抓包结果:Fiddler中可以看到大量的CONNECT然后就没有下文了。如下图所示:
3.导出Fiddler证书
1.下载安装Fiddler抓包工具,下载完成之后先不要点击打开运行(如果你是首次安装,如果你已经安装好了,不要启动fiddler)。
2.下载fiddlercertmaker.exe这个Bouncy Castle证书生成器,因为新版本的Android拒绝超过两年有效期的证书,双击下载好的fiddlercertmaker.exe(确保已关闭Fiddler),会弹出提示导入证书成功这个对话框。(如果你的新版本可以安装,这一步可以省略)。
3.将Fiddler的证书导出到电脑,点击Tools -> Options -> HTTPS -> Actions -> Export Root Certificate to Desktop。如下图所示:
4.导出成功之后,就可以在桌面上看到导出的FiddlerRoot.cer证书文件 。如下图所示:
4.下载和安装openssl
1.下载Window版openssl, 下载地址:http://slproweb.com/products/Win32OpenSSL.html,下拉到下面,选择最上面的64位EXE点击下载安装即可,如下图所示:
2.安装完成之后,在openssl的安装目录bin下,打开cmd命令行试试openssl命令是否生效,要是有如下输入信息,就说明安装成功:
5.证书格式转换与重命名
1.将Fiddler cer证书转pem证书,在cmd输入如下命令进行转换:
代码语言:javascript复制openssl x509 -inform DER -in C:UsersDELLDesktopFiddlerRoot.cer -out C:UsersDELLDesktopFiddlerRoot.pem
2.用md5方式显示pem证书的hash值, 在cmd输入如下命令:
代码语言:javascript复制openssl x509 -inform PEM -subject_hash_old -in C:UsersDELLDesktopFiddlerRoot.pem
从上面可以看到,咱们生成Fiddler证书的hash值是269953fb
3.将pem证书重命名,使用上面显示的值269953fb对pem证书进行重命名,以下命令仅适用于window,linux请用mv。如下图所示:
代码语言:javascript复制ren C:UsersDELLDesktopFiddlerRoot.pem 269953fb.0
注意:ren
命令第二个参数,直接输入新的文件名即可,不要输入完整路径,否则会报错。如下图所示:
6.安装证书到系统目录(/system/etc/security/cacerts)
6.1适合有Android基础的开发者
1.找一台root过的手机或者任意一款模拟器,因为只有root过的手机才有可能执行各种高权限的命令。我这边下载了一款叫夜神android 7系统的模拟器。如下图所示:
2.cmd输入adb connect 127.0.0.1:62001,使adb跟夜神模拟器连接上(这部分不清楚的可以看宏哥有关Appium的文章,里边有详细的介绍如何连接)。
(1)安装完夜神模拟器在cmd检测时,提示adb server version (36) doesn't match this client (41); killing...
说明andriod adb版本和模拟器adb版本不匹配
查找原因:
(2)查看Android-adb 版本,cmd输入adb --version,可以看到当前版本是1.0.41 ,简称41版本
(2)查看模拟器(夜神)中adb的版本,在安装目录Noxbin下有个nox_adb.exe ,其实就是adb.exe。(这里便于和Android的adb做区分)
(3)然后在上一步中的目录地址栏输入cmd进入命令行,然后输入nox_adb,看到模拟器中的adb版本是36
(4)找到原因后,将platform-tools文件夹中adb.exe 替换到模拟器根目录下的nox_adb.exe即可,接下来把android-sdk里面的adb.exe版本复制出来,然后改名为nox_adb.exe,然后替换Noxbin下的nox_adb.exe,就可以了,关闭模拟器,再次启动模拟器进行检测,能看到127.0.0.1:62001 就是模拟器的设备名称表示连接成功
3.cmd 输入adb shell,进入到夜神模拟器的终端shell中。直接输入后,发现报错:error:more than one device/emulator 。如下图所示:
(1)查看是由于宏哥打开了两个模拟器,直接输入命令,系统不知道进入那个模拟器,你必须指定一个。如下图所示:
(2)指定模拟器然后进去shell,就可以成功进入,如下图所示:
4.cmd 输入 cd /system/etc/security, 然后输入ls -l, 可以看到cacerts目录,我们只有读与执行权限,并没有写入的权限。如下图所示:
5.cmd输入chmod 777 cacerts, 让咱们对该目录拥有写入权限,执行之后,在输入ls -l可以看到我们已经获取到写入权限了。如下图所示:
敲黑板!!!
有些小伙伴可能在其他模拟器输入chmod 777 cacerts,会被提示Read-only file system。如下图所示:
这种情况需要重新挂载一下系统,设置为可读写,输入mount -o remount,rw /system,然后再输入chmod 777 cacerts,你会发现可以成功设置了。如下图所示:
6.输入exit退出shell终端,然后输入adb push C:UsersDELLDesktop269953fb.0 /system/etc/security/cacerts(同样道理需要指定模拟器),将事先转换好的Fiddler证书推送到夜神模拟器的/system/etc/security/cacerts目录下。如下图所示:
7.到这里就已经成功的把Fiddler证书安装到系统目录了,咱们点击模拟器的设置 -> 安全性与位置信息 -> 加密与凭据 -> 信任的凭据 -> 系统,往下拉可以看到咱们的Fiddler证书。如下图所示:
现在再打开Fiddler进行抓包,你会发现可以成功抓包了(记得模拟器在wifi那里设置好代理),如下图所示:
6.2适合没有Android基础的小白
1.找一台root过的手机或者任意一款模拟器,因为只有root过的手机才有可能执行各种高权限的命令。我这边下载了一款叫夜神android 7系统的模拟器
2.点击夜神模拟器侧边栏的电脑图标,选择打开电脑文件夹,会跳转打开电脑的目录C:UsersAdministratorNox_share,将转换好的Fiddler证书269953fb.0复制到ImageShare目录下即可
3.下载MT管理器,下载地址:https://coolapk.com/apk/bin.mt.plus 。拖拉到模拟器中安装完成,点击打开应用,左边打开Pictures目录就可以看到刚才电脑ImageShare目录的Fiddler证书269953fb.0
4.右边点击进入到system/etc/security/cacerts目录,然后长按左边的269953fb.0文件,点击复制即可复制到右边打开的目录那里
5.一般人到这里以为就结束,但是你留意看一下刚才复制到system/etc/security/cacerts目录下的269953fb.0文件,你会发现跟其他已有的系统证书相比,269953fb.0根本就没有读的权限,到时你到信任的凭据也是没法找到这个Fiddler证书的,点击MT管理器的左上角,找到打开终端
6.进入到终端之后,输入以下命令将269953fb.0文件设置为可读即可
7.再看看system/etc/security/cacerts目录下269953fb.0文件的权限,发现确实有读权限了
8.咱们回到模拟器桌面,点击模拟器的设置 -> 安全性与位置信息 -> 加密与凭据 -> 信任的凭据 -> 系统,往下拉终于看到咱们的Fiddler证书,尝试一下抓包也是没问题了
现在再打开Fiddler进行抓包,你会发现可以成功抓包了(记得模拟器在wifi那里设置好代理),如下图所示:
7.小结
1.雷电4模拟器经过上述设置之后,你会发现依然是没法成功抓包,这时需要允许以下命令给雷电4设置全局代理
adb shell settings put global http_proxy <代理ip>:<代理端口> 其中adb在模拟器安装目录可以找到。
2.在操作前一定要保证手机or模拟器已经开启了root,若模拟器的话还要开启usb调试选项,需要在设置 - 关于平板电脑或关于手机 - 对着Android版本号的位置猛戳5下(开启开发者选项)- 返回进入开发者选项 - 打开USB调试按钮开关 ps:用力越猛效果越好。
3.记得要进入openssl的安装目录bin,才能使用openssl命令,否则会提示命令不存在,如果需要在其他目录下使用openssl命令,需要你配置环境变量即可,具体配置方法自己可以查一下,毕竟宏哥今天这里不是主要讲解openssl的。
4.这里还有一点需要单独说明,/system/etc/security/cacerts/目录的写权限,需要手机root权限。也就是说复制证书到该目录需要您root自己的设备。关于Android手机的root,通常手机厂家都会有自己官方的教程,建议大家按官方的操作进行root。
8.拓展
可能到这里有小伙伴会有疑问,系统证书是放在system/etc/security/cacerts目录下,那么假如是安装的用户证书是在保存在哪个目录下,其实就保存在data/misc/keystore目录。