import os import sqlite3 import argparse # 函数用于判断给定的iPhone数据库文件中是否存在名为'message'的表 def isMessageTable(iphoneDB): """ 判断指定的iPhone数据库文件中是否存在名为'message'的表。 该函数尝试连接到指定的数据库文件,查询其包含的所有表名, 然后遍历这些表名,检查是否存在名为'message'的表,若存在则返回True, 若在过程中出现数据库相关错误则返回False,并打印错误提示信息。 """ try: # 使用with语句管理数据库连接,确保连接在使用完毕后自动关闭,避免资源泄漏。 # 这里连接到传入的iphoneDB所指定的SQLite数据库文件。 with sqlite3.connect(iphoneDB) as conn: # 创建一个游标对象,用于执行SQL语句并获取查询结果。 c = conn.cursor() # 执行SQL查询语句,从sqlite_master系统表中获取所有表名。 # sqlite_master表存储了数据库的结构信息,通过WHERE条件筛选出类型为'table'的记录,即获取所有用户创建的表名。 c.execute('SELECT tbl_name FROM sqlite_master WHERE type="table";') for row in c: # 将获取到的表名转换为字符串类型,检查其中是否包含'message'字符串。 # 如果包含,则表示找到了名为'message'的表,此时返回True。 if 'message' in str(row): return True except sqlite3.Error as e: # 如果在上述数据库连接、查询等操作过程中出现sqlite3模块相关的错误, # 则打印错误提示信息,告知用户在检查数据库时出现了错误,并展示具体的错误内容。 print(f'\n[*] Error occurred while checking the database: {e}') return False # 函数用于从给定的消息数据库文件中提取并打印消息相关信息(时间、地址、内容) def printMessage(msgDB): """ 从指定的消息数据库文件中查询并打印消息记录,包括日期、发送地址和消息文本内容。 函数会尝试连接到指定的消息数据库文件,执行相应的SQL查询语句获取消息记录, 然后遍历查询结果并打印每条消息的详细信息,若出现数据库相关错误则打印错误提示信息。 """ try: # 使用with语句管理数据库连接,确保连接在使用完毕后自动关闭,避免资源泄漏。 # 这里连接到传入的msgDB所指定的SQLite数据库文件,该文件被认为是包含消息表的数据库。 with sqlite3.connect(msgDB) as conn: # 创建一个游标对象,用于执行SQL语句并获取查询结果。 c = conn.cursor() # 执行SQL查询语句,从'message'表中选取消息日期、发送地址以及消息文本内容这三个字段的信息。 # 其中,消息日期字段(date)通过'datetime'函数结合'unixepoch'模式将时间戳转换为可读的日期时间格式, # 并且通过WHERE条件筛选出发送地址(address)大于0的记录,以获取有效的消息记录。 c.execute('select datetime(date,\'unixepoch\'), address, text from message WHERE address>0;') for row in c: # 获取查询结果中每行数据对应的消息日期、发送地址和消息文本内容字段,并转换为字符串类型。 date = str(row[0]) addr = str(row[1]) text = row[2] # 打印每条消息记录的详细信息,按照指定格式展示消息的日期、发送地址和消息内容。 print('\n[+] Date:' + date +'Addr:' + addr +'Message:' + text) except sqlite3.Error as e: # 如果在上述数据库连接、查询、数据处理等操作过程中出现sqlite3模块相关的错误, # 则打印错误提示信息,告知用户在提取消息信息时出现了错误,并展示具体的错误内容。 print(f'\n[*] Error occurred while extracting message info: {e}') def main(): """ 主函数,解析命令行参数获取iPhone备份目录路径,然后在该目录下查找包含消息表的数据库文件并调用相应函数展示消息信息。 首先通过命令行参数解析获取用户指定的iPhone备份目录路径, 接着遍历该目录下的所有文件和文件夹,对每个文件判断是否为包含消息表的数据库文件, 若是则调用相应函数提取并展示其中的消息信息。 """ # 创建一个argparse模块的命令行参数解析器对象,用于定义和解析命令行参数。 # 并添加了一段描述信息,说明该程序的功能是从iPhone备份数据库中提取消息。 parser = argparse.ArgumentParser(description="Program to extract messages from iPhone backup databases") # 添加一个命令行参数选项'-p',指定参数名为'pathName',类型为字符串类型, # 用于让用户指定iPhone备份目录的路径,并添加相应的帮助提示信息。 parser.add_argument('-p', dest='pathName', type=str, help='specify iPhone backup path') # 解析命令行参数,返回一个包含解析后参数的命名空间对象以及剩余未解析的参数列表(这里暂未使用剩余未解析参数)。 options = parser.parse_args() pathName = options.pathName # 如果用户没有通过命令行参数指定路径(即pathName为None), # 则打印参数帮助信息,告知用户如何正确使用程序参数,然后退出程序。 if pathName is None: parser.print_help() exit(0) else: # 使用os.listdir函数获取指定iPhone备份目录下的所有文件和文件夹名称列表, # 该列表包含了备份目录中的所有条目名称。 dirList = os.listdir(pathName) for fileName in dirList: # 通过os.path.join函数,将iPhone备份目录路径和当前遍历到的文件名拼接起来, # 得到每个文件在iPhone备份目录下的完整路径,以便后续判断和操作。 iphoneDB = os.path.join(pathName, fileName) if isMessageTable(iphoneDB): print('\n[*] --- Found Messages ---') printMessage(iphoneDB) if __name__ == '__main__': main() 运行命令: python D:\Projects\pythonProject1\网络\iphone_message_extractor.py -p C:\Users\你的用户名\iPhone备份目录路径
iPhone 备份信息洞察引擎
最新推荐文章于 2025-05-28 23:39:14 发布