安卓aosp编译刷机过root检测

前提设备:

​ 一部已经解锁oem的手机,我这里用的是pixel3a

​ 虚拟机内安装ubuntu系统,版本是 18.04.6,其它版本也没有什么问题

刷机

1.根据机型确定镜像文件与驱动

我的手机是pixel3a,准备刷安卓10

2.系统初始化

  • Python软连接

    1
    sudo ln -s /usr/bin/python3.6  /usr/bin/python
  • git

    1
    sudo apt install git -y
    1
    2
    git config --global user.name "xxxx"
    git config --global user.email "xxxx@live.com"
  • curl

    1
    sudo apt install curl -y
  • 其他(可选)

    1
    sudo apt install net-tools openssh-server vim -y

3.同步源码

利用清华源去同步源码,国内主要是:清华源、中科大源(推荐清华)。

https://mirrors.tuna.tsinghua.edu.cn/help/AOSP/

  • 下载repo + 环境变量 + 可执行权限

    1
    2
    3
    4
    mkdir ~/bin
    PATH=~/bin:$PATH
    curl https://mirrors.tuna.tsinghua.edu.cn/git/git-repo > ~/bin/repo
    chmod a+x ~/bin/repo
  • 环境变量

    1
    export REPO_URL='https://mirrors.tuna.tsinghua.edu.cn/git/git-repo'
  • 创建aosp文件夹目录(以后放在代码)

    1
    2
    3
    cd ~/bin
    mkdir aosp
    cd aosp
  • 指定同步版本

    1
    repo init -u https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/platform/manifest -b 自己的安卓版本
    1
    repo init -u https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/platform/manifest -b android-10.0.0_r2
  • 开始同步代码

    1
    repo sync -j4

    这里同步所需要的时间非常长,建议晚上睡觉的视乎再同步,同步完,就会显示如下提示

    建议:打上快照

image-20230607180134980

4.执行驱动程序

将下载的驱动程序解压出来放到aosp目录下,执行这两个脚本

image-20230608142925501

image-20230607181400554

image-20230607181449604

另一个脚本也是相同的操作

image-20230607181612505

5.编译aosp源码

1
2
3
4
cd ~/bin/aosp
source build/envsetup.sh
lunch // 这里会让你选择相对应的版本,我的手机是pexel3a,对应的标识是sargo,其它版本的手机标识不一样
选择序号

userdebug的意思是默认手机已root

image-20230607183319002

image-20230607183518705

然后 make -j16 开始编译,16指的是16个并发

如果报错的话,根据报错去搜索对应的解决方法

image-20230607184430488

image-20230608092209206

6.刷入系统

再Ubuntu内安装platform-tools

需要先将手机连接至虚拟机,将手机usb连接电脑,会弹出下面对话框,选择连接到虚拟机就好

image-20230608104839198

安装 platform-tools

推荐的版本是 platform-tools_r30.0.5 其它版本可能会报错

  • 下载(根据系统选择)
    https://dl.google.com/android/repository/platform-tools_r30.0.5-linux.zip

  • ubuntu配置

    1
    2
    3
    4
    第1步:解压platform-tools并放在用户根目录,例如:~/platform-tools/adb
    第2步:配置环境环境变量 gedit ~/.bashrc
    第3步:source ~/.bashrc
    第4步:执行adb或fastboot时,前面记得加sudo
    1
    2
    export PATH=~/platform-tools:$PATH
    alias sudo="sudo env PATH=$PATH"

执行以下命令:

1
2
3
4
5
6
7
8
9
sudo adb devices
sudo adb reboot bootloader

sudo fastboot devices

cd ~/bin/aosp
source build/envsetup.sh
sudo ANDROID_PRODUCT_OUT=/home/lli/bin/aosp/out/target/product/sargo fastboot flashall -w // 这里的路径是编译后生成的路径,需要改成自己的

image-20230608143845802

image-20230608143857055

image-20230608140536749

刷机完成,刷完会会是一个相对古老的界面

image-20230608144140417

https证书

为什么

安卓七及以后的系统想要抓https的包需要将用户层的证书移到系统层,可以在已root的环境下通过magisk的move cert插件将证书移至系统层

在手机刷入aosp系统后,可以通过修改aosp源码,将证书移入系统,重新编译,再刷入手机

证书下载

image-20230611141646401

需要使用openssl工具对证书进行处理

OpenSSL证书处理

需要提前在自己电脑上下载并安装 OpenSSL。

http://slproweb.com/products/Win32OpenSSL.html

image-20220428191016704

image-20230611142546996

运行 openssl工具 x509 -subject_hash_old -in 证书文件路径,然后将证书重命名为运行后的字符串.0

image-20230611142609404

至此,我们就将证书文件处理成了 6f33e75b.0 文件(你的文件名可能跟我的不一样)

将证书文件放到aosp路径下的 system/ca-certificates/files目录

image-20230611143048235

Root检测

原理:

手机已root后,手机系统目录下会有一个su文件,每次获取root权限时,都会调用该文件

大部分的app进行root检测时,都会去找这个su文件,一旦找到,就认定你是进入root模式

除此之外,还有一些会检测你手机上有没有magisk之类的软件

绕过:

hook:去找到触发root检测的代码位置,然后进行修改或者返回为空

定制aosp:修改源码,隐藏或者不生成su文件,而拥有root权限

编译选项:

1
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
android编译的时候可以选择编译选项 eng、user 和 userdebug。

