工具crylogger部署记录
# 描述
部署工具crylogger。
(前言:配置过程还挺折磨,折腾了两三天,包括在主机尝试配置,在docker中运行等等。感觉配置过程太依赖AI了,有些错误解决方法其实网络上面的经验帖更准确一些。)
(在部署中遇到了许多问题,尝试了许多方案。下面写的是成功的,顺便会在最后附上猜测可能会成功的方案)
# 步骤(还需要再验证一下)
接下来进行的操作实际较长,为了防止本地与远程服务器断联风险,可以使用tmux命令。接下来的命令都在tmux窗口内进行。
tmux new -s <name> # 创建新窗口,例子 tmux new -s crylogger
tmux attach -t <name> # 进入窗口,例子 tmux attach -t crylogger
2
# 1、配置环境
- 编译aosp。
首先需下载ubuntu18.04docker,需要提前配置好docker国内镜像源。
编写docker file如下
FROM ubuntu:18.04
# 避免安装软件时弹出交互式配置界面卡住
ENV DEBIAN_FRONTEND=noninteractive
# 1. 将软件源替换为阿里云镜像
RUN sed -i 's/archive.ubuntu.com/mirrors.aliyun.com/g' /etc/apt/sources.list && \
sed -i 's/security.ubuntu.com/mirrors.aliyun.com/g' /etc/apt/sources.list
# 2. 安装 AOSP 编译所需的核心依赖包(增加了 locales)
RUN apt-get update && apt-get install -y \
git-core gnupg flex bison build-essential \
zip curl zlib1g-dev gcc-multilib g++-multilib \
libc6-dev-i386 lib32ncurses5-dev x11proto-core-dev \
libx11-dev lib32z1-dev libgl1-mesa-dev libxml2-utils \
xsltproc unzip fontconfig python2.7 python-pip \
ccache rsync sudo locales wget openjdk-8-jdk vim lzip python3-pip python3 \
libpulse0 libgl1-mesa-glx libgl1-mesa-dri libx11-6 libxcb1 libxcb-shm0 libxcb-xfixes0 \
&& rm -rf /var/lib/apt/lists/*
# 配置 sudo 组免密(关键)
RUN echo '%sudo ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers
# 3. 生成 en_US.UTF-8 locale 数据(彻底解决 warning)
RUN locale-gen en_US.UTF-8
# 4. 将 python2 设为默认
RUN ln -sf /usr/bin/python2.7 /usr/bin/python
# 5. 安装 repo 工具
RUN curl -o /usr/local/bin/repo https://mirrors.tuna.tsinghua.edu.cn/git/git-repo && \
chmod a+x /usr/local/bin/repo
# 6. 设置 UTF-8 环境
ENV LANG=en_US.UTF-8 \
LANGUAGE=en_US:en \
LC_ALL=en_US.UTF-8
# 7. 配置 ccache 环境变量
ENV USE_CCACHE=1 \
CCACHE_DIR=/ccache \
CCACHE_EXEC=/usr/bin/ccache
# 创建普通用户并切换(放在最后)
ARG UID=1000
ARG GID=1000
ARG USERNAME=builduser
RUN groupadd -g ${GID} ${USERNAME} 2>/dev/null || true && \
useradd -m -u ${UID} -g ${GID} -G sudo -s /bin/bash ${USERNAME}
# 如果需要创建 /aosp 并改属主,可以在这里做(root 时创建并 chown)
RUN mkdir -p /aosp && chown ${USERNAME}:${USERNAME} /aosp
USER ${USERNAME}
WORKDIR /aosp
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
依据docker file进行构建
docker build \
--build-arg UID=$(id -u) \
--build-arg GID=$(id -g) \
--build-arg USERNAME=$(whoami) \
-t ubuntu_new:18.04 .
2
3
4
5
下载好之后,启动镜像
docker run -it \
--name crylogger_build03 \
--cap-add=SYS_ADMIN \
--security-opt seccomp=unconfined \
--device /dev/kvm \
-v /data/gaoyq/crylogger/emu_docker/source:/aosp \
-v /data/gaoyq/crylogger/emu_docker/ccache:/ccache \
ubuntu_new:18.04 \
/bin/bash
2
3
4
5
6
7
8
9
克隆crylogger库
git clone https://github.com/lucapiccolboni/crylogger.git
接下来就可以运行对应的脚本文件了,不过由于国内网络的问题,有些脚本代码需要修改。为了方便调试起见,接下来就手动输入命令了。不过最后也会放上使用脚本代码的方式。
进入克隆的仓库文件夹,创建android-emu文件夹
cd crylogger
mkdir android-emu
cd android-emu
2
3
先配置git信息,避免最后卡住
git config --global user.email "myeeygo@qq.com"
git config --global user.name "myeeygo"
2
执行repo初始化
# 这个部分的等待时间比较长
repo init -u https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/platform/manifest -b android-9.0.0_r36 --depth=1 --repo-url=https://mirrors.tuna.tsinghua.edu.cn/git/git-repo
# repo init 最后会选择“Enable color display in this user account (y/N)? ”,默认回车就行
repo sync
2
3
4
代码同步完成之后,修改覆盖相关配置
# 假设当前在crylogger/scripts目录下面,执行下面命令
rsync -a deltas/libcore/ ../android-emu/libcore/
rsync -a deltas/frameworks/ ../android-emu/frameworks/
2
3
接下来修改 android-emu/art/runtime/mem_map.cc 文件,防止地址随机化导致编译不成功。
# 假设当前在crylogger目录下面
vim android-emu/art/runtime/mem_map.cc
# 在vim编辑器中,输入
:set nu # 设置行号显示
507G #跳转到文件的第507行
# 在 flags |= MAP_FIXED; 这行后面添加以下代码
#if !defined(ART_TARGET)
} else if (expected_ptr) {
#define MAP_FIXED_NOREPLACE 0x100000
flags |= MAP_FIXED_NOREPLACE;
#endif
即原来的上下文是
flags |= MAP_FIXED;
} else {
CHECK_EQ(0, flags & MAP_FIXED);
修改后变成了
flags |= MAP_FIXED;
#if !defined(ART_TARGET)
} else if (expected_ptr) {
#define MAP_FIXED_NOREPLACE 0x100000
flags |= MAP_FIXED_NOREPLACE;
#endif
} else {
CHECK_EQ(0, flags & MAP_FIXED);
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
给当前用户配置kvm组,防止之后启动模拟器不成功
# 输入以下命令,查看kvm的权限
ls -l /dev/kvm
# 输出可能类似以下所示
crw-rw---- 1 root 994 10, 232 Jul 1 06:29 /dev/kvm
# 手动创建组并添加用户
sudo groupadd -g 994 kvm
sudo usermod -aG kvm $(whoami)
newgrp kvm # 刷新组
# 如果输出类似 crw-rw---- 1 root kvm 10, 232 ... ,那么不需要创建组,执行下面命令即可
sudo usermod -aG kvm $USER
newgrp kvm # 刷新组
2
3
4
5
6
7
8
9
10
11
12
接下来尝试编译
# 进入android-emu文件夹
cd ./android-emu
# 生效相关环境变量
source ./build/envsetup.sh
# 设置编译目标并进行编译
lunch sdk_phone_x86_64-userdebug
make -j $(nproc) 2>&1 | tee build.log
# 编译时的所有输出都保存在 build.log 文件中。如果报错,可以使用 grep 命令查找对应输出
2
3
4
5
6
7
8
编译成功后,启动模拟器
# 在android-emu文件夹下面
source build/envsetup.sh
lunch sdk_phone_x86_64-userdebug
# 启动配置设置成没有屏幕、音频,可写系统,使用CPU模拟GPU,并且使用间接渲染路径,避免因图形驱动崩溃导致模拟器进程异常终止。
emulator -writable-system -no-window -no-audio -gpu swiftshader_indirect
# 执行上述命令后,只要看到 emulator: INFO: boot completed 这个输出,就证明启动成功了
2
3
4
5
6
上述模拟器占用了一个终端,接下来重新打开一个终端,并进入docker容器
# 首先查看正在运行的容器,记住NAMES那一列的名称,假如容器名称为crylogger_build02
docker ps
docker exec -it crylogger_build02 /bin/bash
2
3
接下来为了安装自行构建的apk文件,下载 open_gapps
# 在crylogger/scripts 文件夹下面
mkdir opengapps && cd opengapps
wget https://sourceforge.net/projects/opengapps/files/x86/20210126/open_gapps-x86-9.0-super-20210126.zip
unzip open_gapps-x86-9.0-super-20210126.zip
rm Core/setup*
lzip -d Core/*.lz
# 接着执行下面三行命令,一起复制即可,它们是一个命令组
for f in $(ls Core/*.tar); do
tar -x --strip-components 2 -f $f
done
2
3
4
5
6
7
8
9
10
接下来构建app,下载sdkmanager
sudo mkdir -p /opt/android-sdk/cmdline-tools
sudo chown -R $(whoami):$(whoami) /opt/android-sdk
cd /opt/android-sdk/cmdline-tools
wget https://dl.google.com/android/repository/commandlinetools-linux-6609375_latest.zip
unzip commandlinetools-linux-6609375_latest.zip
mv tools latest # 重命名为 latest
export ANDROID_SDK_ROOT=/opt/android-sdk # 可以加入到 ~/.bashrc 中
export PATH=$ANDROID_SDK_ROOT/cmdline-tools/latest/bin:$PATH # 可以加入到 ~/.bashrc 中
# 接受所有许可证
yes | sdkmanager --licenses
2
3
4
5
6
7
8
9
10
进入 crylogger/app-test目录,构建apk
cd crylogger/app-test
# 如果下面构建命令运行有问题,可以先运行下面这条命令
# echo "sdk.dir=/opt/android-sdk" > local.properties
./gradlew build #构建apk
# 生成的apk文件为 crylogger/app-test/app/build/outputs/apk/debug/app-debug.apk
cp app/build/outputs/apk/debug/app-debug.apk ../scripts/data/apks/com.example.aes_0.apk #复制到对应目录。命名是有要求的,格式为 <package_name>_<version>.apk
2
3
4
5
6
# 2、运行程序
接下来进行apk运行分析阶段
#首先运行adb,获得运行中模拟器的编号
# 假设当前在crylogger目录下面,先配置环境变量
cd ./android-emu
source ./build/envsetup.sh
lunch sdk_phone_x86_64-userdebug
adb devices
#输出如 emulator-5554 所示,记录下来
# 接下来运行脚本,假设当前在crylogger目录下面
cd scripts
python run.py --work_dir data --session emulator-<number>
# 例子 python run.py --work_dir data --session emulator-5554
# 输出的日志在 crylogger/scripts/data/crypto_logs 目录下面
2
3
4
5
6
7
8
9
10
11
12
13
# 到了这里好像运行有问题,无法产生日志
接下来分析日志
# 首先下载相关python库
pip3 install zxcvbn
# 假设目前在crylogger目录
cd scripts
python check.py --work_dir data/crypto_logs --rule_id <rule_number>
# 项目自带26个规则。运行的命令例子:python3 check.py --work_dir data/crypto_logs --rule_id 03
# 如果想要检测全部规则,去掉 --rule_id 参数即可,即运行下面命令
python3 check.py --work_dir data/crypto_logs
# 分析结果在crylogger/scripts/data/crypto_logs目录下面,以 .rules 结尾。例如com.example.aes_0.rules
2
3
4
5
6
7
8
9
# PS
# 参考资料
https://android-review.googlesource.com/c/platform/art/+/2226578/1/runtime/mem_map.cc#511
https://source.android.google.cn/docs/setup/start/requirements?hl=zh-cn
2
3
猜测可能会成功的另一种方案
其实直接在主机 ubuntu24 上面配置应该也可以
主要的问题就是修改 android-emu/art/runtime/mem_map.cc 文件。此外还有flex自行编译。创建 libncurses.so.5、libtinfo.so.5 软连接到 libncurses.so.6、libtinfo.so.6等。
2
如果启动模拟器之后,一直出现时间的警告### WARNING: could not find /usr/share/zoneinfo/ directory. unable to determine host timezone,可以运行下面命令消除
# 安装时区数据(需要 root 权限)
sudo apt-get update && sudo apt-get install -y tzdata
# 选择时区时,选择 6. Asia 和 70. Shanghai 即可
2
3