热门标签 | HotTags
当前位置:  开发笔记 > 数据库 > 正文

Android黑科技,读取用户短信+修改系统短信数据库

安卓系统比起ios系统最大的缺点,相信大家都知道,就是系统安全问题。这篇博客就秀一波“黑科技”。读取用户短信Android应用能读取用户手机上的短信,相信已经不是什么

 

  安卓系统比起ios系统最大的缺点,相信大家都知道,就是系统安全问题。这篇博客就秀一波黑科技

 

读取用户短信

 

Android应用能读取用户手机上的短信,相信已经不是什么新鲜事,比如我们收到的短信验证码,一些app马上就能自动获取并填上验证码,省去我们手动填写验证码。原理就是通过Android的ContentProvider组件间接访问系统的短信数据库,获取所有短信内容。下面来演示一下。

 

         布局很简单,如下:

 

代码如下:

public class MainActivity extends Activity {

List
smsList;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

smsList
= new ArrayList();
}


public void click(View v){
//访问内容提供者获取短信
ContentResolver cr = getContentResolver();
// 短信内容提供者的主机名
Cursor cursor = cr.query(Uri.parse("content://sms"), new String[]{"address", "date", "body", "type"},
null, null, null);
while(cursor.moveToNext()){
String address
= cursor.getString(0);
long date = cursor.getLong(1);
String body
= cursor.getString(2);
String type
= cursor.getString(3);
Message sms
= new Message(body, type, address, date);
smsList.add(sms);
Log.e(
"TAG", sms.toString());
}
}

public void click2(View v){
XmlSerializer xs
= Xml.newSerializer();
File file
= new File("sdcard/sms.xml");
FileOutputStream fos;
try {
fos
= new FileOutputStream(file);
xs.setOutput(fos,
"utf-8");

xs.startDocument(
"utf-8", true);
xs.startTag(
null, "message");

for (Message sms : smsList) {
xs.startTag(
null, "sms");

xs.startTag(
null, "body");
xs.text(sms.getBody());
xs.endTag(
null, "body");

xs.startTag(
null, "date");
xs.text(sms.getDate()
+ "");
xs.endTag(
null, "date");

xs.startTag(
null, "type");
xs.text(sms.getType());
xs.endTag(
null, "type");

xs.startTag(
null, "address");
xs.text(sms.getAddress());
xs.endTag(
null, "address");

xs.endTag(
null, "sms");
}

xs.endTag(
null, "message");
xs.endDocument();
}
catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

}

Message类代码:

 

 1 package com.itheima.getsms.domain;
2
3 public class Message {
4
5 private String body;
6 private String type;
7 private String address;
8 private long date;
9 public String getBody() {
10 return body;
11 }
12 public void setBody(String body) {
13 this.body = body;
14 }
15 public String getType() {
16 return type;
17 }
18 public void setType(String type) {
19 this.type = type;
20 }
21 public String getAddress() {
22 return address;
23 }
24 public void setAddress(String address) {
25 this.address = address;
26 }
27 public long getDate() {
28 return date;
29 }
30 public void setDate(long date) {
31 this.date = date;
32 }
33 public Message(String body, String type, String address, long date) {
34 super();
35 this.body = body;
36 this.type = type;
37 this.address = address;
38 this.date = date;
39 }
40 @Override
41 public String toString() {
42 return "Message [body=" + body + ", type=" + type + ", address="
43 + address + ", date=" + date + "]";
44 }
45
46
47 }

 

 

 

要读取手机短信和插入短信,还必须加上一下权限:

  


 

下面来分析一下代码:第一个按钮通过ContentProvider间接获取了一些短信的信息,保存在一个List数组下。我们先导出Android系统的sms表看一下:

 

总共有17个字段这么多,显然不是我们都关心的,这里只要了address,date, body, type四个字段,分别表示对方号码,短信时间,短信内容,发送还是接收。第二个按钮把短信相关信息存储在一个序列化的XML文件中,方便查看。

 

放上XML截图:

 

 

可以看出此时手机上共有5条短信,大功告成。

 

 

修改系统短信数据库

         真正的黑科技来了,相信大家知道有些不法分子能冒充各种号码发布虚假信息,如10086啥的,下面示范一下用95533(建行)发送一条愚人节贺卡。

         代码如下:

 

