`
貌似掉线
  • 浏览: 260424 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

大谈android安全2——Activity劫持的防范程序

 
阅读更多
本文原创,转载请注明出处: http://maosidiaoxian.iteye.com/blog/1683990

在上个月我曾发了一篇Activity劫持与用户防范的文章(http://maosidiaoxian.iteye.com/blog/1623016),在里面介绍了由于Android设计上的缺陷而导致的钓鱼漏洞,并且也在文末介绍了用户防范的方法(原创)。
然而,如果真的爆发了这种恶意程序,我们并不能在启动程序时每一次都那么小心去查看判断当前在运行的是哪一个程序。因此,前几个星期花了一点时间写了一个程序,叫反劫持助手。原理很简单,就是获取当前运行的是哪一个程序,并且显示在一个浮动窗口中,以帮忙用户判断当前运行的是哪一个程序,防范一些钓鱼程序的欺骗。

在这一次,由于是“正当防卫”,就不再通过枚举来获取当前运行的程序了,在manifest文件中增加一个权限:
    <uses-permission android:name="android.permission.GET_TASKS" />

然后启动程序的时候,启动一个Service,在Service中启动一个浮动窗口,并周期性检测当前运行的是哪一个程序,然后显示在浮动窗口中。
程序截图如下:



其中Service代码如下:
/*
 * @(#)AntiService.java		       Project:ActivityHijackingDemo
 * Date:2012-9-13
 *
 * Copyright (c) 2011 CFuture09, Institute of Software, 
 * Guangdong Ocean University, Zhanjiang, GuangDong, China.
 * All rights reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.sinaapp.msdxblog.antihijacking.service;

import android.app.ActivityManager;
import android.app.Notification;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.util.Log;

import com.sinaapp.msdxblog.androidkit.thread.HandlerFactory;
import com.sinaapp.msdxblog.antihijacking.AntiConstants;
import com.sinaapp.msdxblog.antihijacking.view.AntiView;

/**
 * @author Geek_Soledad (66704238@51uc.com)
 */
public class AntiService extends Service {

	private boolean shouldLoop = false;
	private Handler handler;
	private ActivityManager am;
	private PackageManager pm;
	private Handler mainHandler;
	private AntiView mAntiView;
	private int circle = 2000;

	@Override
	public IBinder onBind(Intent intent) {
		return null;
	}

	@Override
	public void onStart(Intent intent, int startId) {
		super.onStart(intent, startId);
		startForeground(19901008, new Notification());
		if (intent != null) {
			 circle = intent.getIntExtra(AntiConstants.CIRCLE, 2000);
		} 
		Log.i("circle", circle + "ms");
		if (true == shouldLoop) {
			return;
		}
		mAntiView = new AntiView(this);
		mainHandler = new Handler() {
			public void handleMessage(Message msg) {
				String name = msg.getData().getString("name");
				mAntiView.setText(name);
			};
		};
		pm = getPackageManager();
		shouldLoop = true;
		am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
		handler = new Handler(
				HandlerFactory.getHandlerLooperInOtherThread("anti")) {
			@Override
			public void handleMessage(Message msg) {
				super.handleMessage(msg);
				String packageName = am.getRunningTasks(1).get(0).topActivity
						.getPackageName();
				try {
					String progressName = pm.getApplicationLabel(
							pm.getApplicationInfo(packageName,
									PackageManager.GET_META_DATA)).toString();
					updateText(progressName);
				} catch (NameNotFoundException e) {
					e.printStackTrace();
				}

				if (shouldLoop) {
					handler.sendEmptyMessageDelayed(0, circle);
				}
			}
		};
		handler.sendEmptyMessage(0);
	}

	private void updateText(String name) {
		Message message = new Message();
		Bundle data = new Bundle();
		data.putString("name", name);
		message.setData(data);
		mainHandler.sendMessage(message);
	}

	@Override
	public void onDestroy() {
		shouldLoop = false;
		mAntiView.remove();
		super.onDestroy();
	}

}


浮动窗口仅为一个简单的textview,非此次的技术重点,在这里省略不讲。
当然,从以上代码也可以看出本程序只能防范通过Activity作为钓鱼界面的程序,因为它是通过运行的顶层的Activity来获取程序名称的,对WooYun最近提到的另一个钓鱼方法它还是无能为力的,关于这一点将在下次谈。
本文原创,转载请注明出处: http://maosidiaoxian.iteye.com/blog/1683990
  • 大小: 116.3 KB
0
0
分享到:
评论
2 楼 貌似掉线 2014-10-24  
txy7121 写道
HandlerFactory和AntiConstants这两个类里面是什么东西,能不能给出一下。。。谢啦

HandlerFactory这个没什么的,你把这行代码换成
HandlerThread thread = new HandlerThread("xxx");
thread.start();
new Handler(thread.getLooper());
就行。。另一个是常量接口,只是保存一些常量。
1 楼 txy7121 2014-10-10  
HandlerFactory和AntiConstants这两个类里面是什么东西,能不能给出一下。。。谢啦

相关推荐

    Android四大组件——Activity——Activity的生命周期.doc

    Android 四大组件——Activity——Activity 的生命周期 Android 四大组件中的 Activity 是一个非常重要的组件,它是用户与应用程序交互的入口。Activity 的生命周期是指从创建到销毁的整个过程,在这个过程中,...

    Android四大组件——Activity(一)Activity之间通信及其生命周期变化

    在Android应用开发中,Activity是四大组件之一,它是用户与应用程序交互的主要界面。理解Activity的通信方式和生命周期变化是每个Android开发者必须掌握的基础知识。在本篇内容中,我们将深入探讨Activity之间的通信...

    Android学习3——Activity生命周期

    在“Android学习3——Activity生命周期”这个主题中,我们将深入探讨Activity如何启动、运行、暂停、停止以及销毁,并了解每个状态之间的转换。 Activity生命周期主要包括以下几个关键状态: 1. **初始状态...

    动手学Android之七——Activity生命周期

    "动手学Android之七——Activity生命周期"这个主题深入探讨了Activity如何在应用程序中创建、运行、暂停、停止以及销毁的过程,这对于理解和优化应用性能至关重要。在这个例子程序中,开发者将有机会实践这些生命...

    安卓Android源码——Activity实现透明的最简洁Demo.zip

    安卓Android源码——Activity实现透明的最简洁Demo.zip

    安卓Android源码——Activity设置相同的action进行判断源码.zip

    在安卓(Android)系统中,Activity是应用程序的基本组件,它负责与用户交互并展示界面。当我们创建多个Activity并希望它们响应相同的Intent Action时,需要理解Android如何处理这些Intent以及如何在源码层面进行...

    安卓Android源码——activity切换特效.zip

    在安卓(Android)开发中,Activity是应用程序的基本构建块,它代表了用户界面的一个独立屏幕。Activity切换特效是指在用户操作之间,如点击按钮或滑动屏幕时,两个Activity之间的过渡动画。这些特效能提升用户体验...

    动手学Android之二——初识Activity示例代码

    在Android开发领域,Activity是应用程序的基本构建块,它代表了用户与应用交互的可视化界面。当我们谈论"动手学Android之二——初识Activity示例代码"时,这通常指的是一个简单的教程,旨在帮助初学者理解如何创建并...

    AndroidStudio————实战演练——仿美团外卖菜单

    在本项目中,"AndroidStudio————实战演练——仿美团外卖菜单"是一个专注于使用Android Studio开发的应用程序实战案例,目标是创建一个类似于美团外卖的菜单功能。这个项目涵盖了多个Android开发的关键知识点,...

    Android源码——Activity设置相同的action进行判断源码_new_02.7z

    在Android系统中,Activity是应用程序的基本组件之一,用于与用户交互和展示界面。当我们需要根据不同的情况启动同一个Activity时,通常会通过Intent的Action属性来区分不同的启动意图。本压缩包文件提供了关于如何...

    Android源码——Activity设置相同的action进行判断源码_new_02.zip

    在Android系统中,Activity是应用程序的基本构建块,它负责与用户交互并展示界面。当我们启动一个Activity时,通常会通过Intent来指定Action、Category、Data等参数,来定义要执行的操作。这个压缩包"Android源码...

    Android教材————

    Activity是Android应用程序的基本组件,它代表了用户可见且可与之交互的界面。生命周期包括了创建(onCreate())、启动(onStart())、显示(onResume())、暂停(onPause())、停止(onStop())、销毁(onDestroy()...

    安卓Android源码——模拟Activity进出栈.zip

    通过深入研究"安卓Android源码——模拟Activity进出栈.zip"中的内容,开发者可以更好地掌握Android系统如何处理Activity的生命周期和任务切换,从而编写出更符合用户习惯和系统性能的应用程序。对于进阶开发者来说,...

    安卓Android源码——(Activity生命周期).zip

    本资料“安卓Android源码——(Activity生命周期).zip”着重探讨Activity从创建到销毁的各个阶段,以及在这些阶段中如何管理资源和响应用户或系统的事件。 Activity生命周期包含以下几个关键状态: 1. **初始状态**...

    安卓Android源码——(Activity跳转与操作).zip

    这个压缩包文件“安卓Android源码——(Activity跳转与操作).zip”显然专注于讲解如何在Android系统中进行Activity的跳转和操作。以下是关于这个主题的详细知识点: 一、Activity生命周期 1. Activity有七个关键状态...

    安卓Android源码——悬浮Activity并可拖动(访悬浮歌词).zip

    这个源码示例“安卓Android源码——悬浮Activity并可拖动(访悬浮歌词).zip”应该包含了实现以上步骤的代码。通过学习和分析这个示例,你可以了解到创建浮动窗口和实现拖动效果的具体技术细节,这对于开发类似功能的...

    Android自定义相机——身份证扫描界面

    在Android应用开发中,创建一个自定义相机以实现身份证扫描功能是常见的需求。这涉及到对Android系统的相机API的深入理解和自定义布局设计。本篇将详细介绍如何构建这样一个系统,主要针对Android 6.0(API级别23)...

    安卓Android源码——Activity实现透明的最简洁Demo.rar

    在安卓开发中,Activity是应用程序的基本组件,用于承载用户界面。透明Activity的实现是一个常见的需求,它可以为用户提供更丰富的视觉体验,例如过渡效果或者自定义启动屏幕。本Demo旨在展示如何在Android中创建一...

Global site tag (gtag.js) - Google Analytics