如何使用豆包手机的READ_FRAME_BUFFER权限截图密码画面

背景:

针对READ_FRAME_BUFFER的权限原理剖析前面文章已经进行了详细讲解,具体文章如下:

但是文章也给大家留下了一个疑问,那就是具有READ_FRAME_BUFFER权限到底是否可以截图到手机上secure画面,比如银行等密码手势画面。

针对这个疑问也进行了直播讲解和验证,答案就是READ_FRAME_BUFFER权限确实可以实现对这些敏感隐私画面进行截图。
下面给大家展示相关的源码,大家也可以自行用下面源码进行验证你的设备是否可以截图成果。

直播代码分享:

要进行截图secure layer的接口分享:
frameworks/base/core/java/android/window/ScreenCapture.java


            /**
             * Whether to allow the screenshot of secure layers. Warning: This should only be done
             * if the content will be placed in a secure SurfaceControl.
             *
             * @see ScreenshotHardwareBuffer#containsSecureLayers()
             */
            public T setCaptureSecureLayers(boolean captureSecureLayers) {
                mCaptureSecureLayers = captureSecureLayers;
                return getThis();
            }

注释可以看出是可以截图安全的layer到sc。
不使用setCaptureSecureLayers截图代码如下:

     public static  Bitmap captureScreenshot() {
        try {
            final ScreenCapture.CaptureArgs captureArgs = new ScreenCapture.CaptureArgs.Builder<>()
                    .setSourceCrop(new Rect(0,0,2960,1440))
                    .build();
            ScreenCapture.SynchronousScreenCaptureListener syncScreenCapture =
                    ScreenCapture.createSyncCaptureListener();
            try {
                WindowManagerGlobal.getWindowManagerService().captureDisplay(0,
                        captureArgs, syncScreenCapture);
            } catch (RemoteException e) {
                e.rethrowAsRuntimeException();
            }
            final ScreenCapture.ScreenshotHardwareBuffer screenshotHardwareBuffer =
                    syncScreenCapture.getBuffer();
            return  screenshotHardwareBuffer.asBitmap();

        } finally {

        }

    }
   

保存图片到sdcard私有目录方法:

public static String saveBitmap(Context context, Bitmap bitmap,
                                    String subDir, String fileName) {
        File baseDir = context.getExternalFilesDir(Environment.DIRECTORY_PICTURES);
        if (baseDir == null) return null;

        File targetDir = new File(baseDir, subDir);
        if (!targetDir.exists()) targetDir.mkdirs();

        File imageFile = new File(targetDir, fileName + ".jpg");
        try (FileOutputStream fos = new FileOutputStream(imageFile)) {
            bitmap.compress(Bitmap.CompressFormat.JPEG, 90, fos);
            fos.flush();
            return imageFile.getAbsolutePath();
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

调用方式:

                CaptureScreenshotUtil.saveBitmap(MainActivity.this, CaptureScreenshotUtil.captureScreenshot(),"aaa","test");

权限声明:

    <uses-permission android:name="android.permission.READ_FRAME_BUFFER"></uses-permission>

注意需要基于源码编译apk,系统签名安装。

验证得到的结果
原设备画面展示:
在这里插入图片描述

截图到图片展示如下
在这里插入图片描述
明显看到手势密码部分的Activity是无法被截图到的,这块与豆包官方声明基本上一致。
在这里插入图片描述但是真的是这样吗?

使用setCaptureSecureLayers后截图情况
代码上只是在原来基础上加入setCaptureSecureLayers(true)

 try {
            final ScreenCapture.CaptureArgs captureArgs = new ScreenCapture.CaptureArgs.Builder<>()
                    .setSourceCrop(new Rect(0,0,2960,1440))
                    //重点差异
                    .setCaptureSecureLayers(true)
                    .build();
            ScreenCapture.SynchronousScreenCaptureListener syncScreenCapture =
                    ScreenCapture.createSyncCaptureListener();
            try {
                WindowManagerGlobal.getWindowManagerService().captureDisplay(0,
                        captureArgs, syncScreenCapture);
            } catch (RemoteException e) {
                Log.e("lsm666888", "Failed to request screencapture for display");
                e.rethrowAsRuntimeException();
            }
            final ScreenCapture.ScreenshotHardwareBuffer screenshotHardwareBuffer =
                    syncScreenCapture.getBuffer();
            return  screenshotHardwareBuffer.asBitmap();

        } finally {

        }

运行后进行截图,效果如下:
在这里插入图片描述
可以看出明显这次截图是可以截图到手势密码的画面了,所以最后的结论就是如下:
READ_FRAME_BUFFER权限确实是需要系统签名才可以使用的,默认不设置setCaptureSecureLayers(true)那确实无法截图到手势密码等secure画面,但是如果设置了setCaptureSecureLayers(true)就可以截图到各个secure的内容。

所以READ_FRAME_BUFFER权限是可以截图到各个手势密码等高度隐私的画面。

### 关于 STATUS_STACK_BUFFER_OVERRUN 错误的原因 STATUS_STACK_BUFFER_OVERRUN 是一种由栈缓冲区溢出引发的安全异常。当应用程序尝试写入超出分配给特定变量的内存空间时发生此错误,这通常意味着存在潜在的安全漏洞或编程缺陷[^1]。 对于 Chrome 和 Edge 浏览器而言,此类错误可能源于多种因素: - **插件冲突**:某些第三方扩展程序可能导致浏览器不稳定并触发该错误。 - **软件更新不兼容**:操作系统或浏览器版本之间的不匹配也可能引起这一问题。 - **恶意软件感染**:病毒或其他有害程序可能会篡改系统文件从而造成这种状况。 - **硬件故障**:尽管较为罕见,但也不能排除因物理损坏而导致的情况。 ### 解决方法概述 针对上述提到的各种可能性,有几种通用的方法可以帮助缓解或彻底解决问题: #### 方法一:启用 Exploit Protection 中的堆栈保护机制 通过调整 Windows 的安全策略来增强对这类攻击的防御能力是一个有效的措施。具体操作如下所示[^5]: 1. 打开任务栏中的 "攻击防护" 工具; 2. 寻找并配置目标应用程序(即受影响的浏览器)的相关设置; 3. 启用“硬件强制实施堆栈保护”的选项; 4. 应用更改后重新启动计算机以使新设定生效; 这种方法能够有效防止大多数由于栈溢出引起的崩溃事件。 #### 方法二:清除缓存与 cookies 数据 有时旧的数据残留也会成为诱发因素之一。因此建议定期清理浏览历史记录以及临时互联网文件夹内的内容: ```bash # 对应命令行指令用于清空 chrome 缓存 (需配合相应工具使用) chrome://settings/clearBrowserData ``` #### 方法三:禁用不必要的加载项/扩展 移除那些未经验证或者不再使用的附加组件有助于减少风险暴露面,并提高整体稳定性。 #### 方法四:执行全面杀毒扫描 确保设备上没有任何已知威胁正在运行非常重要。利用可靠的防病毒解决方案进行全面检测不失为明智之举。 #### 方法五:回滚最近的操作系统补丁 如果是在安装新的 OS 更新之后才遇到这个问题,则考虑卸载这些改动或许能有所帮助。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

千里马学框架

帮助你了,就请我喝杯咖啡

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值