Skip to content

Commit

Permalink
3.0.45
Browse files Browse the repository at this point in the history
  • Loading branch information
rev1si0n committed Nov 6, 2022
1 parent 9a0a750 commit 789ffaf
Show file tree
Hide file tree
Showing 15 changed files with 261 additions and 93 deletions.
8 changes: 8 additions & 0 deletions CHANGELOG.txt
Original file line number Diff line number Diff line change
@@ -1,3 +1,11 @@
3.0.45
-----------------------
* 支持自定义 server 端口 (--port)
* 目录索引检测文件类型时在特殊文件上卡住
* globalmitm 检查 DNS 服务可用性
* startmitm.py 当存在多个网络时获取了错误的网络接口
* client 通信不再自动使用系统代理

3.0.35
-----------------------
* 提高内置 ADB 性能
Expand Down
32 changes: 26 additions & 6 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,10 @@
![数据库在线浏览](image/dbview.gif)


如果你希望继续看下去,请先确保:手边有一台已经 root 且运行内存 **>= 3GB**,可用存储空间 **>= 1GB** 的安卓设备或者安卓模拟器(推荐使用最新版**夜神****雷电****逍遥**模拟器,或者 AVD [Android Studio Virtual Device])。**不完全支持** 网易 Mumu,**不支持**腾讯手游助手,蓝叠以及任何安卓内虚拟如 VMOS,等),对于真机,推荐运行最接近原生系统的设备如谷歌系、一加、安卓开发板等,或系统仅经过轻度改造的设备。目前**可能不能**在蓝绿厂/华为/小米类高度改造的安卓系统上正常运行,如果你只有此类品牌设备,如果经过尝试无法正常运行,建议使用模拟器。
如果你希望继续看下去,请先确保:手边有一台已经 root 且运行内存 **>= 3GB**,可用存储空间 **>= 1GB** 的安卓设备或者安卓模拟器(推荐使用最新版**夜神****雷电****逍遥**模拟器,或者 AVD [Android Studio Virtual Device])。**不完全支持** 网易 Mumu,**不支持**腾讯手游助手、蓝叠以及任何安卓内虚拟如 VMOS、部分 Docker 类型的云手机、等),对于真机,推荐运行最接近原生系统的设备如谷歌系、一加、安卓开发板等,或系统仅经过轻度改造的设备。目前**可能不能**在蓝绿厂(OPPO/VIVO)/华为/小米类高度改造的安卓系统上正常运行,如果你只有此类品牌设备,经过尝试后无法正常运行,建议改用模拟器。

对于**云手机**,目前已知一些提供商的情况为:X马云手机基本都可以正常使用,X多云手机安卓9.0版本可以正常使用,
不支持X手指、X电、X云兔、X子星(这些云手机很多都是Docker/套中套类型或者限制较多),其余未经测试。

**文档中部分内容太杂可能劝退一些人,为什么文档写了这么多奇怪无关的东西,因为这个文档连大部分你可能遇到的相关问题都写了进来。**

Expand All @@ -94,10 +97,10 @@

为了下载使用由 rev1si0n (账号 github.com/rev1si0n)(以下简称“本人”)个人开发的软件 lamda ,您应当阅读并遵守《用户使用协议》(以下简称“本协议”)。请您务必审慎阅读、充分理解各条款内容,特别是免除或者限制责任的条款,并选择接受或不接受;除非您已阅读并接受本协议所有条款,否则您将无权下载、安装或使用本软件及相关服务。您的下载、安装、使用、获取账号、登录等行为即视为您已阅读并同意受到上述协议的约束;若您需要获得本服务,您(以下称"用户")应当同意本协议的全部条款并按照页面上的提示完成全部申请使用程序。您可以在本文档的相同目录找到 [DISCLAIMER.TXT](DISCLAIMER.TXT),或者点此 [免责声明](DISCLAIMER.TXT) 查阅。