public class MainActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}


public void click(View v){
Thread t
= new Thread(){
@Override
public void run() {
ContentResolver cr
= getContentResolver();
ContentValues values
= new ContentValues();
values.put(
"address", 95533);
values.put(
"type", 1);
values.put(
"date", System.currentTimeMillis());
values.put(
"body", "您尾号为9999的信用卡收到1,000,000RMB转账,请注意查收");
cr.insert(Uri.parse(
"content://sms"), values);
}
};
t.start();
}

}

 

思路跟前一步差不多,不过这里是插入一条短信。实现效果:

顺带一提,从Android 5.0开始,默认短信应用外的软件不能以写入短信数据库的形式(write sms)发短信,也就是说修改系统短信数据库行不通了,不过读取用户短信这个bug至今还没修复。所以不想被骗的童鞋还是感觉升级5.0以上的版本吧^_^

       

 


推荐阅读
  • 在计算机技术的学习道路上,51CTO学院以其专业性和专注度给我留下了深刻印象。从2012年接触计算机到2014年开始系统学习网络技术和安全领域,51CTO学院始终是我信赖的学习平台。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 深入理解 Oracle 存储函数:计算员工年收入
    本文介绍如何使用 Oracle 存储函数查询特定员工的年收入。我们将详细解释存储函数的创建过程,并提供完整的代码示例。 ... [详细]
  • 本文总结了2018年的关键成就,包括职业变动、购车、考取驾照等重要事件,并分享了读书、工作、家庭和朋友方面的感悟。同时,展望2019年,制定了健康、软实力提升和技术学习的具体目标。 ... [详细]
  • CSS 布局:液态三栏混合宽度布局
    本文介绍了如何使用 CSS 实现液态的三栏布局,其中各栏具有不同的宽度设置。通过调整容器和内容区域的属性,可以实现灵活且响应式的网页设计。 ... [详细]
  • Linux 系统启动故障排除指南:MBR 和 GRUB 问题
    本文详细介绍了 Linux 系统启动过程中常见的 MBR 扇区和 GRUB 引导程序故障及其解决方案,涵盖从备份、模拟故障到恢复的具体步骤。 ... [详细]
  • 本文介绍了如何使用jQuery根据元素的类型(如复选框)和标签名(如段落)来获取DOM对象。这有助于更高效地操作网页中的特定元素。 ... [详细]
  • 本文介绍如何在 Xcode 中使用快捷键和菜单命令对多行代码进行缩进,包括右缩进和左缩进的具体操作方法。 ... [详细]
  • 在Linux系统中配置并启动ActiveMQ
    本文详细介绍了如何在Linux环境中安装和配置ActiveMQ,包括端口开放及防火墙设置。通过本文,您可以掌握完整的ActiveMQ部署流程,确保其在网络环境中正常运行。 ... [详细]
  • 本文介绍如何通过Windows批处理脚本定期检查并重启Java应用程序,确保其持续稳定运行。脚本每30分钟检查一次,并在需要时重启Java程序。同时,它会将任务结果发送到Redis。 ... [详细]
  • 本文详细分析了JSP(JavaServer Pages)技术的主要优点和缺点,帮助开发者更好地理解其适用场景及潜在挑战。JSP作为一种服务器端技术,广泛应用于Web开发中。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 本文将详细介绍如何使用剪映应用中的镜像功能,帮助用户轻松实现视频的镜像效果。通过简单的步骤,您可以快速掌握这一实用技巧。 ... [详细]
  • 数据管理权威指南:《DAMA-DMBOK2 数据管理知识体系》
    本书提供了全面的数据管理职能、术语和最佳实践方法的标准行业解释,构建了数据管理的总体框架,为数据管理的发展奠定了坚实的理论基础。适合各类数据管理专业人士和相关领域的从业人员。 ... [详细]
  • 深入理解Cookie与Session会话管理
    本文详细介绍了如何通过HTTP响应和请求处理浏览器的Cookie信息,以及如何创建、设置和管理Cookie。同时探讨了会话跟踪技术中的Session机制,解释其原理及应用场景。 ... [详细]
author-avatar
阳吉登
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有