1.eng编译选项
(1). 系统编译的时候安装标签LOCAL_MODULE_TAGS为 user、debug、eng 的模块
(2). 设定属性 ro.secure=0,关闭安全检查功能
(3). 设定属性 ro.debuggable=1,启用应用调试功能
(4). 默认打开 adb 功能,adb默认拥有root权限
(5). 编译完成之后系统会带有eng字眼的文件

2.userdebug编译选项【默认】
(1). 系统编译的时候安装标签LOCAL_MODULE_TAGS为 user、debug 的模块
(2). 设定属性 ro.secure=1,打开安全检查功能
(3). 设定属性 ro.debuggable=1,启用应用调试功能
(4). 默认打开 adb 功能,adb拥有root权限
(5). userdebug与“user”类似,但具有root权限和调试功能;是进行调试时的首选编译类型

3.user编译选项
(1). 系统编译的时候安装标签LOCAL_MODULE_TAGS为 user的模块
(2). 设定属性 ro.secure=1,打开安全检查功能
(3). 设定属性 ro.debuggable=0,关闭应用调试功能
(4). 默认关闭 adb 功能,adb无root权限
(5). 权限受限,适用于生产环境

综上总结:
eng就是工程师用的开发测试环境,方便开发调试各种软硬件之间的交互、性能等等。
userdebug就是user版本发布之前的开发调试版本
user就是生产环境用的版本,平时我们正规渠道买的手机都是user版本的。

目前很多App检测运行环境是否正常的检测点之一就是检测当前运行的系统属于哪个编译选项。eng、userdebug都是属于风险设备考虑范畴。

最终我们编译时,要选择user版本,通过修改源码,让其默认拥有root权限,且没有eng和su特征

开启user模式:

我们再编译选择版本时,默认都只有userdebug的选项,默认是没有user模式的,我们需要修改源码,让其拥有user模式,这里需要知道你手机的代号,pixel3a是sargo,其他不同版本的pixel手机代号不一样

image-20230607183518705

打开文件 aosp/device/google/sargo/AndroidProducts.mk,我们可以看到,再google目录下没有sargo目录,这里的文件名就代表这不同版本的pixel手机,我们在这个目录下搜索 AndroidProducts.mk 文件

image-20230611152122985

location代表文件夹名称,第一个bonito代表的是 pixel 3a xl版本,我们打开文件看一下,可以发现 3a 和 3a xl的配置在同一个文件内,我们在文件最后一行添加一个 aosp_sargo-user \ 代表添加sargo的user版本

image-20230611152244985

image-20230611152335318

image-20230611152944242

image-20230611170101861

开放root权限:

手机中有一个进程叫做adbd,我们通过adb shell连接的就是adbd进程,而默认的adbd是没有root权限,我们修改源码就是修改 adbd的权限,让其默认拥有最高权限

在默认情况下,系统会给adb降级让其不具备root权限,我们只需要在源码中修改让其不降级,就可以拥有最高权限

找到这个文件 aosp/system/core/adb/daemon/main.cpp在代码的这个部分就是判断adbd是否又root权限,我们之间在这里返回fasle,让它不走下面的流程,就可以完成root权限操作

image-20230611154232194

image-20230611154401135

然后重新编译刷入手机,既可以完成默认拥有root权限,且没有su文件和其它特征,可以过掉大部分的root检测

其它特征检测:

tags:

在我们使用aosp刷入手机后,会在手机的系统路径下 /system/build.prop 该文件主要展示一些 系统初始化的一些参数属性,比如说这个tags属性,代表的就是手机系统是aosp,正常其它的手机这里显示的应该是 release-keys

image-20230611155134592

image-20230611155346671

我们需要修改两个地方的值

  • aosp/build/tools/buildinfo.sh

    1
    ro.build.tags=release-keys

    image-20230611160018770

  • bin/aosp/build/tools/buildinfo_common.sh

    1
    ro.system.build.tags=release-keys

image-20230611155952071

其它指纹信息:

修改的目的是为了让我们的手机像一个正常的手机,有很多地方可以修改,也可以针对不同app检测的点去针对性修改,这里展示几个需要修改的点

ro.build.display.id(buildinfo.sh):

QP1A.191005.007 release-keys

image-20230611161754963

ro.build.description(buildinfo.sh):

aosp_srago-user 10 QP1A.191005.007 eng.lli.20221206.080222 release-keys

image-20230611162312221

ro.system.build.fingerprint(buildinfo_common.sh):

Android/aosp_srago/srago:10/QP1A.191005.007/lli01082102:user/release-keys

image-20230611162651375

PTRACE_TRACEME检测

PTRACE_TRACEME是检测进程附加

打开该文件 /home/lli/bin/aosp/bionic/libc/bionic

添加如下代码

image-20230611174006059

1
2
3
4
5
6
7
8
9
10
#include <unistd.h>
// add start
int caller_uid = getuid();
if(caller_uid>10000){
if(req==PTRACE_TRACEME){
// ptrace self
return 0;
}
}
// add end

关闭selinux:

selinux是linux的安全子系统,在我们做出上述修改时,该系统会进行一些检测,可能会导致root权限无法使用或者adb无法使用,所以我们需要关闭selinux

找到 aosp/system/core/init/selinux.cpp 修改代码,添加一个return false; 保存退出

image-20230611163341040

以上所有的步骤都可以单独完成在编译,也可以全部完成在编译刷机,也可以针对某个app进行单独编译刷机

验证:

我们以58同城为例,该app是带root检测的,会直接闪退

在刷入系统后,在打开该app没有任何问题,且抓包也正常,不需要重新装证书

image-20230612150702681