app安全:如何应对界面劫持

  • app安全如何应对界面劫持

    • 界面劫持的原理
    • 解决办法
    • 具体实施
      • 在Activity的各生命周期中启动或者停止服务在onResume中开启service在onStart和onDestory中关闭service
      • 编写具体的Service逻辑
      • 在onStart中执行timer
        • 具体效果如图
    • 补充内容

写这篇文章是因为,公司的项目对安全性要求较高一些,所以每年都会不定时把app提交到三方检测机构进行安全检测,其中有一项就是界面劫持风险,那么接下来,就一步步教大家怎么解决这个问题。

界面劫持的原理

在android系统中,程序可以枚举当前运行的进程而不需要声明任何权限,如果攻击者注册一个receiver,响应android.intent.action.BOOT_COMPLETED,使得开启启动一个service;在这个service中启动一个计时器,不停枚举当前进程中是否有预设的进程启动,如果发现有预设进程,则使用FLAG_ACTIVITY_NEW_TASK启动自己的钓鱼界面,而正常应用的界面则隐藏在钓鱼界面的后面。

解决办法

这是系统漏洞,在应用程序中很难去防止这种界面支持。但应用程序自身可以增加一些防范实施。
防范实施:
1. 开启守护进程,当发现应用程序不在栈顶时,在屏幕最上层创建一个悬浮小窗口(提示信息与客户确定),以提醒用户。
2. 使用抢占式,即与劫持程序抢占栈顶。
3. 在应用切到后台时,在通知栏弹出通知提示。

以上三种防范措施都是可取的,但是其中第二种,抢占式的抢占栈顶这种做法,频繁出现的话,用户会非常反感,于是,我们最终的方案是结合第一种和第三种方法来处理:app被切到后台后Toast弹框并在通知栏显示一条通知。(提醒用户,app被切到后台运行)

具体实施

1. 在Activity的各生命周期中启动或者停止服务(在onResume中开启service,在onStart和onDestory中关闭service)

示例:@Override
protected void onPause() {Intent intent = new Intent();intent.putExtra("pageName", this.getComponentName().getPackageName());intent.putExtra("className", this.getComponentName().getClassName());intent.setClass(this, AppStatusService.class);startService(intent);
}public void onResume() {Intent intent = new Intent();intent.putExtra("pageName", this.getComponentName().getPackageName());intent.putExtra("className", this.getComponentName().getClassName());intent.setClass(this, AppStatusService.class);stopService(intent);
}@Override
public void onDestroy() {Intent intent = new Intent();intent.setClass(this, AppStatusService.class);stopService(intent);
}

2. 编写具体的Service逻辑

