📜  Android中的任务劫持

📅  最后修改于: 2022-05-13 01:55:02.043000             🧑  作者: Mango

Android中的任务劫持

极客们好,今天我们将学习一个非常新的重要的 Android 概念,称为任务或活动劫持。这个概念告诉我们攻击者或黑客如何劫持应用程序并从我们手机中的应用程序中窃取重要数据。 Task Hijacking 的概念最早由 USENIX 在 2015 年提出,也被很多研究人员称为 Strandhogg。

理解概念

一个 android 应用程序包含许多任务。任务是执行的活动和步骤的集合。每当我们运行应用程序时,都会有一个称为回栈的操作,这意味着我们打开或完成的最后一个任务。因此,主要思想是通过更改应用程序清单文件中的一些配置来更改运行时的任务或活动。让我们通过一个例子来了解后台堆栈和当前活动(前台活动) -

  • 名为 A1 的活动作为当前活动或前台活动运行。
  • 我们打开另一个名为 A2 的活动。
  • 现在 A1 被推入后台堆栈,A2 成为前台活动。
  • 当活动 A2 关闭时,活动 A1 再次成为前台活动。

这就是 Android 应用程序中活动之间导航的工作方式。

了解一些重要术语

任务亲和性:任务亲和性是一个属性,指示活动更喜欢属于哪个任务。默认情况下,同一个应用程序中的所有活动都喜欢在同一个任务中。用于任务亲和性的一段代码

启动模式:启动模式允许您定义活动的新实例如何与当前任务相关联。启动模式属性的工作是指定如何在特定任务中启动活动的指令。有四种不同类型的启动模式

  1. 标准
  2. 单顶
  3. 单任务
  4. 单实例

我们将在这篇文章中做什么?

在本文中,我们将创建两个名为hacker_app 和user_application 的应用程序。我们可以将 user_application 视为用户使用的普通应用程序,hacker_app 视为将劫持 user_application 以窃取用户数据的应用程序。下面显示了我们将在本文中构建的示例视频,以便我们可以证明任务劫持的概念。

逐步实施以创建 user_application

第 1 步:创建一个新项目

  • 打开一个新项目。
  • 我们将使用Java语言开发 Empty Activity。保持所有其他选项不变。
  • 将应用程序命名为 user_application。
  • 将有两个名为 activity_main.xml 和 MainActivity 的默认文件。Java

如果您不知道如何在 Android Studio 中创建新项目,可以参考如何在 Android Studio 中创建/启动新项目?

第 2 步:处理 XML 文件

导航到app > res > layout > activity_main.xml并将以下代码添加到该文件。下面是activity_main.xml文件的代码。

XML


  
    
  
    
  
    
  
    


XML


  
    
  
    
  
    
    


XML


  
    
        
        
  
            
                
  
                
            
        
    


Java
package com.example.user_application;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import androidx.appcompat.app.AppCompatActivity;
  
public class MainActivity extends AppCompatActivity {
    EditText username, password;
    Button clk;
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        username = (EditText)findViewById(R.id.username);
        password = (EditText)findViewById(R.id.password);
        clk = (Button)findViewById(R.id.button);
    }
  
    public void movepage(View v)
    {
        String stname = username.getText().toString();
        String stpass = password.getText().toString();
        if (stname.equals("gfg")
            && stpass.equals("gfg123")) {
            Intent in = new Intent(MainActivity.this,
                                   LoggedIn.class);
            in.putExtra("username", stname);
            in.putExtra("password", stpass);
            startActivity(in);
        }
    }
}


Java
package com.example.user_application;
  
import android.content.Intent;
import android.os.Bundle;
import android.widget.EditText;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;
  
public class LoggedIn extends AppCompatActivity {
  
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_logged_in);
  
        TextView userdisp
            = (TextView)findViewById(R.id.userdisp);
        TextView passdisp
            = (TextView)findViewById(R.id.passdisp);
  
        Intent intent = getIntent();
        String username = intent.getStringExtra("username");
        String password = intent.getStringExtra("password");
        userdisp.setText(username);
        passdisp.setText(password);
    }
}


