2012-06-13 97 views
1

更新: 我已经花了超过2小时的谷歌,但我找不到答案。我已经添加了一个main.java活动从登录活动发送的句柄。现在的文件树的样子: enter image description here是否有可能窃取Intents发送的消息?

但仍然有错误

E/AndroidRuntime(1282): android.content.ActivityNotFoundException: No Activity found to handle Intent { act=com.goodboy.loginIntent.action.main cat=[android.intent.category.DEFAULT] (has extras) }

我知道这个问题很简单,我是新到Android,任何帮助,将不胜感激:)

的Android允许对于具有特定收件人的意图(活动或服务)以及在整个系统中广播的意图,以便可能正在收听的任何组件。

我想做一个PoC(概念证明),如果我们不设置setClassName,其他人可以听你的私人信息。

这个PoC很简单,假设有应用程序Goodboy的登录活动,当用户在登录活动中输入他的用户名和密码,并点击登录按钮时,App Badboy的恶意活动窃取了此消息。

然而,失败:(

当我点击登录按钮,失败: enter image description here

与邪恶的意图啥都没:登录的

enter image description here

Java源代码活动

package com.goodboy.loginIntent; 
import com.goodboy.loginIntent.R; 
import android.app.Activity; 
import android.content.Intent; 
import android.os.Bundle; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.EditText; 
public class GoodloginActivity extends Activity { 
    private EditText et_user; 
    private EditText et_pwd; 
    private Button btn_login; 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.login); 
     et_user = (EditText) findViewById(R.id.et_user); 
     et_pwd = (EditText) findViewById(R.id.et_pwd); 
     btn_login = (Button) findViewById(R.id.btn_login); 
     btn_login.setOnClickListener(new OnClickListener(){ 
     public void onClick(View v) { 
       Intent m_intent = new Intent(); 
       m_intent.putExtra("username", et_user.getText().toString()); 
       m_intent.putExtra("password", et_pwd.getText().toString()); 
       m_intent.setAction("com.goodboy.loginIntent.action.main"); 
       m_intent.addCategory(Intent.CATEGORY_DEFAULT); 
       startActivity(m_intent); 
      } 
     }); 
    } 
} 

main.java的源代码

package com.goodboy.loginIntent; 
import android.app.Activity; 
import android.os.Bundle; 
import com.goodboy.loginIntent.R; 
public class main extends Activity { 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    } 
} 

登录布局:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical" > 


    <EditText 
     android:id="@+id/et_user" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:ems="10" > 

     <requestFocus /> 
    </EditText> 


    <EditText 
     android:id="@+id/et_pwd" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:ems="10" 
     android:inputType="textPassword" /> 


    <Button 
     android:id="@+id/btn_login" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Button" /> 

</LinearLayout> 

恶活动的Java源代码:

package com.badboy.stealIntent; 

import com.badboy.stealIntent.R; 

import android.app.Activity; 
import android.os.Bundle; 
import android.widget.Toast; 

public class BadIntentActivity extends Activity { 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     Toast.makeText(getBaseContext(), 
       "username: "+this.getIntent().getStringExtra("username")+ 
       "\npassword: "+this.getIntent().getStringExtra("password"), 
       Toast.LENGTH_SHORT).show(); 
    } 
} 

由于@大卫瓦瑟,的清单登录应用程序(更新):

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.goodboy.loginIntent" 
    android:versionCode="1" 
    android:versionName="1.0" > 
    <uses-sdk android:minSdkVersion="15" /> 
    <application 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name" > 
     <activity 
      android:name=".GoodloginActivity" 
      android:label="@string/app_name" > 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN"/> 
       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
     <activity 
      android:name=".main" 
      android:label="@string/main" > 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN"/> 
       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
    </application> 
</manifest> 

的badIntent的清单:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.badboy.stealIntent" 
    android:versionCode="1" 
    android:versionName="1.0" > 

    <uses-sdk android:minSdkVersion="15" /> 

    <application 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name" > 
     <activity 
      android:name=".BadIntentActivity" 
      android:label="@string/app_name" > 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
    </application> 

</manifest> 
+1

请在logcat中发布堆栈跟踪。 – nhaarman

+0

@Niek谢谢,我会尝试 – liweijian

+0

发布你的清单(对于两个应用程序) –

回答

1

你可能会得到一个ActivityNotFoundException当你在GoodloginActivity调用startActivity()因为没有活动已知响应该系统:

ACTION = "com.goodboy.loginIntent.action.main" and 
CATEGORY = CATEGORY_DEFAULT 

看一看你的logcat的输出。

+0

感谢大卫,我试图添加一个新的java文件来响应登录活动,但失败:( – liweijian

+0

你需要告诉Android当你用你的ACTION和CATEGORY调用startActivity()时你需要启动哪个Activity,你需要添加一个intent过滤器看起来像这样:

+0

此外,您的清单中不能有2个活动,它们具有ACTION = MAIN和CATEGORY = LAUNCHER的意图过滤器,因为当您启动应用程序时从主屏幕上,Android不知道要开始哪个活动 –

2

你应该看看Intent Intercept,旨在为开发者的应用程序,正如它的名字说,拦截任何“公共”的意图,让您浏览的意图设置和数据。意图拦截是开源的,你可以浏览代码GitHub

至于你的问题,请检查BadBoy应用程序是否注册了您正在使用的操作。另外,请看一下goodlogin中logcat中的stacktrace以查看活动崩溃的位置。

相关问题