Android安全风险与防范措施–Activity劫持

  • Post author:
  • Post category:其他


Activity劫持风险与防范措施

在Android系统问世不久,曾发生过这样的事情,用户在正常输入用户名、密码的情况,账密信息缺被盗的情况,why?

我们在使用银行类app时,只要我们的银行app客户端退至后台,为啥总会提示一下我们,“***已退至后台”的字样,why?

今天我们就一起来聊聊 activity被劫持的那些事。

Activity是我们构建app应用的基本页面,而android app activity页面的管理,是通过栈 来管理的。而在activity 启动时,“FLAG_ACTIVITY_NEW_TASK”设置,成为activity被劫持的关键因素,因为通过本标示参数设置,会使当前activity抢占栈顶,展现在用户UI层。


好了,先说一下劫持的过程吧


一般情况下,劫持程序都是通过服务来执行的,简单来说,就是一个app没有界面,只有一个后台服务,安装在手机中,用户从桌面是无法感知和发现的,只能通过系统应用管理中去查找,所以隐蔽性很好。以下简称这种劫持服务为“流氓软件”。

流氓软件会预先开发好想要窃取目前app的登录界面,可能相似度非常的高,一般人发现不了问题。然后可能你不经意间在做其他操作时安装了这个流氓软件,然后他就以服务的形式一直在你后台跑,当你目前程序启动登录时,流氓软件一旦检查到是需要的目前,就会强占栈顶,这是用户所看到的其实是伪装好的登录界面,如果用户不知道真伪,直接输入了用户名密码,流氓软件后台就获取到你的账密了,是不是很吓人…关键这种问题,并没有根本的解决方法,只能听过提示性动作,提醒用户


方法


一旦页面被至到后台,可以::

1,Toast提示用户

2,通过Notification通知栏提示用户

这就是问啥银行类app,当你退到后台后,总会提示你的原因。好了,开始上代码…

public abstract class BaseActivity extends AppCompatActivity{


@Override

protected void onCreate(Bundle savedInstanceState) {


super.onCreate(savedInstanceState);

ClassName = getClass().getSimpleName();

MyLog.d(TAG, ClassName);



}

}

@Override

protected void onResume() {


BGUtils.getinstance().onResume();

fingerInvalidateByRunBg();

super.onResume();

}

@Override
protected void onStop() {
    super.onStop();
}

@Override
protected void onPause() {
    BGUtils.getinstance().onPause(this);
    super.onPause();
}

public class BGUtils{


/**

* 获取唯一实例

*

* @return 唯一实例


/

public static BGUtils getinstance() {


if (BGUtils== null) {


bgUtils= new BGUtils();

}

return bgUtils;

}

}

/

*

* 应用是否在前台运行

*

* @return true:在前台运行;false:已经被切到后台了

*/

public boolean isAppOnForeground() {


ActivityManager activityManager = (ActivityManager) MyApplication.getInstance().getApplicationContext().getSystemService(Context.ACTIVITY_SERVICE);

List<ActivityManager.RunningAppProcessInfo> appProcesses = activityManager.getRunningAppProcesses();

if (appProcesses != null) {


for (ActivityManager.RunningAppProcessInfo appProcess : appProcesses) {


if (appProcess.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND) {


if (appProcess.processName.equals(packageName)) {


return true;

}

}

}

}

return false;

}

@Override

public void run() {


activity.runOnUiThread(new Runnable() {


@Override

public void run() {


//首先判断程序是否在运行

if (canRun) {


//其次判断程序是否在前台

if (!isAppOnForeground()) {


// 程序退到后台,进行风险警告

ToastUtil.showToast(activity, MyApplication.getInstance().getResources().getString(R.string.app_run_alert));

//NotificationUtils.showNotification(activity);



}

tasks.remove(MyTimerTask.this);

}

}

});

}

}



版权声明:本文为weixin_56945835原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。