lamda 是一个免费软件 (freeware),暂时仅客户端以及协议是开源的,但个人承诺它没有任何对您违规或多余的行为,互相尊重,使用请遵守以上条款。合作请联系 [ihaven0emmail#gmail.com](mailto:[email protected])

## 前言

lamda 是个人开发的免费软件 (freeware),目前仅客户端及协议是开源的,但个人承诺它没有任何对您违规或多余的行为,如果仍有担心,您可以**立即离开**或者选择**付费**寻求心理安慰。互相尊重,使用请遵守使用条款。合作交流请在 [ISSUE](https://github.com/rev1si0n/lamda/issues/new) 中留下联系方式。

文档目前只是介绍了基本使用,请配合下方示例手动输入语句辅助理解。如果你使用的是 Windows,附带的任何示例代码/命令可能在你的系统上不会正常工作(但是不包括客户端库),建议在 Linux 或者 Mac 系统上操作文档及样例中的代码。

部分功能需要配合 `tools/` 目录下的工具实现,这些工具如何使用请参照 [tools/README.md](tools/README.md)
Expand Down Expand Up @@ -312,10 +315,12 @@ tar -xzf arm64-v8a.tar.gz
```bash
# 你现在应该在 adb shell 内,切换到目录
cd /data/local/tmp
#
# 启动服务端
# 注意,arm64-v8a 这个目录根据平台不同名称也不同
# 如果你使用的是 x86 版本,那么这个目录名则是 x86/,你需要对命令做相应修改
sh arm64-v8a/bin/launch.sh
#
# 如果你想要启用加密传输
# 请先使用 tools/ 中的 cert.sh 来生成 lamda.pem 证书
# 将其push到设备例如 /data/local/tmp/lamda.pem
Expand All @@ -324,6 +329,20 @@ sh arm64-v8a/bin/launch.sh
sh arm64-v8a/bin/launch.sh --certificate=/data/local/tmp/lamda.pem
# 这将加密任何通过 lamda 客户端产生的通信流量
# 但不包括 webui 例如通过浏览器远程桌面的功能
#
# 如果你需要 lamda 监听到特定端口而不是 65000
# 如果修改,请确保所有设备均以相同端口启动
# 否则设备发现等功能可能无法以你预想的状态工作
sh arm64-v8a/bin/launch.sh --port=8123
# 不建议绑定 1024 以下的端口
```

建议在 `/data/local/tmp` 创建如下脚本用来启动 lamda,例如命名为 `start.sh`,以后启动都使用 start.sh 而不是手动敲长命令。

```bash
#!/system/bin/sh
ABI=$(getprop ro.product.cpu.abi)
sh /data/local/tmp/${ABI}/bin/launch.sh #--port=65000 --certificate=/data/local/tmp/lamda.pem
```

静待退出,随即关闭终端,至此服务启动完成。
Expand Down Expand Up @@ -892,7 +911,8 @@ debug.start_ida64(port=22064, IDA_LIBC_PATH="/apex/com.android.runtime/lib64/bio
# 所以在使用之前需要先手动调用以下接口将你的 adb 公钥安装至设备上
# 否则直接连接将会显示未授权(系统设置开发者模式中授权的秘钥与内置 adb 并不通用)
#
# tools 目录下的 adb_pubkey.py 可以帮助你使用命令安装,请查看其 README
# tools 目录下的 adb_pubkey.py 封装了下面接口的安装过程
# 你可以使用该脚本一键授权,允许本机连接,请查看其 README,以下代码仅做参考说明
#
# 这个秘钥文件位于你电脑上的 ~/.android 或者 C:\\Users\xxxx\.android,文件名为 adbkey.pub
# 如果不存在这个文件但是存在文件 adbkey,请切换到该目录并执行命令
Expand Down Expand Up @@ -1003,7 +1023,7 @@ d.start_activity(action="com.android.settings.TRUSTED_CREDENTIALS")

> 授予/撤销 APP 权限

注意,你应在APP未启动时进行权限设置,APP请求时调用并不会产生帮你点击允许的效果
注意,你应在APP未启动时进行权限设置,APP请求权限时调用并不会产生帮你点击允许的效果

```python
app = d.application("com.my.app")
Expand Down Expand Up @@ -1055,7 +1075,7 @@ app.is_installed()
# 卸载应用
app.uninstall()

# 查询该应用的启动 Activity
# 查询该应用的启动 Activity(入口活动)
app.query_launch_activity()

# 启用应用
Expand Down
2 changes: 1 addition & 1 deletion lamda/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,4 +3,4 @@
# Distributed under MIT license.
# See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
__version__ = "3.0"
__build__ = 35
__build__ = 45
5 changes: 3 additions & 2 deletions lamda/client.py
Original file line number Diff line number Diff line change
Expand Up @@ -1552,8 +1552,9 @@ def __init__(self, host, port=65000,
creds = grpc.ssl_channel_credentials(cer)
chann = grpc.secure_channel(self.server, creds,
options=(("grpc.ssl_target_name_override",
self._ssl_common_name(cer)),
))
self._ssl_common_name(cer)),
("grpc.enable_http_proxy",
False)))
else:
chann = grpc.insecure_channel(self.server)
interceptors = [ClientSessionMetadataInterceptor(),
Expand Down
120 changes: 97 additions & 23 deletions tools/README.md
Original file line number Diff line number Diff line change
@@ -1,22 +1,53 @@
这些工具正常情况下只能工作于 linux/mac 系统之上,如果你使用的是 Windows,以`.sh`结尾的脚本应该无法正常工作。
这些工具正常情况下只能工作于 linux/mac 系统之上,为个人常用功能的封装,并未特意考虑兼容 Windows 但是这不代表 lamda 不支持。如果你使用的是 Windows,以`.sh`结尾的脚本应该无法正常工作。

> 使用之前,请确保已安装 adb 以及启动设备上的 lamda 服务端。
> 需要注意,一次只能连接一个设备到当前电脑。所以脚本均不支持同时插入的多个USB ADB设备。
> 使用之前,请确保已经启动设备上的 lamda 服务端。
## 前置条件
安装所需的依赖包

部分功能需要安装 adb,如果要用到,请确保已安装 adb 且不要太过老旧。

**需要注意**:所有使用到 adb 的脚本均 只支持一台手机通过 USB (adb) 连接电脑,请确保 `adb devices` 中只有一个设备。

```bash
pip3 install -r requirements.txt
# 如果没有安装,请 自行搜索 如何安装,这里提供的只是基础建议
# Windows
https://developer.android.com/studio/releases/platform-tools
# Mac
brew install android-platform-tools
#brew cask install android-platform-tools
# Debian/Ubuntu
apt install adb
```

为了确保部分通过本地USB操作的功能正常进行,请在开始前连接USB线并开启授权**开发者调试**功能,随后执行
克隆代码到本地

```bash
adb forward tcp:65000 tcp:65000
git clone https://github.com/rev1si0n/lamda.git
# 如果不会使用或未安装 git,下载此文件到本地并解压
# https://github.com/rev1si0n/lamda/archive/refs/heads/master.zip
```

进入 tools 目录并安装所需的依赖包
```bash
# 切换到 tools/ 目录并执行
pip3 install -r requirements.txt
```

如果你在服务端启用了通信加密(certificate),你需要在使用前设置环境变量 `CERTIFICATE`
```bash
# 对于 linux / Mac
export CERTIFICATE=/path/to/lamda.pem
# 对于 Windows(路径不能包含空格)
set CERTIFICATE=C:\Users\path\to\lamda.pem
```

如果你修改了 lamda 的默认端口 65000,也需要在使用前设置环境变量

```bash
# 对于 linux / Mac
export LAMDAPORT=8123
# 对于 Windows(路径不能包含空格)
set LAMDAPORT=8123
```

192.168.1.2 为示例IP,请自行获取设备的实际IP地址。
Expand All @@ -41,24 +72,26 @@ bash cert.sh device1.example.com
如果操作系统不方便使用此工具,当前目录下已经为你准备好了一个默认的 SSL 证书

```bash
test.id_rsa # 用于连接 SSH 的对应 ID_RSA
test.pem # 用于加密客户端与服务端通信的证书
```

## cert.py

用来生成用于传输加密的证书,等效于 `cert.sh` 只不过这个脚本同时可以运行于 Windows,用法等同于 cert.sh。

> 注:你有可能需要手动安装依赖库 `pip install pyOpenSSL`
> 注:你有可能需要手动安装 pyOpenSSL 依赖库 `pip install pyOpenSSL`
## startmitm.py

启动中间人,这将会完全自动的在设备上开启全局的中间人,你就可以截获应用的 http/s 流量,当然,也包括 DNS 请求。
启动中间人,这将会全自动的在设备上开启全局的中间人,你就可以截获应用的 http/s 流量,当然,也可以包括 DNS 请求(全局)

首先确保当前电脑与设备在同一个网段,192.168.1.2 为运行了 lamda 的手机设备。
其次,确保你已在命令行验证 mitmproxy 已安装成功(在命令行输入 `mitmdump` 进行验证)。
如果你是首次使用 mitmproxy,请在执行脚本前手动执行一次命令 `mitmdump` 并退出来完成
mitmproxy 的初始化操作。

当然,电脑与设备不在同一网段或者是远程设备,你也可以轻松 mitm,请继续看下去。

> 注意:mitmweb 并不适合长时间多请求,其截获的请求均存储于内存之中。所以在长时间使用的情况下你的内存会被吃光。
> 对于长时间的中间人操作,请改用 mitmdump,请自行了解使用方法。
执行
```bash
Expand All @@ -68,29 +101,61 @@ python3 -u startmitm.py 192.168.1.2

如果需要截获特定应用的流量而不是全局
```bash
# 这里的 com.some.package 是应用的 ID
python3 -u startmitm.py 192.168.1.2:com.some.package
```
即可。

如果需要传递其他参数到 mitmproxy,例如 -s,则执行
```bash
# 这样你就可以通过编写 http_flow_hook.py 实时修改请求或者响应
python3 -u startmitm.py 192.168.1.2 -s http_flow_hook.py
```
任何 192.168.1.2 之后的参数将传递给 mitmproxy

即使手机与当前电脑不在同一网段,你仍然可以使用在本机截获流量,但是需要先完成**前置条件**
关于如何编写 `http_flow_hook.py` 脚本,请参考 [docs.mitmproxy.org/stable/addons-examples](https://docs.mitmproxy.org/stable/addons-examples/)

> 任何 192.168.1.2 之后的参数将传递给 mitmproxy 本身
即使手机与当前电脑不在同一网段,你仍然可以使用在本机截获流量,但是**需要确保当前设备已通过USB接入**电脑且已ADB授权。
```bash
python3 -u startmitm.py localhost
```

如果手机不在身边,也和你的电脑不在同一网段,但是你可以访问 lamda 的端口,
**这种情况通常为**:你使用了内置 frp 服务转发了 lamda 到远程服务器,
或者你自行通过某种方式仅转发了 lamda 的 65000 端口到某个地方,这种情况下你和 lamda 之间
**仅有这一个端口**可以直接交流,其他端口是无法访问的。这种情况下,手机无法直接访问到本机的任何端口,需要通过以下方式来完成。(注意 OpenVPN 并不属于这个情况)

这时,需要通过稍微繁琐的组合方式来进行,下面介绍如何操作。

首先,使用 `adb_pubkey.py` 或者自行调用接口将自身的 adb 公钥安装到设备上(请在本文档搜索),
随后,确保当前电脑没有任何 USB ADB 设备连接(`adb devices` 显示无设备)。

现在执行以下命令

```bash
adb kill-server
# 如果你使用了内置 frp 或者自行使用了 ssh 转发,
# 这里的 x.x.x.x 通常为 127.0.0.1,请依据事实修改
# 而这里的 65000 也非固定,依据你实际设置的目的转发端口做修改
adb connect x.x.x.x:65000
```

最后,按照和上文 通过USB 一样的方法操作
```bash
# localhost 代表使用 adb 设备
python3 -u startmitm.py localhost
```

即可。

注意:你可能需要完全结束APP并重新打开使其生效
注意:你可能需要完全结束APP并重新打开才会显示流量数据

按下一次 `CONTROL` + `C` 退出脚本。

### DNS 中间人

截获 DNS 请求需要确保 mitmproxy 的版本 >= 8.1.0,且需要以**管理员**或者**root**身份运行脚本。
截获 DNS 请求需要确保 mitmproxy 的版本 >= 8.1.0(且 Python>=3.9),且需要以**管理员**或者**root**身份运行脚本。
```bash
python3 -u startmitm.py 192.168.1.2 --set dns_server=true
```
Expand Down Expand Up @@ -167,7 +232,7 @@ bash scp.sh test/ 192.168.1.2:/sdcard

## discover.py

列出本地网络中所有在线的设备(部分网络情况下可能一些设备没有列出,请多次尝试)
列出**本地网络**中所有在线的设备(部分网络情况下可能一些设备没有列出,请多次尝试)

```bash
python3 discover.py
Expand Down Expand Up @@ -214,14 +279,23 @@ print (data["result"])
bash emu-install 192.168.1.2
```

## globalmitm/

用于分析需要透过 ss 实现需要代理才能连接的国外APP的流量,请转至其目录查看使用方法。
## 各种服务脚本 (Docker)

> 所有镜像均为 x86 平台,在 ARM 处理器的 Linux/Mac 上使用你可能要自行做出修改并重新生成。
### openvpn

开箱即用的 OpenVPN 服务

### globalmitm

用于分析需要透过 ss 实现需要代理才能连接的国外APP的流量

## openvpn/
### frps

开箱即用的 OpenVPN docker,请转至其目录查看使用方法。
开箱即用的 frp 端口转发

## socks5/
### socks5

开箱即用的 socks5 代理服务,请转至其目录查看使用方法。
开箱即用的 socks5 代理服务
4 changes: 3 additions & 1 deletion tools/adb_pubkey.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,9 @@
cmd, host = sys.argv[1:]

certfile = os.environ.get("CERTIFICATE", None)
d = Device(host, certificate=certfile)
port = int(os.environ.get("LAMDAPORT", 65000))

d = Device(host, port=port, certificate=certfile)

shutil.which("adb") or exit("no adb")

Expand Down
3 changes: 0 additions & 3 deletions tools/cert.sh
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,6 @@ openssl rsa -passin pass:$PSW -in ${CN}.key -out ${CN}.key
openssl x509 -in ${CN}.crt -text -noout >${CN}.pem
cat ${CN}.{crt,key} >>${CN}.pem
openssl rsa -in ${CN}.key -outform der 2>/dev/null | openssl md5 | awk '{print $NF}' >>${CN}.pem
openssl rsa -in ${CN}.pem -outform pem >${CN}.id_rsa
chmod 600 ${CN}.pem ${CN}.id_rsa

echo certificate: $(pwd)/${CN}.pem
echo id_rsa: $(pwd)/${CN}.id_rsa
rm ${CN}.{csr,crt,key}
5 changes: 4 additions & 1 deletion tools/discover.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
#!/usr/bin/env python3
import os
import struct
from socket import *

Expand All @@ -12,6 +13,8 @@
BcastResponse = protos.BcastResponse
BcastRequest = protos.BcastRequest

port = int(os.environ.get("LAMDAPORT", 65000))


def BcastCallMethod(method):
req = BcastRequest(method=method)
Expand All @@ -34,7 +37,7 @@ def BcastCallMethod(method):
sock = socket(AF_INET, SOCK_DGRAM)
sock.setsockopt(SOL_SOCKET, SO_BROADCAST, 1)
message = BcastCallMethod("DISCOVER")
sock.sendto(message, ("255.255.255.255", 65000))
sock.sendto(message, ("255.255.255.255", port))
sock.settimeout(3.0)

while True:
Expand Down
4 changes: 3 additions & 1 deletion tools/fridarpc.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,14 @@
from lamda.client import *

cert = os.environ.get("CERTIFICATE", None)
port = int(os.environ.get("LAMDAPORT", 65000))

parser = argparse.ArgumentParser()
parser.add_argument("-d", type=str, dest="device",
help="service ip address", required=True)
parser.add_argument("-a", type=str, dest="package",
help="target application Id", required=True)
parser.add_argument("-p", type=str, dest="port", default=65000,
parser.add_argument("-p", type=str, dest="port", default=port,
help="service port")
parser.add_argument("-f", type=argparse.FileType("r"), dest="script",
help="frida script", required=True)
Expand Down
2 changes: 1 addition & 1 deletion tools/globalmitm/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ RUN sed -i "s/deb.debian.org/${SOURCESMIRROR}/g" /etc/apt/sources.list
RUN sed -i "s|security.debian.org/debian-security|${SOURCESMIRROR}/debian-security|g" /etc/apt/sources.list

RUN apt-get update && apt-get -y upgrade
RUN apt install -y git adb wget privoxy python3 python3-pip
RUN apt install -y git adb wget privoxy dnsutils python3 python3-pip

COPY entry /usr/bin/mitm
RUN chmod 755 /usr/bin/mitm
Expand Down
2 changes: 2 additions & 0 deletions tools/globalmitm/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,8 @@ ss://aes-256-gcm:password@IP地址:9090
docker run --rm -it --net host -e SS=ss://aes-256-gcm:password@IP地址:9090 rev1si0n/mitm 192.168.x.x
```

如果显示 `Cannot resolve DNS through...`,请确保你的 SS 启用了 `-u` 选项。

> 普通模式
```bash
Expand Down
Loading

0 comments on commit 789ffaf

Please sign in to comment.