一键抓包

中间人一键抓包功能,可以全自动的在设备上开启全局中间人,他与您常用的工具不同之处在于,您无需顾及证书安装设置代理等问题,也无需担心系统不同版本,抓包方法有区别这些问题。他可以无缝应用于安卓 6.0 - 14,我们已经为您处理好了一切,您只需要关心具体业务。 并且支持实时的改包和截获,相比如常用的 GUI 界面程序更适合您作为实际业务使用而不仅仅是 "抓个包看看"。

除此之外,我们可以向您保证没有抓不到的包(证书固定除外),抓包成功率也比常规软件的方法高。您可以截获应用的 http/s 流量,当然也可以包括全局的 DNS 请求。它可以自动应用及撤销中间人,退出脚本后设备及网络也将恢复它原来的样子,您不必做任何其他设置,脚本同时支持国际中间人抓包(通过上游代理实现)让您可以轻松抓取国外软件。

LAMDA 基本使用 (国内及国外抓包)

前期准备

首先确保当前电脑与设备在同一个网段,或者具备 USB 连接,我们后面假设 192.168.0.2 为运行了 LAMDA 的手机设备 IP。其次,确保您已正常克隆项目工具代码以及安装了相关依赖,在命令行验证 mitmproxy 已安装成功(可在命令行输入 mitmdump 进行验证)。

如果您没有 Python 也不熟悉什么克隆和依赖,您可以在我们的发布页面下载到 startmitm.exe,他是 startmitm.py 的打包,您可以在不安装 Python 的情况下执行抓包,这是一个控制台程序,命令参数与 startmitm.py 相同(该文件可能会报毒,请自行决定是否使用)。

基础抓包

您可以通过如下命令快速的进行抓包,这是最简单的使用方法。

python3 -u startmitm.py 192.168.0.2

按下一次 CONTROL + C 即可退出抓包。

共享抓包

如果您想和局域网的小伙伴一起分析,执行如下命令,随后让您的小伙伴用浏览器打开 http://您的IP地址:7890 即可和您看到一样的抓包页面,你们可以一起欢乐的分析。

python3 -u startmitm.py 192.168.0.2 --web-port 7890 --web-host 0.0.0.0

特定应用

如果您需要截获特定应用的流量,而不是系统全局的流量包,您可以通过下面这种方法在 IP 后面加入 :包名 来抓取特定应用的流量数据,以下示例将会只截获 com.some.package 的流量。

python3 -u startmitm.py 192.168.0.2:com.some.package

实时修改

LAMDA 基本使用 (中间人抓包的实时修改及存储)

您可以实时修改应用的请求数据和响应数据,此功能基于 mitmproxy 的事件钩子。您需要自行根据 mitmproxy 相关 API 编写钩子脚本。关于如何编写钩子脚本请参考 mitmproxy 的官方文档 docs.mitmproxy.org/stable/addons-examples 以及示例代码 mitmproxy/examples/contrib

假设您编写的钩子脚本为 http_flow_hook.py,使用以下方式应用钩子脚本。

python3 -u startmitm.py 192.168.0.2 -s http_flow_hook.py

不同网络

如果您的手机和当前电脑不在同一个网络,但是可以物理接触设备,您也可以通过 USB ADB 的方式进行抓包。需要确保当前设备已通过 USB ADB 接入电脑且已正确授权。

如果电脑只连接了一个 ADB 设备,使用如下命令进行抓包,localhost 代表使用 ADB 设备。

python3 -u startmitm.py localhost

如果电脑连接了多个 ADB 设备,您需要指定 adb 串号,请从命令 adb devices 的输出中寻找。

python3 -u startmitm.py localhost --serial bfde362

如果您的环境更苛刻,比如手机与当前电脑既不在同一网络下,也无法物理接触设备,但是只要您可以访问 LAMDA 的端口,也可以进行中间人。这种情况通常为,您使用了内置 frp 服务转发了 LAMDA 到远程服务器,或者您自行通过某种方式转发了 LAMDA 的 65000 端口到某个地方,这种情况下您和 LAMDA 之间仅有这一个端口可以直接交流,其他端口是无法互相访问的。这种情况下,手机无法访问到本机的任何端口,本机也只能访问到手机的 LAMDA 端口(或者手机有公网IP,但本机在内网),这样需要通过以下方式来进行。(OpenVPN 网络互通,并不属于以上情况)

这时,需要通过下面这种组合方式来进行,首先,使用 adb_pubkey.py 或者自行调用接口将自身的 ADB 公钥安装到设备上,安装完毕后继续执行以下过程,其中 x.x.x.x 为可以连接到 65000 端口的 IP 或者 127.0.0.1,依据实际情况修改。

adb connect x.x.x.x:65000

最后,按照和上文一样的方法,通过 USB 抓包来操作。

python3 -u startmitm.py localhost

或者以下这样,这里的 serial 是 adb connect 的地址而不是十六进制串号了。

python3 -u startmitm.py localhost --serial x.x.x.x:65000

上游代理/国际抓包

上游代理模式需要确保 mitmproxy 的版本 >= 9.0.0(且 Python>=3.9)。

startmitm 本身会启动 mitmproxy 作为代理服务,默认情况下流量都是 mitmproxy 从本机网卡发出的,如果您需要流量通过一个上游代理发出而不是本机,可以使用如下方式指定上游代理,仅支持HTTP协议的代理作为上游代理。DNS 流量也会经过上游代理,但是需要指定上游 DOH-DNS,使用该模式将同时开启 DNS 抓包。

DOH 指的是 DNS-Over-HTTP,建议使用的 DNS 有如下几个,您可以依据情况选择。

国外 https://1.1.1.1/dns-query
国外 https://dns.google/dns-query
国内 https://dns.alidns.com/dns-query

因为使用了 DOH-DNS,所以被污染问题将不复存在,您也可以使用此模式进行国际抓包,比如一下命令通过本机克拉西软件的 7890 端口进行国际网络抓包。

python3 -u startmitm.py 192.168.0.2 --upstream http://127.0.0.1:7890 --dns https://dns.google/dns-query

如果是使用国内代理使用 upstream 模式时,那么建议将 DNS 设置为 alidns。

python3 -u startmitm.py 192.168.0.2 --upstream http://x.x.x.x:8080 --dns https://dns.alidns.com/dns-query

如果上游 HTTP 代理需要登录认证,请按以下命令并替换 USER:PASSWORD

python3 -u startmitm.py 192.168.0.2 --upstream http://USER:PASSWORD@x.x.x.x:8080 --dns https://dns.alidns.com/dns-query

DNS抓包

截获 DNS 请求需要确保 mitmproxy 的版本 >= 9.0.0(且 Python>=3.9)。

该功能可以让您方便的进行 DNS 抓包,当然,开启 DNS 抓包也会同时开启普通抓包,您可以截获应用的 DNS 查询信息。以下命令启动 DNS 抓包,并指定上游 DNS 为 114.114.114.114。

python3 -u startmitm.py 192.168.0.2 --dns 114.114.114.114

启动 DNS 抓包,但上游 DNS 使用了非标准的端口如 5353。

python3 -u startmitm.py 192.168.0.2 --dns 192.168.0.100:5353