抓包的重要性

网络抓包,是Android应用逆向分析的重中之重,很多时候我们拿到一个APP,不知道从何入手分析,往往是从抓包开始,先弄清楚他与服务器通信的内容,如果一目了然,我们完全可以照搬,自行写一个程序来模拟,如果有一些加密字段和随机字段,也不用担心,我们可以从抓包中了解到一些关键的URL和session之类的信息,然后再反编译分析代码的时候,这些字符串可以帮助我们更快的定位关键代码所在之处。

Fiddler的使用

Fiddler简直是HTTP抓包分析的神器,比Chrome等浏览器自带的调试工具高不知道哪去了,浏览器自带的调试工具,基本只能查看包内容,而Fiddler除了查看,还可以针对不同类型的内容进行格式化,观赏效果真的不要太爽。除了“看”数据包,它还可以一键重发HTTP请求,修改请求内容并重发HTTP请求,拦截修改数据包,返回预设的欺骗性内容等,还可以编写脚本进行更高级的自动化处理。
废话不多说,到Fiddler官网下载安装:https://www.telerik.com/fiddler

接下来,我们要开启Fiddler的HTTPS抓包功能,否则只能看到HTTP请求的内容,而HTTPS请求则是密文。
在Fiddler中点击 [Tools] — [Options] — [HTTPS] 勾选如下设置:

然后在 [Connections] 选项卡中勾选 [Allow remote computers to connect],我们知道Fiddler默认在8888端口开启HTTP/HTTPS代理服务,不管是Android、IPhone还是PC等等设备和程序,只要设置了HTTP/HTTPS代理,流量从Fiddler走,就可以抓包分析。此处开启远程访问,使得我们的Android/Iphone手机可以在WLAN设置上设置它为HTTP/HTTPS代理,从而手机上的应用的HTTP/HTTPS流量将从Fiddler走,Fiddler就能捕获它们。

然后确保手机和PC在同一个局域网中,然后在手机上设置WLAN代理,此处我的PC内网IP地址是192.168.1.100,你需要根据自己的情况进行设置:

然后我们在手机浏览器中打开http://192.168.1.100:8888 下载Fiddler根证书并安装
这是Fiddler解密HTTPS通信的关键,Fiddler对HTTPS包解密的原理是中间人攻击,对客户端声称自己的服务端,对服务端声称自己的客户端,两头欺骗。当然要想欺骗成功,前提是让客户端信任自己的根证书,接下来就可以愉快的观看HTTPS请求明文内容了。

畅快的抓包

Fiddler这个抓包方法,不仅对Android有用,对IPhone也有用。接下来在手机上,无论是打开浏览器,打开手机上的应用,应用内嵌的WebView,我们都可以在Fiddler中看到HTTP/HTTPS请求内容,但细心查看就会发现,还是有的HTTP包装不到。一般能抓到包的几种情况:

  • Android内置浏览器
  • 应用内置WebView
  • 应用使用URLConnection或OkHttp发起HTTP请求

抓不到包,很可能目标APP使用了其它HTTP Client,比如自带一个libcurl的so,那样最终调用的是系统的Socket API,WLAN上设置的HTTP/HTTPS代理对它无效,但其实这种情况很少,市面上绝大多数的应用,都是使用URLConnection和OkHttp,尤其是近些年的应用,几乎都是清一色的OkHttp,所以绝大多数情况下都能抓到包,如果抓不到,很可能是应用自己进行了额外的SSL证书校验工作,根据情况再特殊分析特殊处理。

注意!Android7.0以后抓包失败

以前我一直都是在Android5.1的手机上抓包分析应用,屡试不爽,但是近来使用Android7.1和Android8.1的手机,发现按照上面设置以后,尽管向Android导入了Fiddler的根证书,还是没法抓到HTTPS包的内容。

以 [云闪付] 为例,具体表现为APP中的WebView无法打开内容,和网络断开了一般,Fiddler中可以看到大量的CONNECT然后就没有下文了。

回顾之前我们总结的Fiddler抓不到包的原因 《Windows抓包指南②:Fiddler抓不到的包是怎么回事?》可以猜想,很可能在Android7.0以及以后的版本,即便是导入了Fiddler根证书,但是APP的URLConnection、OkHttp、WebView,仍然不信任系统中导入的Fiddler根证书。

