Android 11系统层“骚操作”:一行代码让向日葵远程控制免弹窗(RK3568实测)

张开发
2026/5/2 20:11:32 15 分钟阅读

分享文章

Android 11系统层“骚操作”:一行代码让向日葵远程控制免弹窗(RK3568实测)
Android 11系统权限机制的深度破解从MediaProjection弹窗绕过看系统安全设计在RK3568开发板上折腾Android 11系统时许多开发者都遇到过这样一个痛点使用向日葵等远程控制软件进行屏幕投射时系统会强制弹出权限请求对话框。这种设计虽然保障了用户隐私却给远程调试、无人值守设备管理等场景带来了不便。本文将深入分析这一机制背后的系统原理并探讨几种既实用又相对安全的解决方案。1. MediaProjection权限机制解析Android的屏幕录制和投射功能由MediaProjectionAPI提供支持这套机制的核心目的是在保护用户隐私的前提下为开发者提供屏幕内容捕获的能力。系统通过MediaProjectionPermissionActivity这个看门人来控制访问权限。在MediaProjectionPermissionActivity.java文件中关键权限检查逻辑如下if (mService.hasProjectionPermission(mUid, mPackageName)) { setResult(RESULT_OK, getMediaProjectionIntent(mUid, mPackageName)); finish(); return; }这段代码决定了是否授予应用屏幕捕获权限。hasProjectionPermission方法会检查调用者是否已经拥有权限如果没有就会弹出那个令人烦恼的对话框。权限检查的三重机制常规权限检查验证应用是否在允许列表用户确认必须通过弹窗获得用户明确授权签名级权限系统应用或特定签名应用可跳过确认2. 常见绕过方案与实现细节2.1 暴力修改法不推荐原始文章中提到的||true修改是最简单粗暴的方式- if (mService.hasProjectionPermission(mUid, mPackageName)) { if (mService.hasProjectionPermission(mUid, mPackageName) || true) {这种修改虽然有效但存在严重安全隐患完全禁用所有应用的权限检查可能被恶意应用利用违反Android安全设计原则2.2 白名单方案推荐更安全的做法是建立应用白名单机制private boolean isInWhitelist(String packageName) { String[] whitelist {com.oray.sunlogin, com.teamviewer.quicksupport}; return Arrays.asList(whitelist).contains(packageName); } // 修改权限检查逻辑 if (mService.hasProjectionPermission(mUid, mPackageName) || isInWhitelist(mPackageName)) { // 授权逻辑 }白名单方案的优点只对特定应用跳过验证保持对其他应用的安全检查易于维护和扩展2.3 系统属性控制法灵活方案通过系统属性动态控制权限授予import android.os.SystemProperties; boolean shouldBypass SystemProperties.getBoolean(persist.sys.media_projection_bypass, false); String allowedApps SystemProperties.get(persist.sys.media_projection_allowed, ); if (mService.hasProjectionPermission(mUid, mPackageName) || (shouldBypass allowedApps.contains(mPackageName))) { // 授权逻辑 }这种方法允许通过ADB动态配置adb shell setprop persist.sys.media_projection_bypass true adb shell setprop persist.sys.media_projection_allowed com.oray.sunlogin,com.teamviewer.quicksupport3. RK3568平台的特殊考量在RK3568开发板上实施这些修改时需要注意以下平台特性编译与部署注意事项修改AOSP源码后需要重新编译SystemUI模块source build/envsetup.sh lunch rk3568-userdebug mmm frameworks/base/packages/SystemUI/部署更新后的SystemUIadb root adb remount adb push out/target/product/rk3568/system/priv-app/SystemUI/SystemUI.apk /system/priv-app/SystemUI/ adb reboot验证修改是否生效adb shell dumpsys activity services | grep MediaProjection4. 安全与稳定性保障措施任何系统级修改都应该考虑安全后果。以下是几种加固方案签名验证增强private boolean isTrustedSignature(String packageName) { PackageManager pm getPackageManager(); PackageInfo pkgInfo pm.getPackageInfo(packageName, PackageManager.GET_SIGNATURES); Signature[] signatures pkgInfo.signatures; // 对比已知可信签名 return Arrays.asList(TRUSTED_SIGNATURES).contains(signatures[0].toCharsString()); }权限使用审计private void logPermissionGrant(String packageName) { ContentValues values new ContentValues(); values.put(timestamp, System.currentTimeMillis()); values.put(package, packageName); getContentResolver().insert(Uri.parse(content://media_projection_log), values); }推荐的安全实践组合安全层级技术方案实施难度安全级别基础白名单低中增强签名验证中高高级动态属性控制高可调全面审计日志高最高5. 替代方案探讨除了修改系统源码还有其他几种实现无感远程控制的方案方案一使用无障碍服务accessibility-service android:descriptionstring/accessibility_desc android:accessibilityFlagsflagDefault|flagRetrieveInteractiveWindows android:canRetrieveWindowContenttrue /方案二ADB授权预处理adb shell appops set com.oray.sunlogin PROJECT_MEDIA allow方案三自定义ROM集成在设备出厂前就将向日葵等应用预置为系统应用自动获得所需权限。6. Android权限模型的设计哲学Android的权限系统经历了多次演进从最初的安装时授权到现在的运行时权限反映了Google在安全与便利之间的平衡考量。MediaProjection的这种设计有几个关键考虑用户知情权屏幕内容涉及高度敏感信息必须确保用户知晓防滥用机制防止恶意应用偷偷录制用户操作可审计性每次授权都有系统记录可供查验理解这些设计原则才能做出既实用又不破坏系统安全性的修改。在实际项目中我倾向于使用系统属性控制的白名单方案配合签名验证。这种组合既满足了无人值守设备的管理需求又不会完全敞开系统的安全大门。特别是在RK3568这样的工业级开发板上稳定性与安全性同样重要任何修改都应该经过充分测试。

更多文章