作为Android app开发者,如何通过技术手段防范屏幕共享类的诈骗?

作为Android app开发者,如何通过技术手段防范屏幕共享类的诈骗?

安全厂商能力

父母在家千万注意别打开“共享屏幕”,银行卡里的钱一秒被转走… - 掘金 (juejin.cn)

防劫持SDK - 顶象文档中心 (dingxiang-inc.com)

​ 目前市面上的Android界面防劫持(恶意截屏、恶意录屏、恶意屏幕共享)SDK或者厂商能力主要是基于防护关键信息的截屏、录屏和屏幕共享的安全问题。它们的实现方式可以归纳为以下几种方案:

使用硬件级别的安全方案

​ 一些硬件厂商和芯片厂商提供了专门的安全芯片或安全执行环境,这些芯片能够提供硬件级别的安全保障,包括对屏幕内容的保护。这些芯片可以提供屏幕加密和数字版权管理等功能,用来保护屏幕内容不被恶意截屏、录屏或共享。

使用操作系统级别的安全方案

​ 一些Android手机厂商在系统层面加入了对关键界面的保护机制,例如通过修改WindowManagerService或SurfaceFlinger等系统服务,对应用程序的窗口进行加密和保护,防止被恶意截屏、录屏和共享。这些系统级的保护方案需要深入了解Android系统框架和底层实现。

使用软件级别的安全方案

​ 一些SDK提供了软件级别的安全保护,通过添加FLAG_SECURE标志、检测屏幕录制和悬浮窗等方式来防范恶意截屏、录屏和共享。这些SDK往往提供了简单易用的API,开发者可以通过集成这些SDK来实现对界面的保护。

使用屏幕加密和水印技术

​ 一些方案通过对界面内容进行加密处理,在显示时进行解密,从而防止被恶意截屏和录屏。同时,还可以添加水印或者特定的标识符,用来识别和追踪恶意共享行为。

​ 需要注意的是,每种方案都有其优缺点,例如硬件级别的解决方案可能对硬件要求较高、系统级的方案可能不适用于所有设备、软件级的方案可能存在被绕过的风险等。在选择和实施方案时,应该根据实际情况综合考虑安全性、性能和适用性。

使用FLAG_SECURE

​ 使用FLAG_SECURE标志保护Activity的屏幕内容,以防止屏幕被截屏或录屏。在需要保护的Activity类的onCreate()方法中添加如下代码:

getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE);

​ 这将禁用屏幕截图和屏幕录制功能。

使用悬浮窗检测

​ 通过检测当前是否存在悬浮窗来判断是否发生屏幕共享。但是判断的是当前应用有没有起悬浮窗,另外对屏幕共享的判断不见得准确。以下是一个示例代码,用于检测悬浮窗是否存在:

public boolean isFloatingWindowShowing(Context context) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        if (Settings.canDrawOverlays(context)) {
            WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
            if (wm != null) {
                List<WindowManager.LayoutParams> listOfParams = new ArrayList<>();
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                    listOfParams.addAll(wm.getWindowManagerLayoutParams());
                } else {
                    try {
                        Field mViewsField = wm.getClass().getDeclaredField("mViews");
                        mViewsField.setAccessible(true);
                        List<View> views = (List<View>) mViewsField.get(wm);
                        for (View view : views) {
                            listOfParams.add((WindowManager.LayoutParams) view.getLayoutParams());
                        }
                    } catch (NoSuchFieldException | IllegalAccessException e) {
                        e.printStackTrace();
                    }
                }
                
                // 检查WindowManager.LayoutParams中的type字段是否是TYPE_APPLICATION_OVERLAY或TYPE_TOAST
                for (WindowManager.LayoutParams params : listOfParams) {
                    if (params.type == WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY || params.type == WindowManager.LayoutParams.TYPE_TOAST) {
                        return true;
                    }
                }
                
            }
        }
    }
    return false;
}

使用MediaProjectionManager检测屏幕录制

​ 可以创建一个Service来检测当前是否有正在进行的屏幕录制,如果检测到则进行相应的处理。以下是一个示例代码:

public class ScreenRecordDetectionService extends Service {
    private MediaProjectionManager mProjectionManager;
    private MediaProjection mMediaProjection;
    private MediaProjection.Callback mMediaProjectionCallback;

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        mProjectionManager = (MediaProjectionManager) getSystemService(Context.MEDIA_PROJECTION_SERVICE);
        startScreenCapture();
        return super.onStartCommand(intent, flags, startId);
    }

    private void startScreenCapture() {
        if (mMediaProjection == null) {
            startActivityForResult(mProjectionManager.createScreenCaptureIntent(), REQUEST_MEDIA_PROJECTION);
        }
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == REQUEST_MEDIA_PROJECTION) {
            if (resultCode == RESULT_OK) {
                mMediaProjection = mProjectionManager.getMediaProjection(resultCode, data);
                mMediaProjection.registerCallback(mMediaProjectionCallback, null);
            }
        }
    }
    
    // 在Service被销毁前,记得解除注册回调
    @Override
    public void onDestroy() {
        if (mMediaProjection != null) {
            mMediaProjection.unregisterCallback(mMediaProjectionCallback);
        }
        super.onDestroy();
    }
}

监测屏幕录制应用的使用

​ 通过查询当前运行的进程列表,你可以找出是否有屏幕录制类应用程序在后台运行,如果发现此类应用程序,可以提示用户风险并且提供操作建议。

​ 但是目前Android应用只能拿到自己应用的运行进程列表,拿不到全局运行进程的列表,除非root。

// 检查当前正在运行的应用程序
ActivityManager manager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
List<ActivityManager.RunningAppProcessInfo> runningProcesses = manager.getRunningAppProcesses();

for (ActivityManager.RunningAppProcessInfo process : runningProcesses) {
    // 检查是否有屏幕录制类应用程序在运行
    if (isScreenRecordingApp(process.processName)) {
        // 提示用户风险并提供操作建议
        showScreenRecordingAppWarning();
        break;
    }
}

Accessibility Service

​ 借助 Android 的辅助功能服务(Accessibility Service),你可以监听用户屏幕上的操作和内容变化,根据设定的规则来检测屏幕共享行为。当检测到用户在使用会议类App进行屏幕共享时,可以触发相应的防范和警示逻辑。同样地,使用辅助功能服务也需要用户的明确授权。

提供教育与防范信息

​ 在你的应用中提供关于屏幕共享类诈骗的教育与防范信息,帮助用户警惕风险并提供相关建议以增强用户对此类骗局的认识。

安全交易环境

​ 在需要进行交易或涉及账户敏感操作时,建议用户在安全环境下操作,例如在全屏模式下进行交易,并避免在屏幕共享时进行敏感操作。

总结

​ 屏幕共享防诈骗纯Android应用端方案比较受限,可能需要综合会议类app(腾讯会议在开启屏幕共享时有防诈提醒)、手机厂商、自己app、安全厂商的能力来共同构筑防线。 针对自己的app建议对关键页面比如登录、密码、二维码等页面禁用截屏、录屏、共享,在关键页面的合适位置给用户一些防诈提示。也可以引入一些安全厂商的产品来做防护。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值