要做好取证分析工作,对取证知识的熟练和掌握必不可少。之前在【技术视界】栏目我们推出了一篇《【技术视界】Windows取证分析基础知识大全,赶快收藏!》文章,广受大家好评。
今天,我们又给大家整理了在手机取证分析中的常用知识点,包括SQLite文件分析、常用调试工具、常见痕迹信息存储路径等知识点。本文内容较多,知识点充沛扎实,值得收藏仔细阅读哦。
一、SQLite文件相关知识
01.文件结构介绍
手机数据库一般用的是SQLite,SQLite是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,SQLite的数据类型为Typelessness。整个数据库(定义、表、索引和数据本身)都在宿主主机上存储在单一的文件中,文件的magic number是“0x53514C69746520666F726D61742033”(字符串为“SQLite format 3”)如图1所示:
图1:SQLite文件头结构图
从逻辑结构角度来看,SQLite数据库文件的最小管理单元是“页(page)”结构,页的类型有Btree页、空闲页、溢出页。页的大小是固定的,且在数据库被创建时设置,一般默认大小为1024byte,每个Btree页由四个部分构成,依次为:页头,单元指针数组,未分配空间,单元内容区,如图2:
图2:BTree页的结构图
在数据库的使用过程中也会产生一些临时文件,包括Journal files(*.journal)和Write Ahead Logs(*.wal)文件。
*.journal:主要用途是当事务要修改page时,先把未修改的page存入journal中,如果事务rollback时,就从journal中得到修改前的数据,覆盖已改的,达到事务的一致性。一般情况下,journal是一个不同于数据库文件的另一个文件,它在事务开始时创建,当事务结束时就删除;
*.wal:是一种日志模式,SQLite3.7.0 版本后引入了新的预写日志机制。每个事务执行变更时,修改数据页,同时会产生日志,这样在事务提交后,不需要将修改的脏页刷盘,只需要将事务产生的日志落盘即可返回。
02.SQLite常见的解析工具
03.SQLite分析中常用的SQL语句
SQL查询语句的常用结构
常用结构:SELECT 列名称 FROM 表名称 WHERE 列 运算符 值 ORDER BY列
注意事项:
◆SQL语句中不区分大小写
◆红色部分为SQL语句中SELECT最简结构
◆若需查询所有列,可用使用符号*取代列的名称,如:SELECT * FROM tablename
联合查询
在很多社交聊天的APP中,分析数据时我们需要从两个或更多的表中获取结果,就会用到join语句。
1、语句结构
SELECT tabelA.column1, tabelA.column2, tabelB.column1,tabelB.column2 FROM tabelA LEFT JOIN tabelB ON tabelA.column3 = tabelB.column4
下面以查询微信数据库为例,语句编写为:
Select message.createTime,message.talker,message.content,rcontact.username,rcontact.nickname from message left join rcontact on rcontact.username = message.talker
常用函数
1、列名、表名重命名函数
SELECT m.column AS rcolumn FROM tablename AS m
2、统计函数
SELECT COUNT(*) FROM tablename;
或
SELECT COUNT(column) FROM tablename;
也可加入去重函数,结合使用:
SELECT COUNT(DISTINCT(column)) FROM tablename;
3、排序函数 ORDER BY
order by中asc(默认)代表升序,desc代表降序
SELECT * FROM tablename ORDER BY column ASC;
4、模糊匹配函数 LIKE
SELECT * FROM tablename WHERE column LIKE ‘%xxx%’;
时间转换
大部分智能手机的数据库中都记录有时间戳,在分析取证过程中常常需要进行时间格式的转换。
1、一般智能手机中的时间记录值是Unix时间戳
该值是从1970年1月1日(UTC/GMT的午夜)开始所经过的秒数,不考虑闰秒。在SQL语句中可使用datetime函数来进行转换,语句的格式为:SELECT datetime(column,'unixepoch') ;
1)如果要考虑时区的问题,可以通过datetime函数中关键字’localtime’来调整
2)如果可以确认时区信息,可以按照下面的方式直接进行调整
▲需要注意的是,上述示例中时间戳的精度均为毫秒(ms),但在一些场景中时间戳的精度为秒(s),在进行时间转换的时候不需如上例将时间戳除以1000。
2、除Unix时间戳,在智能手机中的时间戳还涉及到2种格式,分别是Mac时间戳和Chrome时间戳。
Mac时间戳是从2001年1月1日(UTC/GMT的午夜)开始所经过的秒数,Chrome时间戳是从1601年1月1日(UTC/GMT的午夜)开始所经过的微秒数,这两种时间戳要使用datetime函数,需要对时间戳进行转换。
1)Mac时间戳转换的格式
SELECT datetime(column + (strftime('%s','2001-01-01')),' unixepoch ', 'localtime' ) FROM tablebname;或SELECT datetime(column + 978307200,' unixepoch ', 'localtime' ) FROM tablebname;
2)Chrome时间戳转换的格式
SELECT datetime(column/1000000 +(strftime('%s','1601-01-01')),' unixepoch ', 'localtime') FROM tablebname;
3、当前时间点的时间戳格式区分小窍门
◆UTC时间戳(精度为s)一般长度为10
◆UTC时间戳(精度为ms)一般长度为13
◆Mac时间戳一般长度为9(此时间戳一般带有小数点,该值为小数点前的位数)
◆UTC时间戳一般长度为17
04.SQLite删除数据恢复
基于 SQLite 存储结构的数据恢复方法
1、基于文件系统的恢复
依据文件系统的元信息和结构特征,进行基于文件系统的数据恢复操作,还原 SQLite 数据库,再从中提取出记录。
2、基于SQLite数据库文件结构的恢复
在手机镜像或数据库文件中找到有效数据页,再从数据页中按照记录的结构特征提取记录进行恢复。
基于 SQLite 日志的数据恢复方法
在手机镜像或数据库文件中找到有效的数据页/数据块,进行校验后再提取记录。
二、常用调试工具
01.aapt
aapt即Android Asset Packaging Tool,在SDK的build-tools目录下。该工具可以查看,创建, 更新ZIP格式的文档附件(zip, jar, apk)。也可将资源文件编译成二进制文件。
1、aapt dump badging
查看apk包的packageName、versionCode、applicationLabel、launcherActivity、permission等各种详细信息
2、aapt dump permissions
查看apk请求的权限
02.ADB command
借助adb工具,我们可以管理设备或手机模拟器的状态。还可以进行很多手机操作,如安装软件、系统升级、运行shell命令等等。其实简而言说,adb就是连接Android手机与PC端的桥梁,可以让用户在电脑上对手机进行全面的操作。
常用的adb指令集
adb devices #打开USB调试输入命令连接
adb –s deviceid
adb install -r xxx.apk #强制安装某个apk到手机
adb uninstall [packagename] #卸载某个应用
adb uninstall -k [packagename] #不删除程序运行所产生的数据和缓存目录(如软件的数据库文件)
adb pull androidpath PCpath #从手机传送文件到电脑上
adb push PCpath androidpath #将电脑上文件传送手机上(遇到push文件出现read-only提示:尝试下列指令来进行修复此问题adb disable-verity 、 adb remount,adb root)
adb forward
adb backup #备份手机数据,示例备份微信数据:adb backup -f mm.ab -noapk -shared –nosystem com.tencent.mm
adb connect ipaddress:port#利用TCP/IP协议来连接同网段远程设备
adb reboot #重启手机
adb reboot edl#进入高通的9008(edl)模式
adb reboot recovery #进入手机recovery模式
adb reboot fastboot/bootloader #进入手机fastboot/bootloader模式
adb start-server #开启adb服务
adb kill-server #关闭adb服务
adb logcat #打印log
adb logcat –v time – s Launcher > E:\log.txt #打印包含关键在Launcher以及时间的log输出到E盘的log.txt中
adb shell su 成功标志
已经root版本显示#,非root手机版本显示$
获取系统信息相关指令
adb shell dumpsys activity #打印activity栈信息(通过栈信息可以很快的定位当前界面是在哪一个Activity
adb shell dumpsys meminfo #打印内存信息
adb shell dumpsys cpuinfo #打印各个进程的cpu使用率
adb shell dumpsys window #显示键盘,窗口和它们的关系
adb shell dumpsys batteryinfo #电量信息及CPU 使用时长
adb shell dumpsys package #获取安装包信息
adb shell getprop ro.build.version.release #获取手机系统版本
adb shell getprop ro.build.version.sdk#获取手机系统api版本
adb shell dumpsys iphonesubinfo;adb shell getprop gsm.baseband.imei;adb shell service call iphonesubinfo 1 #获取手机的IMEI
adb shell getprop ro.serialno#获取手机的序列号
adb shell getprop ro.product.brand#获取手机厂家
adb shell getprop ro.product.model#获取手机型号
adb shell getprop ro.product.version #获取厂家自定内部版本号
adb shell getprop | grep product #获取手机product信息
Package Manager(pm)相关指令
1、pm list package #列出所有的应用的包名
该指令有下列参数可选择:
命令最后增加filter:过滤关键字,可以很方便地查找自己想要的应用。例如,查找三方应用中腾讯系列产品的包名、apk存放位置、安装来源:
adb shell pm list package -f -3 -i tencent
2、pm path #列出对应包名的 .apk 位置
3、pm get-install-location #获取当前设置的应用安装路径,其中:
4、pm install xxx.apk 安装应用
Activity Manager (am)相关指令
1、adb shell am start [options]
例如启动照相机可使用:adb shell am start -n com.android.camera/.Camera
该指令还可以启动应用后执行一些功能,比如启动拨号器并拨打10086
打开浏览器并访问“www.baidu.com”
当启动不存在的应用时,出现以下情况
2、adb shell am startservice [options]
如adb shell am startservice -n com.lt.test/.MyService
3、adb shell am force-stop com.tencent.mm #强制关闭一个应用程序
input 相关指令
adb shell input text xxxxx #发送文本内容,但不能发送中文
adb shell input keyevent keycode#发送约定的按键事件,常见的keycode请见附录A
adb shell input tap x y#对屏幕发送一个触摸事件,触摸的坐标为(x,y)
adb shell input swipe x1 y1 x2 y2 duration#向设备发送一个滑动指令,从坐标(x1,y1)滑动到(x2,y2),且滑动时长为duration(ms)
find 相关指令
find 搜索路径 [选项] 搜索内容
find . -name "*. apk " #将目前目录及其子目录下所有后缀名名是 apk 的文件列出来
find /data -name filename.db #查找/data 下指定文件名
find / -ctime -20 #将根目录下所有最近 20 天内更新过的文件列出
find /var/log -type f -mtime +7 #查找/var/log目录中更改时间在7日以前的普通文件(find指令使用方式较多,本文就不再赘述,根据使用需要可执行查找)
其他常用指令
adb shell uiautomator dump /sdcard/ui.xml #获取页面的控件信息保存到/sdcard/ui.xml
adb shell screencap -p /sdcard/app.png #获取屏幕截图保存到/sdcard/app.png
adb shell svc power stayon true #保持常亮
adb shell ps |find "uiautomator" #查找名为“uiautomator”的进程号
常用fastboot指令
fastboot oem lock-state info #华为获取bl锁状态
fastboot oem get-build-number #华为获取当前固件版本
adb reboot edl ;fastboot oem edl ;fastboot reboot emergency #进入高通的9008(edl)模式
Android设备常用的其他命令
操作Android 设备常用到的其他命令,这里只简单列出,不做详细介绍!常用其他命令如下:
cat、cd、chmod、cp、date、df、du、grep、kill、ln、ls、lsof、netstat、rm、rmdir、top、touch、重定向符号 ">" ">>"、管道 "|"
03.libimobiledevice
libimobiledevice 是一个跨平台的软件库,支持 iPhone, iPod Touch, iPad and Apple TV 等设备的通讯协议。不依赖任何已有的私有库,不需要越狱。应用软件可以通过这个开发包轻松访问设备的文件系统、获取设备信息,备份和恢复设备,管理 SpringBoard 图标,管理已安装应用,获取通讯录、日程、备注和书签等信息,使用 libgpod 同步音乐和视频。该库支持MacOS和Linux平台。
idevice_id -l # 显示当前所连接的设备[udid],包括 usb、WiFi 连接
instruments -s devices # 列出设备包括模拟器、真机及 mac 电脑本身
ideviceinstaller -u [udid] -i [xxx.ipa] # 给指定连接的设备安装应用
ideviceinfo -u [udid] # 指定设备,获取设备信息
ideviceinfo -u [udid] -k DeviceName # 指定设备,获取设备名称:iPhone6s
ideviceinfo -u [udid] -k ProductVersion # 指定设备,获取设备版本:10.3.1
ideviceinfo -u [udid] -k ProductType # 指定设备,获取设备类型:iPhone8,1
ideviceinfo -u [udid] -k ProductName # 指定设备,获取设备系统名称:iPhone OS
指令还包括:idevicebackup,idevicecrashreport,idevicedate,ideviceenterrecovery,ideviceimagemounter,idevicename,idevicenotificationproxy,idevicepair,ideviceprovision,idevicescreenshot,idevicesyslog等。
三、常见痕迹信息
1、常见APP的用户数据文件保存路径
2、常见APP包名
本期投稿:朱大师
本期编辑:源妹
参考资料:https://digital-forensics.sans.org/media/DFIR-Smartphone-Forensics-Poster.pdf
技术干货,在线浏览
效率源在线技术干货来啦!效率源微信公众号定期精选近年最新最实用的技术文章30篇,内容涵盖手机取证、数据库取证、网络取证、Windows取证、AI视频真假鉴别等一系列电子数据取证实战知识,欢迎查阅!
获取途径:
1、关注效率源公众号,点击效率源公众号上菜单栏【关于我们】,选择【精选干货】即可进入技术盛宴。
2、进入页面,效率源精选技术干货统统都在这里啦。