验证猜想

自行编写Android应用,分别使用URLConnection、OkHttp发起HTTPS请求,用WebView打开HTTPS的网页,看看出了什么错误。

try {OkHttpClient client = new OkHttpClient();Request request = new Request.Builder().url("https://www.csdn.net").build();Response response = client.newCall(request).execute();String back_data = response.body().string();
}
catch (Exception e){Log.e("TestHttp", e.toString());
}

运行后果然抛出了异常:

javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.

不出所料,和我们之前在Windows上分析的情况一样,客户端并不信任我们导入系统的Fiddler根证书,那为什么在Android6.0及以前能正常工作呢?经过查阅资料,这个改动果然是从Android7.0开始的。
查看Android官方文档说明:https://developer.android.com/training/articles/security-config.html

By default, secure connections (using protocols like TLS and HTTPS) from all apps trust the pre-installed system CAs, and apps targeting Android 6.0 (API level 23) and lower also trust the user-added CA store by default.

果然,在Android 6.0 (API level 23)及以前,APP默认信任系统自带的CA证书以及用于导入的CA证书,Android 6.0 (API level 23)以后,APP默认只信任系统自带的CA证书,对于用户导入的不予理会。

也就是说,关于 [network-security-config],在Android 6.0 (API level 23)及以前默认是这样的:

<base-config cleartextTrafficPermitted="true"><trust-anchors><certificates src="system" /><certificates src="user" /></trust-anchors>
</base-config>

Android 7.0 (API level 24) 及以后是这样的:

<base-config cleartextTrafficPermitted="true"><trust-anchors><certificates src="system" /></trust-anchors>
</base-config>

同时在上面的链接中,Google也给出了办法,怎么在Android7.0及以后的系统中,让APP信任我们手工导入的CA证书。
那就是在编译APK之前,在你的Android项目的res文件夹下创建xml文件 [net_security_config.xml] 内容为:

<?xml version="1.0" encoding="utf-8"?>
<network-security-config xmlns:android="http://schemas.android.com/apk/res/android"><base-config cleartextTrafficPermitted="true"><trust-anchors><certificates src="system" overridePins="true" /><certificates src="user" overridePins="true" /></trust-anchors></base-config>
</network-security-config>

然后在AndroidManifest.xml中的application标签下添加

android:networkSecurityConfig="@xml/net_security_config.xml"

编译安装,然后该APP就信任用户添加的CA证书,从而Fiddler就可以抓到它的HTTPS包并解密内容。

Are You Kidding Me?

什么?你让我重新编译APP?我就是要分析第三方APP的通信协议,你让我重新编译微信?重新编译QQ?
非也非也,还记得我们之前在《Windows抓包指南(一):Proxifier+Fiddler对第三方程序强制抓包》中说的吗?

有条件要上,没有条件创造条件也要上!

八个解决方案(重点!重点!重点!!!!)

强上的办法有八个:

① 重新打包目标APK,修改AndroidManifest.xml

我们可以使用Apktool等工具对目标APK进行解包,添加 [net_security_config.xml] 并修改 [AndroidManifest.xml] 然后重新打包。但是现在很多应用都做了防打包处理,要么利用Apktool弱点,制造错误让Apktool抛异常,要么重新打包后程序校验自身证书,校验失败无法启动,罢工。

② Root手机,安装Xposed框架,使用JustTrustMe模块干它

这个方案实际上就是之前我们在 《Windows抓包指南②:Fiddler抓不到的包是怎么回事?》中的思路在Android上的实践。Xposed的JustTrustMe模块Hook了Android SDK的HTTP库,强制跳过SSL证书验证,不管是真证书还是假证书,一律验证通过,于是Fiddler作为中间人攻击制造的假证书也被通过了。

JustTrustMe项目源代码:https://github.com/Fuzion24/JustTrustMe

需要注意的是JustTrustMe有个坑,不要下载它Github中编译的Latest release版本,其实那是一个很古老的版本,对于APP内嵌的WebView没有做处理,安装以后,URLConnection、OkHttp通信的HTTPS是可以抓到了,但是APP内嵌的WebView仍然出错。所以最好git clone它的最新源代码,然后自行编译。

