利用Framework Patch过掉BL锁状态检测
2024-7-28 17:50:44 Author: mp.weixin.qq.com(查看原文) 阅读量:10 收藏


介绍

该项目源自Github外国大佬。




项目链接:

GitHub - chiteroman/FrameworkPatch: Modify framework.jar to build on system level a valid certificate chain

(https://github.com/chiteroman/FrameworkPatch)

PS:
原项目自带教程,但是只有英文版教程,并且教程详尽程度对我这样的小白不是很友好,
所以写了这篇小白向的教程。大佬or有安卓开发经验的师傅可以直接看Github原项目。

作用

对于已解锁BL的手机,这个项目通过对手机根目录下/system/framework/framework.jar这个文件进行修改来过掉BL锁状态检测。


如果仅利用项目自带的keybox,可以过掉非硬件检测or密钥检测的BL锁状态验证,对付大部分软件,是没有问题的,而且目前有BL锁检测的软件其实很少。
如果你有谷歌下发的keybox,那么利用该项目,你可以近乎完美的过掉BL锁状态检测。


注意,对
TEE损坏的手机没有效果!!!例如OPPO/一加等品牌手机,解锁BL就会使TEE假死。


本教程只有前者,就是教如何使用该项目。


我也不知道如何向谷歌申请下发keybox(我还是一个无安卓开发经验的小白)。

存在的问题

◆目前检测BL的软件还是较少

◆完美隐藏BL状态需要谷歌下发的密钥

◆与Kitsune MagiskSu List有冲突

◆和Shamiko模块有冲突

◆影响性能?

◆未知的问题

研究价值

目前,有些安卓游戏是存在检测BL状态的。
以此为依据在设备上使用不同严格程度的检测方案。
之后,或许会有更多的软件对BL锁状态进行检测。
故,还是有一些研究价值。


教程

所需设备和工具:

◆1台已Root的安卓手机(装有Magisk/Apatch等)

◆Termux 或者 ZeroTermux

◆MT管理器和密钥认证APP

Framework PatchGithub链接(https://github.com/chiteroman/FrameworkPatch)Framework Patcher GoGitHub链接(https://github.com/changhuapeng/FrameworkPatcherGO)

◆Magisk模块模板framework-modify

◆科学上网

部分所需工具:
百度网盘(https://pan.baidu.com/s/1LtwGXQn5NOYGoPuGIyq3fA?pwd=ew6v)
有FrameworkPatcherGO,模块模板,密钥认证APP
其他工具请自行准备

该教程内容不需要电脑就可以实现
Magisk模块模板我会提供附件(非本人制作)


该项目有风险,请做好救砖的准备!!!

内容预览

1.配置Termux编译环境。

2.使用Termux编译所需dex。

3.利用Framework Patcher Go模块自动修改framework.jar中的dex(部分手机到此就已结束)。

4.手动修改framework.jar中的dex(部分手机的framework.jar无法使用FrameworkPatcherGo模块自动修改并安装)并制作模块。

效果预览



第一张图为安装前,第二张图为安装后(使用项目自带证书,故会显示来自AOSP的根证书,非完美隐藏)。

配置Termux编译环境

换国内源

使用Termux执行

sed -i 's@^\(deb.*stable main\)$@#\1\ndeb https://mirrors.tuna.tsinghua.edu.cn/termux/termux-packages-24 stable main@' $PREFIX/etc/apt/sources.list
sed -i 's@^\(deb.*games stable\)$@#\1\ndeb https://mirrors.tuna.tsinghua.edu.cn/termux/game-packages-24 games stable@' $PREFIX/etc/apt/sources.list.d/game.list
sed -i 's@^\(deb.*science stable\)$@#\1\ndeb https://mirrors.tuna.tsinghua.edu.cn/termux/science-packages-24 science stable@' $PREFIX/etc/apt/sources.list.d/science.list
pkg update

安装Java和配置Android编译环境

大量参考该文章(https://blog.csdn.net/Mingyueyixi/article/details/136014207)。


如果之后想在手机上利用Termux编译APK项目的,推荐观看下。

#安装git
pkg install git -y
#安装openssh
pkg install openssh -y
#安装Java—sdk—17
pkg install openjdk-17 -y

请科学上网:

curl -O https://googledownloads.cn/android/repository/commandlinetools-linux-11076708_latest.zip

ANDROID_HOME=~/android/sdk
mkdir -p $ANDROID_HOME/latest
unzip `ls |grep "commandlinetools-linux.*_latest.zip"` -d $ANDROID_HOME
# cmdline-tools 的产物需要移动到cmdline-tools/latest目录中,这是android sdk固定的路径组织形式
# 压缩包没有包含在latest文件夹中,自己移动一下
mv $ANDROID_HOME/cmdline-tools/* $ANDROID_HOME/latest
mv $ANDROID_HOME/latest $ANDROID_HOME/cmdline-tools

MT管理器打开/data/user/0/com.termux/files/home/

创建文件,名字是.bashrc


填入以下内容:

echo "用户:"$(whoami)

if pgrep -x "sshd" >/dev/null
then
echo
#echo "sshd运行中..."
else
sshd
echo "自动启动sshd"
fi
export ANDROID_HOME=~/android/sdk
export PATH=$ANDROID_HOME/cmdline-tools/latest/bin:$PATH

Termux执行如下命令:

cd ~
source .bashrc

然后彻底关闭Termux,重新打开。继续,由于我们只需要编译,故执行第三条命令即可。

#查看sdk列表
#sdkmanager --list
#安装安卓14平台开发工具
#sdkmanager --install "platforms;android-34"
#安装支持安卓14的构建工具
sdkmanager --install "build-tools;34.0.0"

接下来,我们下载arm版本的sdk工具(google编译的安卓sdk没有arm版本 )。

cd ~
curl -LJO https://github.com/lzhiyong/android-sdk-tools/releases/download/34.0.3/android-sdk-tools-static-aarch64.zip

#根据构架选择,一般用上面那个就行了,如果更改了,需要把解压命令也更改下
#curl -LJO https://github.com/lzhiyong/android-sdk-tools/releases/download/34.0.3/android-sdk-tools-static-arm.zip

unzip android-sdk-tools-static-aarch64.zip -d ./armtools
# 下载的是34版本的,所以,覆盖到34版本的目录
mkdir -p ~/android/sdk/platform-tools
cp -p ./armtools/build-tools/* ~/android/sdk/build-tools/34.0.0
cp -p ./armtools/platform-tools/* ~/android/sdk/platform-tools

git项目

注意科学上网

cd ~
git clone https://github.com/chiteroman/FrameworkPatch.git

编译dex

这里需要科学上网。并且,执行所需时间较长,耐心等待

最后,这里执行完了,还不算完。会有报错,请勿担心。

cd ./FrameworkPatch
echo "sdk.dir=$ANDROID_HOME" > local.properties
chmod +x ./gradlew
./gradlew build

执行后,你会看到如下报错:




不急,执行以下命令替换aapt2。

TARGET="/data/user/0/com.termux/files/home/.gradle/caches/transforms-4"
find "$TARGET" -type f -name "aapt2" | while read -r aapt2_file; do
cp -f ~/android/sdk/build-tools/34.0.0/aapt2 "$aapt2_file"
done

接下里继续编译。

./gradlew assembleRelease
cp -f app/build/intermediates/dex/release/minifyReleaseWithR8/classes.dex ~

我们打开/data/user/0/com.termux/files/home/,就可以看到有一个dex文件,留着备用。

Framework Patcher Go模块自动修改

Framework Patcher GoGitHub链接(https://github.com/changhuapeng/FrameworkPatcherGO)上下载模块。


MT管理器打开zip,
classes.dex添加到zip中的/META-INF/com/google/android/magisk/dex/ 文件夹下,然后Magisk刷入模块,它会自动修改系统自带的framework.jar中的dex,然后以面具模块的形式替换系统原来的framework.jar。

PS:过程中需要按音量上下键的。




注意,注意,注意

前面都是按音量上键,但到了最后,你看到:

This step is not required unless your device crashes after installing this module.
Do you want to apply this step?

这两行英语后,请按音量下键。

等待刷完。请提前做好救砖准备,如TWRP,音量键救砖模块等等。

如果最后按音量下键后,是会卡开机页面的,则救砖,然后继续刷入模块。

但在最后选择按音量上键,如果正常开机,那么到这里就结束了。

但如果还是无法开机,那就只能手动修改framework.jar中的dex。请看接下来的教程。

手动修改framework.jar

文件路径:/system/framework/framework.jar,复制文件到某个路径下,不要直接修改系统路径下的jar。

MT管理器打开jar
查看——Dex编辑器++——全选

接下来,搜索方法名engineGetCertificateChain

在方法的末尾附近应该有如下几行代码:

const/4 v4, 0x0
aput-object v2, v3, v4
return-object v3

类似结构,但寄存器的值可能是不一样的。


如图:



我们在return-object XX前加入:

invoke-static {XX}, Lcom/android/internal/util/framework/Android;->engineGetCertificateChain([Ljava/security/cert/Certificate;)[Ljava/security/cert/Certificate;
move-result-object XX

XX替换为对应的值。

如图:




保存返回。

搜索方法名:newApplication

可以看到有两个结果。我们先点开第一个,如图:




存在类似代码:

.param XX,"context" #Landroid/content/Context;

在方法末尾return之前添加以下代码:

invoke-static {XX}, Lcom/android/internal/util/framework/Android;->newApplication(Landroid/content/Context;)V

XX替换为寄存器。

如图:




保存,看第二个搜索结果。


如图:




看到和刚刚不同,有p1,p2,p3。

我们还是和第一个一样,选择绿色高亮文本为context的那一行对应的寄存器。

在方法末尾return之前添加以下代码:

invoke-static {XX}, Lcom/android/internal/util/framework/Android;->newApplication(Landroid/content/Context;)V

XX替换为寄存器。


如图:



保存返回。

搜索方法名:hasSystemFeature

结果有很多,我们只看ApplicationPackageManager类下的第一个。

如图:




在方法末尾return之前添加以下代码:

invoke-static {v0, p1}, Lcom/android/internal/util/framework/Android;->hasSystemFeature(ZLjava/lang/String;)Z
move-result v0

如寄存器有不同,请自行更改,和之前一样就行。


如图:




保存返回。
保存并退出。
在压缩文件中更新。

利用模板制作模块

找到我们之前编译的dex。


如图:




根据framework.jar中dex的数量n个,

重命名编译好的dex为classes[n+1].dex,
然后添加到
jar内。


如图:




保存返回。

找到Magisk模块模板Frist-framework-modify。注意最开始,选择带Frist的。

将修改后的framework.jar添加到压缩包/system/framework/下,然后利用面具刷入,重启。

能开机,结束。

不能开机,选择不带Fristframework-modify模板,将修改后的framework.jar添加到压缩包/system/framework/下,然后利用面具刷入,重启。

带Frist和不带的区别:
其实就和Framework Patch Go模块一样
带Frist的模块和Go模块最后按音量下键的不会执行下列代码
而不带Frist和Go模块最后按音量上键的会执行

if [ "$BOOTMODE" ] && { [ "$KSU" ] || [ "$APATCH" ]; }; then
find "/system/framework" -type f -name 'boot-framework.*' -print0 |
while IFS= read -r -d '' line; do
mkdir -p "$(dirname "$MODPATH$line")" && mknod "$MODPATH$line" c 0 0
done
elif [ "$BOOTMODE" ] && [ "$MAGISK_VER_CODE" ]; then
find "/system/framework" -type f -name 'boot-framework.*' -print0 |
while IFS= read -r -d '' line; do
mkdir -p "$(dirname "$MODPATH$line")" && touch "$MODPATH$line"
done
fi

如果刷入后还是无法正常开机,只能先救砖,再向项目作者提交issue了。


结语

本篇文章基本上是对原项目作者的教程进行翻译、简单化和补充。在此声明,本教程也依托于Github项目上的教程和其他人发的教程,但后者这篇教程好像被原作者删除了。我也找不到了,无法提供相关信息,若原作者看到,请联系我补充。

看雪ID:sffool

https://bbs.kanxue.com/user-home-988654.htm

*本文为看雪论坛优秀文章,由 sffool 原创,转载请注明来自看雪社区

# 往期推荐

1、Dobby框架源码学习

2、一次诈骗APP的逆向分析

3、UnrealEngine POLYGON 全逆向笔记

4、inlinehook心得分享

5、PWN入门-2-LibC取物-Ret2LibC

点击阅读原文查看更多


文章来源: https://mp.weixin.qq.com/s?__biz=MjM5NTc2MDYxMw==&mid=2458565095&idx=1&sn=9e066fba7b187aee2d84c91d2a3f9bf4&chksm=b18d896d86fa007b55404112d65165f688d2c0541ea52919fd9fd14f5d095f9913245b25a9c7&scene=58&subscene=0#rd
如有侵权请联系:admin#unsafe.sh