在用户使用app的时候,如果被恶意程序劫持跳转到别的界面,这个时候我们就要做出预警提示用户,告诉用户当前界面已经不是我们的app有潜在的危险.代码的工作原理很简单就是在我们所写的activity对象的Onstop生命周期判断,将要跳转的界面是否是安全的。
具体代码如下
- public class AntiHijackingUtil {
- public static final String TAG = "AntiHijackingUtil";
- // 白名单列表
- private static List<String> safePackages;
- static {
- safePackages = new ArrayList<String>();
- }
- public static void configSafePackages(List<String> packages) {
- return;
- }
- private static PackageManager pm;
- private List<ApplicationInfo> mlistAppInfo;
- /**
- * 检测当前Activity是否安全
- */
- public static boolean checkActivity(Context context) {
- boolean safe = false;
- pm = context.getPackageManager();
- // 查询所有已经安装的应用程序
- List<ApplicationInfo> listAppcations = pm.getInstalledApplications(PackageManager.GET_UNINSTALLED_PACKAGES);
- Collections.sort(listAppcations,new ApplicationInfo.DisplayNameComparator(pm));// 排序
- List<ApplicationInfo> appInfos = new ArrayList<ApplicationInfo>(); // 保存过滤查到的AppInfo
- //appInfos.clear();
- for (ApplicationInfo app : listAppcations) {//这个排序必须有.
- if ((app.flags & ApplicationInfo.FLAG_SYSTEM) != 0) {
- //appInfos.add(getAppInfo(app));
- safePackages.add(app.packageName);
- }
- }
- //得到所有的系统程序包名放进白名单里面.
- ActivityManager activityManager =(ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
- String runningActivityPackageName;
- int sdkVersion;
- try {
- sdkVersion = Integer.valueOf(android.os.Build.VERSION.SDK);
- } catch (NumberFormatException e) {
- sdkVersion = 0;
- }
- if(sdkVersion>=21){//获取系统api版本号,如果是5x系统就用这个方法获取当前运行的包名
- runningActivityPackageName= getCurrentPkgName(context);
- }
- else runningActivityPackageName=activityManager.getRunningTasks(1).get(0).topActivity.getPackageName();
- //如果是4x及以下,用这个方法.
- if(runningActivityPackageName!=null){//有些情况下在5x的手机中可能获取不到当前运行的包名,所以要非空判断。
- if (runningActivityPackageName.equals(context.getPackageName())) {
- safe = true;
- }
- // 白名单比对
- for (String safePack : safePackages) {
- if (safePack.equals(runningActivityPackageName)) {
- safe = true;
- }
- }
- }
- return safe;
- }
- public static String getCurrentPkgName(Context context) {//5x系统以后利用反射获取当前栈顶activity的包名.
- ActivityManager.RunningAppProcessInfo currentInfo = null;
- Field field = null;
- int START_TASK_TO_FRONT = 2;
- String pkgName = null;
- try {
- field = ActivityManager.RunningAppProcessInfo.class.getDeclaredField("processState");//通过反射获取进程状态字段.
- } catch (Exception e) {
- e.printStackTrace();
- }
- ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
- List appList = am.getRunningAppProcesses();
- ActivityManager.RunningAppProcessInfo app;
- for (int i=0;i<appList.size();i++){
- //ActivityManager.RunningAppProcessInfo app : appList
- app=(RunningAppProcessInfo) appList.get(i);
- if (app.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND) {//表示前台运行进程.
- Integer state = null;
- try {
- state = field.getInt(app);//反射调用字段值的方法,获取该进程的状态.
- } catch (Exception e) {
- e.printStackTrace();
- }
- if (state != null && state == START_TASK_TO_FRONT) {//根据这个判断条件从前台中获取当前切换的进程对象.
- currentInfo = app;
- break;
- }
- }
- }
- if (currentInfo != null) {
- pkgName = currentInfo.processName;
- }
- return pkgName;
- }
- }
代码的 使用方法也很简单,只需要在你自己写的Activity的Onstop中调用boolean safe = AntiHijackingUtil.checkActivity(this);即可得到跳转的界面是否需要提示.
这里要说明一下 getCurrentPkgName()在有些5x手机也无法获取当前跳入的界面的包名,有了解的还请提示一下,谢谢。
相关推荐
Android Activity 防劫持,界面防劫持,无视Android系统版本限制,无需操作栈
Android界面劫持攻击检测.pdf
Android 界面劫持是一种通过劫持用户使用过程中的界面输入流窃取用户隐私信息的攻击方式。本文首 先通过实验验证了该攻击在安卓多个版本上的有效性,继而分析了包含界面劫持攻击的恶意应用的 4 个必备特 征,提出了...
使用方法:安装HijackActivity.apk,使用 activity 界面劫持工具,在工具中指定要劫持的应用进程名称。如图所示,从列表中选择被测试的应用,点击 OK。打开应用,测试工具会尝试用自己的窗口覆盖被测的应用,如果...
可以用于DNS劫持,劫持手机上面的DNS访问,把重定向DNS服务器导入到我们自己的服务器上面,然后,想干嘛干嘛 adb push libs/armeabi-v7a/dnsproxy2 /data/local/tmp adb push res/raw/20dnsproxy2 /data/local/tmp ...
百度安全在RSA 2014 Conference的演讲。本文讲解了如何Hook和Hook detection。 Table of Content Root or Not Root App劫持 Hook详解 App劫持演示 注入和Hook检测/修复 离我的App远点儿!——创建可信App运行环境
如何利用动态代理技术Hook掉系统的AMS服务,来实现拦截Activity的启动流程。
Android平台组件劫持漏洞的研究.pdf
Android系统点击劫持攻防技术研究.pdf
Android应用钓鱼劫持风险的检测与防范.pdf
HTTPDNS Android接入文档抓包验证HTTPDNS SDK接入HTTP网络访问实践替换URL接入方式兼容HTTP兼容HTTPS兼容本地使用HTTP代理替换URL接入方式替换DNS实现方式判断本地是否使用HTTP代理GitHub目录结构说明目录名称说明...
所有用到的设备在ebay都可以买到,文档中没有提及具体的步骤,只是作者的一种实验性概念。
这里是Android Hijacking,该代码主要使用了Intent Hijacking。劫持了QQ,并且窃取用户的QQ账号和密码并上传到服务器上存储!该代码包括服务端PHP,和Android端。
Android平台组件劫持漏洞的研究
面向Android应用程序的组件劫持攻击检测,马川,申利民,Android组件间通信(ICC)为应用程序带来了便利性的同时也增加了安全隐患。本文提出一种精确高效的方法对app的敏感路径进行组件级的分析
android允许用户查看当前栈中的任务,导致系统不安全 这是一个小程序实现屏幕劫持
待续 Android activity劫持
简单实例 代码亲测有用 实现 IXposedHookLoadPackage接口 指定要 hook 的包名 判断当前加载的包是否是指定的包 指定要 hook 的方法名 实现beforeHookedMethod方法和afterHookedMethod方法(hook的具体功能)
DHCP欺骗劫持与防御策略
httphijack 使用Javascript实现前端防御http劫持及防御XSS攻击,并且对可疑攻击进行上报 使用方法 引入 httphijack1.0.0.js httphijack.init() 防范范围: 所有内联事件执行的代码 href 属性 [removed] 内嵌的代码 ...