`
shuai1234
  • 浏览: 971624 次
  • 性别: Icon_minigender_1
  • 来自: 山西
社区版块
存档分类
最新评论

android 界面防劫持提示

 
阅读更多

 在用户使用app的时候,如果被恶意程序劫持跳转到别的界面,这个时候我们就要做出预警提示用户,告诉用户当前界面已经不是我们的app有潜在的危险.代码的工作原理很简单就是在我们所写的activity对象的Onstop生命周期判断,将要跳转的界面是否是安全的。

       具体代码如下

[java] view plain copy
 
  1. public class AntiHijackingUtil {  
  2.       
  3.     public static final String TAG = "AntiHijackingUtil";  
  4.       
  5.     // 白名单列表  
  6.     private static List<String> safePackages;  
  7.       
  8.     static {  
  9.         safePackages = new ArrayList<String>();  
  10.     }  
  11.       
  12.     public static void configSafePackages(List<String> packages) {  
  13.         return;  
  14.     }  
  15.     private static PackageManager pm;  
  16.     private List<ApplicationInfo> mlistAppInfo;    
  17.     /** 
  18.      * 检测当前Activity是否安全 
  19.      */  
  20.     public static boolean checkActivity(Context context) {  
  21.          boolean safe = false;  
  22.          pm = context.getPackageManager();    
  23.             // 查询所有已经安装的应用程序    
  24.             List<ApplicationInfo> listAppcations = pm.getInstalledApplications(PackageManager.GET_UNINSTALLED_PACKAGES);    
  25.             Collections.sort(listAppcations,new ApplicationInfo.DisplayNameComparator(pm));// 排序    
  26.             List<ApplicationInfo> appInfos = new ArrayList<ApplicationInfo>(); // 保存过滤查到的AppInfo    
  27.             //appInfos.clear();    
  28.          for (ApplicationInfo app : listAppcations) {//这个排序必须有.    
  29.              if ((app.flags & ApplicationInfo.FLAG_SYSTEM) != 0) {    
  30.                  //appInfos.add(getAppInfo(app));    
  31.                 safePackages.add(app.packageName);  
  32.              }    
  33.          }   
  34.          //得到所有的系统程序包名放进白名单里面.  
  35.           
  36.         ActivityManager activityManager =(ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);  
  37.         String runningActivityPackageName;  
  38.         int sdkVersion;   
  39.           
  40.         try {    
  41.             sdkVersion = Integer.valueOf(android.os.Build.VERSION.SDK);    
  42.         } catch (NumberFormatException e) {    
  43.             sdkVersion = 0;    
  44.         }   
  45.           
  46.         if(sdkVersion>=21){//获取系统api版本号,如果是5x系统就用这个方法获取当前运行的包名  
  47.             runningActivityPackageName= getCurrentPkgName(context);  
  48.         }  
  49.         else runningActivityPackageName=activityManager.getRunningTasks(1).get(0).topActivity.getPackageName();  
  50.         //如果是4x及以下,用这个方法.  
  51.                
  52.            
  53.         if(runningActivityPackageName!=null){//有些情况下在5x的手机中可能获取不到当前运行的包名,所以要非空判断。  
  54.            if (runningActivityPackageName.equals(context.getPackageName())) {     
  55.               safe = true;  
  56.            }  
  57.           
  58.             // 白名单比对  
  59.            for (String safePack : safePackages) {  
  60.                if (safePack.equals(runningActivityPackageName)) {  
  61.                    safe = true;  
  62.                }  
  63.            }  
  64.         }  
  65.           
  66.         return safe;          
  67.     }  
  68.       
  69.       
  70.       
  71.     public static String getCurrentPkgName(Context context) {//5x系统以后利用反射获取当前栈顶activity的包名.  
  72.         ActivityManager.RunningAppProcessInfo currentInfo = null;  
  73.         Field field = null;  
  74.         int START_TASK_TO_FRONT = 2;  
  75.         String pkgName = null;  
  76.           
  77.         try {  
  78.             field = ActivityManager.RunningAppProcessInfo.class.getDeclaredField("processState");//通过反射获取进程状态字段.  
  79.         } catch (Exception e) {  
  80.             e.printStackTrace();  
  81.         }  
  82.         ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);  
  83.         List appList = am.getRunningAppProcesses();  
  84.         ActivityManager.RunningAppProcessInfo app;  
  85.           
  86.         for (int i=0;i<appList.size();i++){  
  87.             //ActivityManager.RunningAppProcessInfo app : appList  
  88.             app=(RunningAppProcessInfo) appList.get(i);  
  89.             if (app.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND) {//表示前台运行进程.  
  90.                 Integer state = null;  
  91.                 try {  
  92.                     state = field.getInt(app);//反射调用字段值的方法,获取该进程的状态.  
  93.                 } catch (Exception e) {  
  94.                     e.printStackTrace();  
  95.                 }  
  96.                 if (state != null && state == START_TASK_TO_FRONT) {//根据这个判断条件从前台中获取当前切换的进程对象.  
  97.                     currentInfo = app;  
  98.                     break;  
  99.                 }  
  100.             }  
  101.         }  
  102.           
  103.         if (currentInfo != null) {  
  104.             pkgName = currentInfo.processName;  
  105.         }  
  106.         return pkgName;  
  107.     }  
  108. }  

          代码的 使用方法也很简单,只需要在你自己写的Activity的Onstop中调用boolean safe = AntiHijackingUtil.checkActivity(this);即可得到跳转的界面是否需要提示.

 

          这里要说明一下 getCurrentPkgName()在有些5x手机也无法获取当前跳入的界面的包名,有了解的还请提示一下,谢谢。

 

分享到:
评论

相关推荐

    Android系统点击劫持攻防技术研究.pdf

    点击劫持,作为一种利用多层透明或重叠界面欺骗用户进行非预期点击的攻击手段,近年来在Web环境中崭露头角,并随着移动互联网的普及,逐渐在Android系统中变得尤为突出。由于其高度的隐蔽性和危害性,对用户数据安全...

    android客户端de登录注册源代码

    - **Activity**: 登录和注册界面通常由一个或多个Activity构成,它们是Android应用的基本运行单元,负责处理用户交互。 - **布局设计**:使用XML文件来定义UI元素,如EditText(文本输入框)用于输入用户名和密码...

    Android应用源码之Android随机验证码.zip

    - 验证码应有时间限制,过期后需要重新生成,以防止会话劫持。 - 对于网络验证,验证码应通过安全的HTTPS协议传输,防止中间人攻击。 7. **异步处理** - 为了保持用户界面的响应性,验证码的生成和验证最好在...

    Android基础渗透测试

    这些威胁包括但不限于远程代码执行、界面劫持、权限滥用、篡改和二次打包等(如表1所示)。因此,对于安全人员来说,掌握基本的Android渗透测试技能至关重要。 #### 表1:2017年十大Android软件漏洞 | 序号 | 漏洞...

    藏经阁-互联网金融安全实战浅述.pdf

    * 事中:检测是否有activity劫持的情况,并提示用户。 * 事后:利用用户画像,对钓鱼盗号的登录行为进行判别,阻止盗号者登录。 三、互联网金融-业务安全 业务安全是互联网金融安全的核心组成部分。互联网金融类...

    网页浏览器源码.zip

    Android应用通常由多个组件(如Activity、Service、BroadcastReceiver等)组成,这里的核心组件很可能是Activity,因为它负责用户界面的交互。 2. **WebView 组件**:在描述中提到的是一个“简单的”网页浏览器,这...

    图灵机器人

    同时,考虑到用户交互的流畅性,应该有良好的错误处理机制,如网络异常、API调用失败等情况的提示。 综上所述,实现一个图灵机器人聊天程序涉及的技术面广泛,包括前后端交互、数据解析、UI设计、性能优化等多个...

    html5-android-pattern-lock:HTML5 Android 图案锁

    在这个项目中,HTML5被用来构建用户界面,包括用于绘制图案的网格布局以及相关的提示信息。 2. **Canvas API**:HTML5中的Canvas API允许在网页上动态绘制图形。在这个模式锁实现中,Canvas被用来绘制九宫格,用户...

    移动APP安全测试要点

    然而,尽管这可能对部分用户造成不便,但从安全角度来看,提供防钓鱼提示和优化措施仍然是必要的,因为钓鱼攻击的潜在危害远大于短期的用户体验影响。 综上所述,移动APP的安全测试涵盖多个方面,包括代码安全、...

    APP安全检测报告-报告样例.pdf

    - **防屏幕录制检测**:密码输入界面缺乏防屏幕截图或录制机制。(中风险) - **信息显示安全**:个人信息未进行有效隐藏。(中风险) - **本地存储安全检测**:数据库文件信息已加密处理,但部分敏感信息仍以...

    DroidBrowser源码

    例如,通过重写WebViewClient和WebChromeClient,我们可以自定义网页加载行为,实现如加载进度条、错误提示等功能。 其次,DroidBrowser的URL处理和请求管理机制是另一个重要的学习点。源码中可能会包含一个URL管理...

    data_film2.rar_WebView_film_website

    【标题】"data_film2.rar_WebView_film_website" 提示我们这是一个与在线电影网站相关的项目,其中可能包含了用于展示电影数据的Web视图组件。这个压缩包可能包含了一个数据库文件,用于存储电影相关的信息。 ...

    0ab.zip_symbian_symbian brows_symbian browser_symbian richedit_s

    这个“浏览器嵌入控件”允许开发者将网页浏览功能集成到他们的应用中,就像在桌面操作系统中使用IE WebBrowser控件或者Android中的WebView一样。 这个"0ab.zip"压缩包可能是针对Symbian开发者的资源集合,包含了...

Global site tag (gtag.js) - Google Analytics