XML


  
    
  
    
  


Java
package com.example.hacker_app;
import android.Manifest;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.Build;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import com.google.android.material.snackbar.Snackbar;
  
public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        moveTaskToBack(true);
    }
  
    @Override public void onResume()
    {
        super.onResume();
        setContentView(R.layout.activity_main);
    }
}


XML


    
    
        
  
            
                
  
                
            
        
    


按照路径应用 > 右键单击 > 新建 > 活动 > 空活动 > 将其命名为“LoggedIn” 。导航到app > res > layout > activity_logged_in.xml并将以下代码添加到该文件。下面是 activity_logged_in.xml 文件的代码。

XML



  
    
  
    
  
    
    

导航到app > manifests > AndroidManifest.xml并在其中使用以下代码 -

XML



  
    
        
        
  
            
                
  
                
            
        
    

请注意,启动模式设置为“singleTask”,这是存在漏洞的地方。

第 3 步:处理Java文件

转到 MainActivity。 Java文件并参考以下代码。下面是 MainActivity 的代码。 Java文件。

Java

package com.example.user_application;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import androidx.appcompat.app.AppCompatActivity;
  
public class MainActivity extends AppCompatActivity {
    EditText username, password;
    Button clk;
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        username = (EditText)findViewById(R.id.username);
        password = (EditText)findViewById(R.id.password);
        clk = (Button)findViewById(R.id.button);
    }
  
    public void movepage(View v)
    {
        String stname = username.getText().toString();
        String stpass = password.getText().toString();
        if (stname.equals("gfg")
            && stpass.equals("gfg123")) {
            Intent in = new Intent(MainActivity.this,
                                   LoggedIn.class);
            in.putExtra("username", stname);
            in.putExtra("password", stpass);
            startActivity(in);
        }
    }
}

转到登录。 Java文件并参考以下代码。下面是 LoggedIn 的代码。 Java文件。

Java

package com.example.user_application;
  
import android.content.Intent;
import android.os.Bundle;
import android.widget.EditText;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;
  
public class LoggedIn extends AppCompatActivity {
  
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_logged_in);
  
        TextView userdisp
            = (TextView)findViewById(R.id.userdisp);
        TextView passdisp
            = (TextView)findViewById(R.id.passdisp);
  
        Intent intent = getIntent();
        String username = intent.getStringExtra("username");
        String password = intent.getStringExtra("password");
        userdisp.setText(username);
        passdisp.setText(password);
    }
}

现在我们的 user_application 已成功创建。

逐步实现创建hacker_app

第 1 步:创建一个新项目

  • 打开一个新项目。
  • 我们将使用Java语言开发 Empty Activity。保持所有其他选项不变。
  • 将应用程序命名为 user_application。
  • 将有两个名为 activity_main.xml 和 MainActivity 的默认文件。Java

如果您不知道如何在 Android Studio 中创建新项目,可以参考如何在 Android Studio 中创建/启动新项目?

第 2 步:处理 activity_main.xml 文件

导航到 app > res > layout > activity_main.xml 并将以下代码添加到该文件。下面是 activity_main.xml 文件的代码。

XML



  
    
  
    
  

第 3 步:处理 MainActivity。Java

转到 MainActivity。 Java文件并参考以下代码。下面是 MainActivity 的代码。 Java文件。

Java

package com.example.hacker_app;
import android.Manifest;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.Build;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import com.google.android.material.snackbar.Snackbar;
  
public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        moveTaskToBack(true);
    }
  
    @Override public void onResume()
    {
        super.onResume();
        setContentView(R.layout.activity_main);
    }
}

第 4 步:处理 AndroidManifest.xml 文件

XML



    
    
        
  
            
                
  
                
            
        
    

在手机上安装这两个应用程序。

输出:

在上面的视频中可以看到,当user_application正常打开时,它运行在自己的任务中。当我打开hacker_app时,前台没有任何反应,但是由于上面定义的属性,该应用程序打开并最小化了自身对最近应用程序的隐藏。现在再次打开user_application,可以看到hacker_app劫持了user_application的任务。所以,这都是关于任务劫持概念的演示。