1.环境准备
源码开发环境:
Windows 10+Vmware player 15+ubuntu-20.04
安卓系统版本:
基于LineageOS 17.1版本(Android 10)
测试手机型号:
oneplus 3
2.开启adb root权限
2.1 adbd中涉及adb root权限开启判断
adbd中涉及adb root权限开启判断源文件文件路径:
systemcoreadbdaemonmain.cpp
该文件中涉及权限判断的方法代码如下:
static bool should_drop_privileges() { ... bool ro_secure = android::GetBoolProperty("ro.secure", true); bool ro_debuggable = __android_log_is_debuggable(); // Drop privileges if ro.secure is set... bool drop = ro_secure; // ... except "adb root" lets you keep privileges in a debuggable build. std::string prop = android::GetProperty("service.adb.root", ""); bool adb_root = (prop == "1"); bool adb_unroot = (prop == "0"); if (ro_debuggable && adb_root) { drop = false; } // ... and "adb unroot" lets you explicitly drop privileges. if (adb_unroot) { drop = true; } return drop; }
2.2 主要涉及修改地方
源码编译过程中我们选择编译userdebug版本编译,userdebug版本系统的selinux权限放的宽一些,方便我们进行配置修改。修改主要涉及修改的关键属性如下:
# adbd中会根据ro.secure=0来判断adbd是否需要root用户权限 ro.secure=0 # 设置ro.adb.secure=0表示默认adb授权打开,不用弹出烦扰usb授权对话框了 ro.adb.secure=0
可以通过两种方式来配置adb root用户权限,分别是修改编译过程中main.mk文件的属性设置。另一种是直接修改adbd中的源码,将相关属性获取的地方直接返回需要修改的值。
2.2.1 main.mk中修改属性方式
修改文件路径:
buildmakecoremain.mk
以下是该文件中配置之后的部分内容:
user_variant := $(filter user userdebug,$(TARGET_BUILD_VARIANT)) enable_target_debugging := true tags_to_install := ifneq (,$(user_variant)) # Target is secure in user builds. # ///ADD START # ADDITIONAL_DEFAULT_PROPERTIES += ro.secure=1 ADDITIONAL_DEFAULT_PROPERTIES += ro.secure=0 # ///ADD END ADDITIONAL_DEFAULT_PROPERTIES += security.perf_harden=1 ifeq ($(user_variant),user) ADDITIONAL_DEFAULT_PROPERTIES += ro.adb.secure=1 endif ifeq ($(user_variant),userdebug) # Pick up some extra useful tools tags_to_install += debug # ///ADD START ADDITIONAL_DEFAULT_PROPERTIES += ro.adb.secure=0 # ///ADD END else # Disable debugging in plain user builds. # ///ADD START # enable_target_debugging := true # ///ADD END enable_target_debugging := endif ...
这种方式存在的问题:
App通过获取属性ro.secure/ro.adb.secure容易检测到手机处于不安全状态,越狱风险。
2.2.2 adbd源码中修改属性方式
修改文件路径路径位置:
systemcoreadbdaemonmain.cpp
修改的关键代码如下:
//修改ro.adb.secure 关闭usb授权对话框 适合编译userdebug版本 int adbd_main(int server_port) { ... #if defined(__ANDROID__) // If we're on userdebug/eng or the device is unlocked, permit no-authentication. bool device_unlocked = "orange" == android::GetProperty("ro.boot.verifiedbootstate", ""); if (__android_log_is_debuggable() || device_unlocked) { auth_required = android::GetBoolProperty("ro.adb.secure", false); ///ADD START if(CONFIG_ADBD_ROOT>=0) { auth_required=false; } ///ADD END #if defined(__ANDROID_RECOVERY__) auth_required = auth_required && android::GetBoolProperty("ro.adb.secure.recovery", true); #endif } #endif ... } //直接返回不降权处理 static bool should_drop_privileges() { ///ADD START 适合编译userdebug版本 if(CONFIG_ADBD_ROOT>=0) { return false; } ///ADD END ... }
这种方式修改可以防止App检测属性ro.secure ro.adb.secure,不做任何修改情况下userdebug编译出来的这两个属性都为1
2.2.3 采用的修改方案
采用修改adbd源码的方式进行测试验证
3.内置fridaserver到手机系统
3.1下载fridaserver
由于测试的机型为arm 64位的,所以下载Android 64位版本。
3.2 创建fridaserver模块
(1).在源码根目录创建路径 frameworksasecmds创建mycmds目录
(2).将 fridaserver改成想要的名称拷贝到mycmds目录下,比如改成myfridaserverarm64
(3).编写 fridaserver模块编译配置Android.mk文件
以下参考配置:
#///ADD START #///ADD END LOCAL_PATH:= $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := myfridaserverarm64 LOCAL_MODULE_CLASS := EXECUTABLES LOCAL_SRC_FILES := myfridaserverarm64 include $(BUILD_PREBUILT)
(4).将新增的myfridaserverarm64模块加入系统编译模块链
模块加入源码编译链可以在以下文件路径中添加:
buildmake argetproductase_system.mk
在该文件中添加myfridaserverarm64模块到模块编译链中的内容参考如下:
# Base modules and settings for the system partition. PRODUCT_PACKAGES += myfridaserverarm64 abb adbd ...
4.编译源码
执行如下命令编译:
qiang@ubuntu:~/lineageOs$ source build/envsetup.sh qiang@ubuntu:~/lineageOs$ breakfast oneplus3 qiang@ubuntu:~/lineageOs$ brunch oneplus3
5.刷机
使用twrp进行刷机。
C:UsersQiang>adb push C:UsersQiangDesktoplineage-17.1-20210322-UNOFFICIAL-oneplus3.zip /sdcard/update.zip C:UsersQiangDesktoplineage-17.1-20210322-UNOFFICIAL-on... pushed, 0 skipped. 30.2 MB/s (783272894 bytes in 24.715s) C:UsersQiang>adb reboot recovery C:UsersQiang>
进入recovery以后选择刷机包完成刷机操作。
此处使用到的几个命令说明:
1.adb push 表示将电脑端文件传输到手机端 比如:adb push c:\test.txt /data/local/tmp/test.txt 2.adb reboot recovery 手机进入recovery模式
6.验证
adb权限验证:
C:UsersQiang>adb shell ps -Z |findstr "adbd" usu:s0 root 2771 1 184644 6212 poll_schedule_timeout 7482d393c8 S adbd C:UsersQiang>
以上命令执行之后可以看到adbd运行的时候运行的安全域"usu:s0",运行的用户为root用户。所以在selinux打开的情况下,adbd运行同时满足运行安全域"usu:s0"以及运行用户"root"的条件,就具备了超级root权限。
启动内置myfridaserverarm64验证:
C:UsersQiang>adb shell OnePlus3:/ # myfridaserverarm64 -D C:UsersQiang> adb shell ps |findstr "myfrida" root 6298 1 124016 43772 poll_schedule_timeout 7316a903c8 S myfridaserverarm64 C:UsersQiang>
审核编辑:刘清
全部0条评论
快来发表一下你的评论吧 !