也可以下载我编译的最新版本:https://github.com/encoderlee/JustTrustMe/releases/download/v0.3/JustTrustMe_20190516.apk

当然这个方案也有缺点,毕竟手机被Root后,还安装了Xposed框架,有的APP可是会检测的,发现手机被Root,或者自身被Xposed Hook,就罢工了。

③退缩,使用Android5.1 Android6.0的手机来抓包分析

④换IPhone手机试试,目前IOS没有Android 7.0以后的这个限制,手动导入的Fiddler假CA证书,也能作为系统证书,被APP信任

⑤Root手机或使用android模拟器,现在很多android模拟器(比如雷电)直接提供了root功能,否则的话现在最新的小米华为手机root是很麻烦的,不过有的app不能在模拟器中跑,随机应变处理。在adb shell 下利用root权限,把Fiddler的伪CA证书放到系统CA证书目录中,通常路径是 /system/etc/security/cacerts/

⑥终极大法,购入Google亲儿子手机,比如Nexus Pixel,下载Android AOSP代码,直接修改Android系统源代码,强行验证所有SSL证书为真,编译,刷机,愉快工作,或者把Fiddler的假CA证书提前放到系统信任证书目录中。

⑦使用android开发板,其实和方法⑥差不多,购买一块android开发板(比如RK3399,RK3588等),商家会提供全套的AOSP源码,直接修改它的Android系统源代码,编译,烧写,或者把Fiddler的假CA证书提前放到系统信任证书目录中,打包,烧写。

⑧如果你要抓包的内容,是APP内嵌的webview里发起的HTTP请求,可以参考这个方法:
《Android抓包指南②: DevTools+WebViewDebugHook调试第三方应用的WebView》

愉快的抓包分析


可以看到,在使用了方案②后,Android7.1.2的手机,成功解密APP的HTTPS通信内容

不要高兴的太早

此处,虽然依旧能抓到大部分Android APP的HTTP/HTTPS包,但是别高兴的太早,有的APP为了防抓包,还做了很多操作:

① 二次加密
有的APP,在涉及到关键数据通信时,会将正文二次加密后才通过HTTPS发送,我们抓包抓到的是一堆二进制base64

② 自带HTTP Client
像支付宝那样的变态,自己带了一个基于so的HTTP Client库,对于关键数据,都不走URLConnection和OkHttp,而是走自己的HTTP Client库,甚至一些WebView页面的渲染,都是先用自带的HTTP Client请求得到json数据,然后填到HTML模板里面,再在WebView里渲染出来。

③ SSL/TLS Pinning,APP自带服务端证书,或自带CA证书,除了自带证书什么都不信,对,它连系统证书都不相信,你怎么导都没用,除非用apktool解包他的APP,把我们的Fiddler假CA证书放进去重新打包

④有的APP不走我们在WLAN设置中设置的HTTP代理,这种情况,可以使用【drony】这个APP,【drony】的原理和各种android上的梯子软件原理相似,他开启了一个VPN,把本机流量全部通过代理走出去,只不过梯子APP走的是v2ray等代理,【drony】可以将本机所有流量(UDP除外)走我们Fiddler提供的https代理。

当然,兵来将挡,水来土掩,针对各种情况再逐一对症分析,弄清楚原理,才能解决更多的难题,在逆向工程的道路上走的越远。

抓包的基本方法已经介绍完毕,后续文章将会分享一些我在工作中遇到的Windows、Android平台上无法抓包的难题及解决方案,感谢持续关注。。。

本文由encoderlee发表于CSDN博客:https://blog.csdn.net/CharlesSimonyi/article/details/90493122 转载请注明出处

