花一周时间撸了一遍mitmproxy

1. 第一次接触mitmproxy

首次看到mitmproxy这个关键字应该是在看思寒老师的公开课上(为啥是应该,因为我也不知道具体是啥时候了,但不是上周四的直播课上,但想去深入学习它又是因为在上周四的直播课中见到了一次),所以分享一下学习mitmproxy的过程 。

2. 深入学习mitmproxy

上周四公开课蚊子老师有个课后作业,是准备好mitmproxy环境,由对新工具新知识充满好奇,所以我去百度搜索了一下,然后去看了它的官方文档。官网第一眼给我的感觉就是简洁,有图,文字不多,不用花很多时间去阅读那么多的内容(对一大推文字的内容比较没有足够的耐心)。so…看了一遍首页之后就直接跳到官方文档里去了。

我学习mitmproxy的过程大体可以分为两个阶段:

  • 阅读官方文档
  • 实践(时间过程中反复阅读文档)

2.1 阅读官方文档

因为自己用过几款代理工具(fiddler,charles,whistle),首次阅读官方文档并没有花我太多的时间,基本上不到半天就搞定,对工具的使用很快就能入手。文档中对我最有吸引力的地方就是addon开发,所以在后面的实践过程中,更多的也是对addon的开发和调试。

2.2 实践(addon 开发)

这个过程还算是一个比较让我开心的过程,遇到问题解决问题。比如 在request方法中直接修改response的statu_code的时候报错,在response方法中修改response的status_code就行,弄死搞不清为何不能修改,反复调试了几次,结果依然一样(这里我误以为request方法中的flow.response和response方法中的flow.response都不为None),最后加了调试信息后,才发现两个地方的flow是不一样的。

flow.response.status_code=200   #在request的时候,flow.response为None

在解决这些问题的过程中,不断的调试、断点、阅读源码,对它也越来越熟悉。再后来熟悉了addon的开发之后,由于不满足于目前只是对它的addon开发。所以想着自己做一个额外的功能。

2.3 扩展

功能需求:仿照whistle的Rule特性,基于mitmprox实现另一种mapLocal和mapRemote
whistle地址:whistle

### rule:具体的规则,比如:
https:www.baidu.com reqHeaders://{"language":"en"} https://www.sina.com.cn/  #mapRemote,并增加/修改请求头信息为{"language":"en"}
https:www.baidu.com resHeaders://{"language":"en"} resBody://{"code":200,"data":null,"msg":null} # mapLocal,并增加或修改响应头和响应体

此扩展功能只需要添加或修改rule规则即可,不需要再针对不同的场景单独开发脚本,目前已实现部分功能,待完善…

3. 总结一下

学习mitmproxy这个过程还是比较开心,虽然时间不长,但收获还比蛮大,但还有进步的空间。

  1. mitmproxy的原理还未完全搞懂
  2. 源码没完全阅读(遇到了有疑问就去阅读一下源码)
  3. 已经很久没有写过这么多代码,逻辑思维有点跟不上,一些基本的方法会遗忘,希望还能捡起来
  4. 幸好学习新技术的热情还在

文档写的有点烂,希望看到了的老师或同学们不要介意。哈哈哈

2 Likes