作为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建议对关键页面比如登录、密码、二维码等页面禁用截屏、录屏、共享,在关键页面的合适位置给用户一些防诈提示。也可以引入一些安全厂商的产品来做防护。