前言

当年还在学校的时候,就接触到了抓包,当时还在贴吧写了一篇小白文来误导小白(不是。但当时的自己还没接触到逆向,竟然对抓包没有提起兴趣,说到底又是太年轻,不懂事。时至今日,才发现它是安全人员必须要掌握的基本技能,面试安全岗位也多多少会问到与抓包相关的知识。抓包(packet capture)是查看数据包发送和接收过程的手段。抓包也有很多种办法,可以在软件层面对函数进行hook,查看发送或接受的数据包,还有利用WireShark,tcpdump,Fiddler,Charles等第三方工具来抓包。本文演示如何利用Charles来对AndroidApp进行抓包,并且强行让App走代理

工具准备

  • 电脑
  • 一部已经ROOT的手机
  • Charles
  • Openssl

步骤

安装Charles后打开。依次选择菜单Proxy -> SSL Proxying Settings…

在SSL Proxying标签下勾选Enable SSL Proxying,再点击Add按钮

添加一条Host为*,Port为443的规则,如图:

点击OK

依次点击Help -> SSL Proxying -> Save Charles Root Certificate…导出根证书,另存为charles.pem

将下载好的OpenSSL放入环境变量

转到证书导出目录,打开命令行,执行以下命令:

openssl x509 -subject_hash_old -in charles.pem

根据输出的内容,将charles.pem重命名为b6a3624b.0,注意文件后缀是0

然后重新挂载手机的system分区

adb root
adb remount

将重命名后的文件推入/system/etc/security/cacerts目录中

adb push b6a3624b.0 /system/etc/security/cacerts

回到Charles,依次选择Proxy->Proxy Settings

设置一个端口,按确定

在手机WIFI设置页面,给连接的WIFI设置代理,代理到Charles。代理服务器主机名写电脑的主机名或者ip地址,代理服务器端口写上面在Charles中设置的端口,写完后点保存

接下来,手机的https包都会被转到Chales中,并成功解析

当然,有时候事情不会那么顺利。咱们抓包,那别人也会想办法防止抓包。如果抓包的时候我们知道应用明明有http请求但是在抓包工具中却抓不到包,那么应用中很有可能设置了不让请求走代理,常用的设置代码如下:

URLConnection类public static String get(String urlStr){ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();InputStream inputStream = null;try {URL url = new URL(urlStr);HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection(Proxy.NO_PROXY);httpURLConnection.setRequestMethod("GET");inputStream = httpURLConnection.getInputStream();if(httpURLConnection.getResponseCode() == 200) {byte[] buf = new byte[1024];int len = -1;while ((len = inputStream.read(buf)) != -1) {byteArrayOutputStream.write(buf, 0, len);}}}catch (Exception e){return e.toString();}finally {close(inputStream);close(byteArrayOutputStream);}return byteArrayOutputStream.toString();}

注意上面的openConnection(Proxy.NO_PROXY),这就是设置请求不走代理的地方

OkHttp库

    public static String get(String url)  {OkHttpClient.Builder client = new OkHttpClient.Builder();
//        //方式一:
//        client.proxy(Proxy.NO_PROXY);
//        //方式二:ProxySelector proxySelector = new ProxySelector() {@Overridepublic List<Proxy> select(URI uri) {return null;}@Overridepublic void connectFailed(URI uri, SocketAddress sa, IOException ioe) {}};client.proxySelector(proxySelector);Request request = new Request.Builder().url(url).build();try (Response response = client.build().newCall(request).execute()) {return response.body().string();}catch (Exception e){return e.toString();}}

同样的,上面注释标出的地方也是设置请求不走代理

针对这些我们可以利用Hook相应的方法强行让http请求走代理,这里使用frida来进行hook,代码如下:

if(Java.available){Java.perform(function(){//openConnectionvar URL = Java.use("java.net.URL")var openConnection1 = URL.openConnection.overload("java.net.Proxy")var openConnection2 = URL.openConnection.overload()openConnection1.implementation = function(proxy){console.log("openConnection() proxy = " + proxy)return openConnection2.call(this)}//okhttpvar OkHttpClientBuilder = Java.use("okhttp3.OkHttpClient$Builder")var proxy = OkHttpClientBuilder.proxy.overload("java.net.Proxy")proxy.implementation = function(proxy){console.log("proxy() prxoy = " + proxy)return null}var proxySelector = OkHttpClientBuilder.proxySelector.overload("java.net.ProxySelector")proxySelector.implementation = function(proxySelector){console.log("proxySelector() proxySelector = " + proxySelector)return null}})
}

下面是配套资料,对于做【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!

最后: 可以在公众号:伤心的辣条 ! 免费领取一份216页软件测试工程师面试宝典文档资料。以及相对应的视频学习教程免费分享!,其中包括了有基础知识、Linux必备、Shell、互联网程序原理、Mysql数据库、抓包工具专题、接口测试工具、测试进阶-Python编程、Web自动化测试、APP自动化测试、接口自动化测试、测试高级持续集成、测试架构开发测试框架、性能测试、安全测试等。

学习不要孤军奋战,最好是能抱团取暖,相互成就一起成长,群众效应的效果是非常强大的,大家一起学习,一起打卡,会更有学习动力,也更能坚持下去。你可以加入我们的测试技术交流扣扣群:914172719(里面有各种软件测试资源和技术讨论)

喜欢软件测试的小伙伴们,如果我的博客对你有帮助、如果你喜欢我的博客内容,请 “点赞” “评论” “收藏” 一键三连哦!


好文推荐

转行面试,跳槽面试,软件测试人员都必须知道的这几种面试技巧!

面试经:一线城市搬砖!又面软件测试岗,5000就知足了…

面试官:工作三年,还来面初级测试?恐怕你的软件测试工程师的头衔要加双引号…

什么样的人适合从事软件测试工作?

那个准点下班的人,比我先升职了…

测试岗反复跳槽,跳着跳着就跳没了…

抓包,反抓包,反反抓包相关推荐

  1. Wireshark抓包工具使用教程以及常用抓包规则

    Wireshark是一个非常好用的抓包工具,当我们遇到一些和网络相关的问题时,可以通过这个工具进行分析,不过要说明的是,这只是一个工具,用法是非常灵活的,所以今天讲述的内容可能无法直接帮你解决问题,但 ...

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

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

  3. Wireshark抓包工具使用教程以及常用抓包规则 ——Powered By 死性不改

    原文地址: http://www.clxp.net.cn/article.asp?id=2288 内容: Wireshark是一个非常好用的抓包工具,当我们遇到一些和网络相关的问题时,可以通过这个工具 ...

  4. Wireshark数据抓包教程之认识捕获分析数据包

    Wireshark数据抓包教程之认识捕获分析数据包 认识Wireshark捕获数据包 当我们对Wireshark主窗口各部分作用了解了,学会捕获数据了,接下来就该去认识这些捕获的数据包了.Wiresh ...

  5. android 监听本机网络请求_fiddler如何抓取https请求实现fiddler手机抓包-证书安装失败100%解决...

    一.HTTP协议和HTTPS协议. (1) HTTPS协议=HTTP协议+SSL协议,默认端口:443 (2) HTTP协议(HyperText Transfer Protocol):超文本传输协议. ...

  6. linux怎么抓sip包,Ubuntu下使用Wireshark进行抓包分析(含SIP和RTP包)

    遇到需要在Linux下抓包分析的问题,便用到了wireshark,非常强大的抓包分析软件,直接在系统里面安装,然后使用明亮抓包即可! 我这里用的是Ubuntuserver版,执行安装: 1.apt-g ...

  7. java socket 包头包体_使用JAVA上抓取Socket服务端和客户端通信TCP数据包

    使用Java抓取Socket通信TCP数据包 使用WireShark默认使用的是winpcap去抓本地环回的数据包,需要安装npcap再在Wireshark选择本地环回的网卡抓包 在Java-Sock ...

  8. 安卓抓包软件_你们要的抓包神器!以及抓包原理

    昨天讲到 农行提固定额度失败原因查看方法! 发现好多卡友对这个抓包很有兴趣,今天就着重讲讲抓包的流程. 先讲讲这个抓包的原理:我们手机里面的银行app和服务器连接,把银行app看成是A,把服务器看成是 ...

  9. linux抓包库libpcap,linux下libpcap抓包分析.doc

    linux下libpcap抓包分析 HYPERLINK "/Seiyagoo/archive/2012/04/28/2475618.html" linux下libpcap抓包分析 ...

  10. linux 混杂模式 收包,Linux下使用混杂模式抓包(2)

    有时候不光要抓自己的包,还要抓目的地址不是本机地址的包,既是过路包,这时候就要将监听网卡设为混在模式 这里新添了头文件: net/if.h  定义了ifreq的结构体,既是接口(interface)的 ...

最新文章

  1. SAP CDS view查询的fixed limit
  2. python读取log文件生成图形表_python提取log文件内容并画出图表
  3. java 打印hashmap值_HashMap中输出key-value值得方法
  4. No input file specified的解决方法
  5. AltiumDesigner画图不求人12 AD库转换为PADS库
  6. 我们为什么要骑驴找马?
  7. ray 渲染基本使用流程
  8. 查看支付宝所有交易记录方法
  9. 原创超简单代码(1.19)
  10. React+dva多图片上传
  11. 蛙蛙推荐:蛙蛙教你解析网络包
  12. 自己用jQuery写一个瀑布流
  13. 故障案例:连接服务器失败/服务器无法上网
  14. 最难毕业季,会Python简直可以开挂!!
  15. python图片文本识别的简单实现
  16. 计算机储存文档丢失怎么找,电脑文件丢失如何找回,文件数据丢失恢复方法
  17. 【翻译】WF从入门到精通(第十七章):关联及本地主机通信
  18. 怎样查看和修改配置Git用户名和邮箱
  19. 中央民族大学计算机排名2015,2015年985大学排名排名汇总
  20. C语言结构体和结构体指针的简单用法

热门文章

  1. 微博热榜排行榜zset
  2. 19.为什么要用异步框架,它解决什么问题?
  3. java常量数组吗_java – 如何在注释中使用数组常量
  4. opencv4版本和3版本_Spring Boot 太狠了,一口气发布了 3 个版本!
  5. magento php mysql_Mysql版本过低导致Magento报错的解决方案
  6. python统计文本单词总数_python统计文本文件内单词数量的方法
  7. 12月19日绝地求生服务器维护公告,绝地求生12月19日更新到几点 绝地求生正式服更新维护公告...
  8. linux rsync 目录同步,linux下使用rsync同步目录
  9. sql文件加载出错_四十二、SparkSQL通用数据源加载(load)和保存(save)
  10. 【leetcode】332. Reconstruct Itinerary