Android抓包指南①: 使用Fiddler抓HTTP/HTTPS包相关推荐

  1. Android抓包指南: 使用Fiddler抓HTTP/HTTPS包

    本文由encoderlee发表于CSDN博客:https://blog.csdn.net/CharlesSimonyi/article/details/90493122 抓包的重要性 网络抓包,是An ...

  2. linux 抓包文件 导出,Fiddler抓包13-fiddler 抓包导出 curl 命令行

    前言 curl是一个命令行工具 ,一般用于 linux 环境上发 http 请求,方便远程定位接口问题. fiddler 抓包后可以导出 curl 命令行,这样方便不会写 curl 的小伙伴快速的生成 ...

  3. fiddler抓包过程以及fiddler抓包手机添加代理后连不上网解决办法

    1.(1)电脑端打开安装好的的fiddler,打开Tools-Options (2)HTTPS设置如下图 (3)Connection设置如下图,端口号设为8888 2.手机端添加代理 注:电脑联网和手 ...

  4. php禁止fidd抓包,PHP配合fiddler抓包抓取微信指数小程序数据的实现方法分析

    本文实例讲述了PHP配合fiddler抓包抓取微信指数小程序数据的实现方法.分享给大家供大家参考,具体如下: 这两天研究了下微信指数这个东西.要抓取呢,按照一般思路的话,那就是使用fiddler抓取手 ...

  5. Windows抓包指南①:Proxifier+Fiddler对第三方程序强制抓包

    HOW & WHY 关于Fiddler抓包的文章在网上已经一搜一大把了,但大多数是讲对浏览器的抓包,主要用于分析WEB站点内容,而本文侧重于普通Windows桌面应用程序的HTTP/HTTPS ...

  6. 使用Fiddler抓HTTP/HTTPS包,Android7.0以后https抓包失败问题

    原博客地址:https://www.52pojie.cn/thread-967606-1-1.html 抓包的重要性 网络抓包,是Android应用逆向分析的重中之重,很多时候我们拿到一个APP,不知 ...

  7. Fiddler手机抓包指南

    Fiddler手机抓包指南 设置Fiddler 设置可以抓取https 打开Fiddler ------> Options .然后打开的对话框中,选择HTTPS tab页,如图所示: 选择 Co ...

  8. Fiddler抓包工具总结(转)

    序章 Fiddler是一个蛮好用的抓包工具,可以将网络传输发送与接受的数据包进行截获.重发.编辑.转存等操作.也可以用来检测网络安全.反正好处多多,举之不尽呀!当年学习的时候也蛮费劲,一些蛮实用隐藏的 ...

  9. fiddler抓app包获取不到HTTPS请求的2个解决方案

    因为app要过等保(国家信息安全等级保护),要用到fiddler抓包. 碰到fiddler抓app包获取不到HTTPS请求,经验证发现以下2个解决方案可用.共享下. 原理解析: 安卓手机APP抓包时, ...

最新文章

  1. python wlile
  2. 视差滚动教程、实现方法、源代码
  3. 阿里与网易考拉收购案谈崩?后者股价下跌5.01%
  4. 决策树(八)--随机森林及OpenCV源码分析
  5. java 传递intent_intent传递参数
  6. 代码雨代码源复制_两步教你打造一个代码雨动态壁纸效果,代码可以设置为名字...
  7. 【数据库】教你看懂SQLServer查询语句执行计划
  8. CAD创建组却没有组合在一起?
  9. Painter X Liquid Ink(液体墨水)画笔
  10. 微视点:网传社交游戏公司“五分钟”面临倒闭,引发各方热议
  11. JAVA+JDBC超级详解---从连接数据库到连接池
  12. K8S中使用显卡GPU(N卡) —— 筑梦之路
  13. freeswitch + dbl 呼入设置
  14. android沉浸状态栏和顶部状态栏背景色的设置
  15. uni-app+websocket实现语音聊天小程序
  16. pytorch深度学习入门与实战——今天我们来对一张图像进行卷积、池化,以及激活层的使用展示
  17. 学好C++可以从事哪些领域的开发
  18. 索尼正式公布新掌机PSP2——NGP
  19. Vue实现滚动吸顶,文案动态更改
  20. 主流AR眼镜参数对比、AR SDK最全功能特性对比

热门文章

  1. 在VMware16虚拟机中安装Windows10操作系统详细过程!!必看
  2. 网易游戏-测试开发工程师-18年暑期实习-一面二面
  3. [Cadence Sigrity] PowerDC打开提示No license available
  4. maxwell详细介绍
  5. Python之人机猜拳游戏
  6. 数学分析-一元微积分
  7. JunOS VRRP configuration
  8. ROS1/ROS2机器人课程开设难度如何
  9. activiti7没有自动生成表
  10. Javascript模块化编程,requireJs