2012-06-13 72 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以查看活動崩潰的位置。

相關問題