/*** 应用是否在前台运行* * @return true:在前台运行;false:已经被切到后台了*/
private boolean isAppOnForeground() {List<RunningAppProcessInfo> appProcesses = activityManager.getRunningAppProcesses();if (appProcesses != null) {for (RunningAppProcessInfo appProcess : appProcesses) {if (appProcess.importance == RunningAppProcessInfo.IMPORTANCE_FOREGROUND) {if (appProcess.processName.equals(packageName)) {return true;}}}}return false;
}
/*** 定义一个timerTask来发通知和弹出Toast*/
TimerTask timerTask = new TimerTask() {@Overridepublic void run() {if (!isAppOnForeground()) {isAppBackground = true;//发通知showNotification();//弹出Toast提示MainActivity.mCurrentActivity.runOnUiThread(new Runnable() {@Overridepublic void run() {Toast.makeText(getApplicationContext(),getApplicationContext().getString(R.string.pervent_hijack_mes), Toast.LENGTH_SHORT).show();}});mTimer.cancel();}}
};
/*** 弹出通知提示*/
private void showNotification() {NotificationManager notificationManager = (NotificationManager) getSystemService(android.content.Context.NOTIFICATION_SERVICE);Notification notification = new Notification(R.drawable.icon, "xx银行", System.currentTimeMillis());notification.defaults |= Notification.DEFAULT_VIBRATE;// 设置震动notification.defaults |= Notification.DEFAULT_LIGHTS;// 设置LED灯提醒notification.flags |= Notification.FLAG_NO_CLEAR;// 通知不可被状态栏的清除按钮清除掉notification.flags |= Notification.FLAG_ONGOING_EVENT;// 通知放置在 正在运行Intent intent = new Intent();intent.setAction(Intent.ACTION_MAIN);intent.putExtra("notification", "notification");intent.setClassName(packageName, className);// 修改vivo手机点击通知栏不返回intent.addCategory(Intent.CATEGORY_LAUNCHER);// 增加Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED用于正常的从后台再次返回到原来退出时的页面中intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);PendingIntent pendingInt = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);String temp = "";notification.setLatestEventInfo(this, "xx手机银行", "手机银行已经被切到后台运行" + temp, pendingInt);// 设置服务的级别,使其不容易被kill掉,解决后台返回前台黑屏的问题startForeground(1, notification);
}

3. 在onStart中执行timer

        @Override
public void onStart(Intent intent, int startId) {try {Bundle bundle = null;if (intent != null) {bundle = intent.getExtras();}if (bundle != null) {className = bundle.getString("className");}// 通过计时器延迟执行mTimer.schedule(timerTask, 50, 50);} catch (Exception e) {e.printStackTrace();}
}
具体效果如图:

补充内容

根据importance的不同来判断前台或后台
RunningAppProcessInfo 里面的常量IMOPORTANCE就是上面所说的前台后台,其实IMOPORTANCE是表示这个app进程的重要性,因为系统回收时候,会根据IMOPORTANCE来回收进程的。具体可以去看文档。
public static final int IMPORTANCE_BACKGROUND = 400//后台
public static final int IMPORTANCE_EMPTY = 500//空进程
public static final int IMPORTANCE_FOREGROUND =100//在屏幕最前端、可获取到焦点 可理解为Activity生命周期的OnResume();
public static final int IMPORTANCE_SERVICE = 300//在服务中
public static final int IMPORTANCE_VISIBLE = 200//在屏幕前端、获取不到焦点可理解为Activity生命周期的OnStart();

app安全:如何应对界面劫持相关推荐

  1. 界面劫持与反界面劫持

    界面劫持,顾名思义就是正常应用的界面被恶意攻击者劫持,替换上仿冒的恶意界面作恶.界面劫持类攻击极具迷惑性很难被识别出来,界面劫持攻击不仅会给用户带来严重损失,更是移动应用开发者们的恶梦.好消息是,通过 ...

  2. UI培训教程分享:APP启动页UI界面设计

    本期为大家分享的ui培训教程是关于APP启动页面的UI设计方面,作为一名合格的UI设计师,APP产品的启动页是需要会的,下面就来看看详细的教程吧. UI培训教程分享:APP启动页UI界面设计 启动页面 ...

  3. 本app(仿手机支付宝界面)ios源码

    本app(仿手机支付宝界面)主要演示了: 动态显示splashimage 如何控制手势密码(AES加密保存数据) 如何控制viewcontroller之间的跳转,viewcontroller的代理控制 ...

  4. UI素材模板|App搜索页UI界面设计版式

    无论是在app还是在web端,搜索都是一个发现内容的重要方式.与web端不同,app上的搜 索功能在设计方面有自己独特的展现方式. 下面就看看这些App搜索页UI界面设计吧. 工作搜索App免费UI ...

  5. 设计灵感:12个App的登录注册界面案例参考

    点击上方"程序员黑叔",选择"置顶或者星标" 你的关注意义重大! 来源:Dribbble 一款 APP 的注册登陆界面就是给用户的第一印象,只有从用户场景和视角 ...

  6. 5套独立的app手机端模板界面代码

    MobioKit是移动手机端HTML模板,可以很容易创建手机网站布局设计,或者移动App应用.创意设计和神奇的特性将在让你完美的移动项目独一无二的.这个移动端UI工具包包含所有必要的设计,可以创建移动 ...

  7. 移动APP整体策划-007-App界面交互设计规范

    交互设计规范 在上篇<策划006-APP界面设计风格>确定下来后,产品经理(兼交互设计)还不用着急将所有的交互稿扔给设计师进行细致的界面设计.在细节设计启动前,拉上设计师和安卓前端开发.i ...

  8. 用MATLAB app designer设计人机交互界面——二阶线性动态电路可视化分析的研究

    用MATLAB app designer设计人机交互界面--二阶线性动态电路可视化分析的研究 这是我第一次尝试写博客,我试着给出电路课上要求的电路实验编程.但是电路的类型有点儿多,所以我只以二阶动态电 ...

  9. Facebook、新浪微博OAuth2.0通行证惊爆漏洞,10亿APP用户账户面临盗号劫持威胁

    那些支持Facebook.Google和新浪微博账号单点登录(SSO)的APP遇到大麻烦了,近日中国香港大学的三位研究者在欧洲黑帽大会上发布的研究报告"通过OAuth2.0轻松登录10亿AP ...

最新文章

  1. 鸿蒙是单线程还是多线程,鸿蒙 RT-Thread 两者之间究竟是不是竞争关系呢
  2. idea 设置java内存_java相关:IntelliJ IDEA设置显示内存指示器和设置内存大小的方法...
  3. 机器学习入门KNN近邻算法(一)
  4. 编译内核,busybox,dropbear组装linux小系统
  5. SylixOS中select原理及使用分析
  6. 【转载】为了我们的SZ4J代码
  7. numpy教程:数组操作
  8. etcd v3 php,Etcd clientV3 使用TLS证书存取KV
  9. Qualcomm Atheros ar9285 连不上 tp link无线 的 问题
  10. ABC类IP地址划分
  11. 如何用3D Max进行三维建模
  12. 就业指导期末试题(含正确答案)
  13. 二、 FATE实战:实现横向逻辑回归任务的训练及预测
  14. pdf书籍资源共享_书籍和更多内容已获许可使用知识共享
  15. vscode一键生成佛祖保佑永无bug
  16. Nvidia Tensor Core-MMA PTX编程入门
  17. IBM WebSphere Application Server与IBM Java V8官方帮助文档资源汇总
  18. Linux-scheduler之负载均衡(一)
  19. 如何使用redis实现(一) 浏览文章阅读量+1
  20. 知名软件ADSafe暗藏恶意代码 从众多网站劫持流量

热门文章

  1. 韶音AS800骨传导参数怎么样,跟南卡RunnerPro2比那个更好用?
  2. 【STM32学习】(10)STM32F1通用定时器实现脉冲计数器
  3. 编程c语言中,向上取整函数_C编程中的函数–第3部分
  4. html实现数据存储,HTML5数据存储
  5. 现在java现在发展前景怎么样?
  6. 你什么时候觉得上班最辛苦
  7. android swt问题分析,Android 重启问题分析指南
  8. 【教学类-36-07】20230707对称蝴蝶(midjounery-niji)(涂色、裁剪、游戏(飞舞的蝴蝶))
  9. 46 webpack优化- Scope Hoisting
  10. php flot,Flot | | PHP信息技术研究中心