逆向开发学习手机取证之钉钉取证分析

article/2025/10/4 12:44:28

一、钉钉取证分析


       钉钉是阿里巴巴专为中国企业推出的一款企业级应用。其主要支持视频会议、商户电话、聊天、企业通讯录以及企业办公协同等功能。其采用AES加密算法与第三方加密相结合,来提高用户数据的安全等级,旨在为企业员工间的交流、协同提供一个安全的环境。

       本文所分析的钉钉版本信息分别为:iPhone V2.15.0 (从App Store下载,更新日期:2016年8月13日);Android V2.15.0(从应用宝下载,更新日期:2016年8月15日)。

1.1iPhone 钉钉的数据分析

       iPhone版本的钉钉用户数据主要存储在\Documents\db<32BitsString>下文件名为db.sqlite的SQLite数据库文件中,其中:<32BitsString>表示特定ID通过MD5加密算法加密后的32位密文,该特定ID由每个注册账号的系统ID (记为uid)拼接”@dingding”后缀所得的字符串,即uid@dingding。此外,该目录下含有db.sqlite相应的加密文件(db.sqlite-encrypt)和日志文件(db.sqlite-shm、db.sqlite-wal)。由于重要的数据文件被加密,因此对钉钉进行取证分析需预先对数据库文件进行解密。表1为解密后db.sqlite数据库中部分数据库表表名及其功能。

在这里插入图片描述

       由表1可知用户信息、钉钉好友、企业通讯录、DING消息等数据均可从相应的数据库表中获取到所需数据。聊天内容则需通过WKConversation、WKChat_V32String两个表关联查询。表2、表3分别列出了WKConversation和WKChat_V32String的表结构,其中WKConversation表主要用于存储会话ID、会话类型等信息;WKChat_V32String表则存储详细的聊天记录包括聊天内容、消息类型、日期、媒体附件信息等主要数据。

根据WKConversation表关联WKChat_V32String主要步骤可描述为:

  • STEP1:从WKConversation表中查找conversationId字段所对应的值,记为VcId标识会话ID,执行STEP2。

  • STEP2:根据STEP1所得的会话ID关联与相应的聊天内容表。即对VcId进行MD5加密得32位的密文,记为VMD5String。即VMD5String = MD5Encode(VcId) ,其中MD5Encode表示MD5加密算法,执行STEP3。

  • STEP3:拼接表名。在STEP2计算所得的32位密文VMD5String,前添加” WKChat_”前缀后即为所求表名。

       根据上述步骤即可关联到所需的聊天记录表,且可根据WKConversation表中tag字段所设置的值进行过滤,从而获取特定类别的聊天记录。

在这里插入图片描述
在这里插入图片描述

1.2Adnroid 钉钉的数据分析

       Android版钉钉的主要数据库文件存储在/data/data/com. libaba. android. rimet/ databases目录下,用户数据主要存储在.db 以及<MD5Encode (uid@ dingding)>.db这两个数据库文件中。与iPhone版本相似,Android版本的钉钉主要数据库文件经过AES加密算法加密。因此,需预先对其进行解密。表4描述了.db和<MD5Encode (uid@dingdin g)>.db解密后主要的数据库表名、相应的功能描述以及存储位置。

在这里插入图片描述

       其中,uid表示登陆账号的系统ID; MD5Encode(id)表示变量id 经过MD5加密算法加密后的32位密文;tbmsg_Aid_Bid表示Aid与Bid的聊天记录所在表名。

       从解密后的数据库文件易知,文件名为.db的数据库主要存储登陆账号、钉钉好友、群组列表等数据;而聊天记录相关内容则存储在<MD5Encode(id)>.db的数据库中。与iPhone版的处理方式相似,聊天记录均需要通过多表关联获取,即tbconversation与tbmsg_Aid_Bid进行关联。其中tbconversation表存储会话ID、会话类型等信息;详细的聊天记录则存储在与之相应的tbmsg_Aid_Bid表中。

因此,关联tbmsg_Aid_Bid表可分为三个主要步骤进行:

  • STEP1:从tbconversation表中查找cid字段所对应的值,记为VcId标识会话ID,执行STEP2。
  • STEP2:根据STEP1所得的会话ID获取当前会话所对应的用户ID,记Bid,执行STEP3。
  • STEP3:拼接表名。根据STEP2计算所得的Bid,拼接表名,其拼接模式为tbmsg_Aid_Bid,其中Aid为登陆账号的用户ID,Bid为与Aid进行会话的用户ID。因此,当登陆账号为uid时,其与账号为Fid的好友聊天记录表名为tbmsg_uid_Fid。List item

综上所述,若要关联会话ID为1234567:66666666的聊天记录表,其中登陆账号的uid为66666666,则与之相应的聊天记录表名为:tbmsg_66666666_1234567。

1.3钉钉密聊模式的数据分析

       密聊是钉钉的主要特色之一,该模式下不显示用户名称及头像;聊天消息设置了自动销毁时间且无法复制及转发。图1所示分别为iPhone版本、Android版本密聊的初始会话窗口。

在这里插入图片描述

       由图1可看出除了第二条提示信息之外,iPhone版与Android版的密聊初始会话窗口提示语基本相同。其中iPhone端的提示为“消息在服务端不留痕迹”,如图1(a)所示;而Android端则提示为“消息在各端不留痕迹”,如图1(b)所示。这说明iPhone版本与Android版本对密聊消息的处理方式存在一定的区别。

       下面通过实例来分析iPhone端与Android端对密聊消息的不同处理方式。具体测试方法如下:1)分别在iPhone SE和酷派S6两部手机上登陆已注册的两个钉钉账号作为密聊消息的接收方,记iPhone端登陆的账号为A,Android端登陆的账号为B;2)从另一台设备登陆账号C,并分别向A和B发起密聊,记消息内容为M;3)分别比较A、B在消息M为未读和已读后被销毁这两种状态下数据库的变化情况。当A与B分别阅读所接收消息M 30秒后,此部分消息在手机界面被自动销毁。

       根据1.1节、1.2节分别对iPhone版本和Android版本数据的分析方法,可容易关联到密聊的消息记录,其中密聊的tag = 4。图2所示为的C与A的密聊消息在销毁前后的数据库对比情况,即iPhone端密聊消息销毁前后的数据库变化情况;由图2可看出,iPhone端数据销毁后WKChat_V32BitString表中的记录并未被从数据库中删除,与销毁前一样content字段的内容仍是明文显示,仅修改了unreadCount字段和isDel字段相应的值。其中unreadCount字段表示消息的未读数,0表示已读;isDel字段表示是否删除,0表示未删除,1表示已删除;因此,当消息为未读状态时,unreadCount的值大于0且isDel为0;当消息为已读且被销毁时,则相应记录的unreadCount=0且isDel=1。从而进一步说明了服务端不留痕,手机本地数据库中保留消息记录的密聊销毁机制。

       对于Android端,当C发送给B的消息M为未读状态时可从数据库表tmsg_Bid_Cid中查看到相关记录,而当B阅读消息M 30s之后数据即被销毁,销毁后相应记录也被从tmsg_Bid_Cid表中删除。说明了对Android端的密聊消息有做到从本地数据库中删除记录的机制。

在这里插入图片描述

二、Telegram取证分析


       Telegram被称为是最安全的即时通讯软件,聊天是Telegram提供的主要功能,支持单聊、群聊、以及Secret Chat,其中Secret Chat是其主要的功能特色。消息端到端加密;不在服务端保留数据;自动销毁;禁止转发。Secret Chat模式需双方同时在线后方可进行通讯,且可自定义自动销毁时间,一旦会话内容被一方截屏,系统会发送消息通知另一方。Telegram并未对存储于手机端的相关数据库文件进行加密处理。因此,对Telegram的取证分析则可省去解密数据库文件的步骤。

2.1Telegram的数据分析

       本文所分析的Telegram版本信息分别为:iPhone V3.11(从App Store下载,更新日期为2016年8月4日);Android V3.11.2(从应用宝下载,更新日期为2016年8月16日)。

       Android Telegram的主要数据存储在”/data /data /org. telegram. messenger /files /cache4.db”数据库文件中;联系人信息可从users、user_phones_v6以及use_contacts_v6这三个表中获取;聊天记录主要存储在messages表中,其中,uid表示会话ID(除Secret Chat外,该字段为好友ID或者群组ID)、date表示消息发送日期、date则存储详细的消息内容,该字段类型为BLOB类型。

       iPhone版本的Telegram其主要数据库文件是Document目录下的tgdata.db。数据库文件未被加密,可直观的查看数据库中存储的数据。如:users_v29表中详细记录了用户信息,包括用户ID、姓名、电话号码、性别等;contacts_v29表记录联系人列表的用户ID,相应的详细信息可通过contacts_v29的uid与users_v29表的uid字段进行关联查询;convesations_v29表记录会话信息,若为群组会话,则详细记录了群组名称、群成员数以及群成员列表信息等, messages_v29表存储所有聊天内容信息,其中cid字段为会话ID、from_id字段和to_id字段分别为发送方ID 和接收方ID、 date 字段表示时间、message字段为文本类消息内容,media字段存储媒体类消息内容,类型为BLOB。

2.2Telegram Secret Chat的数据分析

       根据2.1节分析可知,iPhone版和Android版的聊天记录分别存储于Document/tgdata.db的messages_v29表中和org. telegram. messenger/ files/ cache4.db的messages数据库表中。

       iPhone版Secret Chat模式的会话信息同样存储于conversations_v29表中,与普通会话的区别在于Secret Chat的会话ID经过特殊处理,表现为以’-’开头的10位数字形式,相应的chat_version标识为0。虽然普通会话的chat_version字段同样设置为0,但其以好友ID作为会话ID。与群组会话不同的是Secret Chat的participants_count字段值为0,但participants字段中记录了参与当前Secret Chat真实的用户ID信息。图3为conversations_v29表中Secret Chat、普通会话和群组会话记录区别。从图中可看出,当chat_version字段同为0的情况下,Secret Chat的cid以’-’开头;当cid均以’-’开头的情况下,Secret Chat的chat_version字段的值为0。因此,RecNo为1的记录表示Secret Chat 会话;RecNo为2的记录为群组会话;RecNo为3的记录则表示好友会话。

在这里插入图片描述

       Android版Telegram的Secret Chat会话信息存储在dialogs表中,会话ID存储于did字段;消息内容存储于messages表中。通过dialogs表的did字段与messages表中的uid进行关联查询即可获取到当前会话的聊天记录。在messages表中除了从会话ID(uid为19位数字形式)以及消息ID(mid以负号开头)两方面来区分Secret Chat的消息记录外,也可从data字段的前4字节(用于标识消息的会话类型,此外,不同版该4字节的数据会相应变化)进行区分(其中0xF9555555表示Secret Chat消息、0xF6A1199E表示系统消息、0x5FE49BC0表示普通会话消息)。

       根据上述分析,容易关联到Secret Chat的消息内容,Telegram的Secret Chat模式支持用户自定义消息自动销毁的时间、手动清空历史记录以及删除当前会话。通过采用与2.1.3相同的测试方法分析Telegram对Secret Chat消息的处理方式可知,Telegram iPhone版本和Android版本对Secret Chat模式的消息处理机制基本相似。同样的,当消息未被销毁时可从数据库中获取到数据,当消息被删除后则相应的数据库记录也会被删除。从这一层面来讲,Telegram对Secret Chat消息的处理机制与Android版钉钉基本相似,均是从手机端本地将相应的消息记录销毁


原文出自美亚技术分享 由玉念聿辉转发、编辑

http://chatgpt.dhexx.cn/article/K5W1SHFW.shtml

相关文章

电子取证

前言&#xff1a;比赛看到取证类的题目&#xff0c;但是没了解过&#xff0c;所以很尴尬。比赛那道题没做出来&#xff0c;没有什么思路&#xff0c;所以等下师傅们的wp看看之后在进行复现。然后就在CTF平台上找了取证类的题目&#xff0c;进行学习一下。 知识了解 取证方法 …

【Android取证篇】三星手机开启开发者模式

【Android取证篇】三星手机开启开发者模式 三星开发者模式—【suy】 文章目录 【Android取证篇】三星手机开启开发者模式三星手机开启开发者模式测试设备 &#xff08;一&#xff09;Android通用->版本号路径&#xff1a;设置--->关于手机--->版本号 &#xff08;二&…

微信电子取证

微信电子取证 一键提取本地PC所有的微信信息 微信电子取证 电子取证 | wechat_info_collect&#xff0c;一款针对微信客户端的信息收集工具, 能够自动化提取本地PC所有的微信信息 包括微信号, 手机号等&#xff0c;使用python写的&#xff0c;mac需要安装requests库&#x…

安卓玩机搞机技巧综合资源-----手机隐藏拍照录像 取证软件 寻找隐藏摄像头 【十六】

接上篇 安卓玩机搞机技巧综合资源------如何提取手机分区 小米机型代码分享等等 【一】 安卓玩机搞机技巧综合资源------开机英文提示解决dm-verity corruption your device is corrupt. 设备内部报错 AB分区等等【二】 安卓玩机搞机技巧综合资源------EROFS分区格式 小米红…

一篇手机取证的资料

手机取证工具介绍。 关于手机取证 目前手机的普及率是如此之高&#xff0c;以至手机取证成了一个非常重要的技术研究领域。而国内这方面尚处于起步阶段&#xff0c;未见有成熟的产品可用。事实上&#xff0c;手机取证&#xff0c;其技术难度相对还要低一些&#xff0c;因为数据…

【图像取证篇】手机拍摄的照片包含有哪些信息?

【图像取证篇】手机拍摄的照片包含有哪些信息&#xff1f; 以Android手机拍摄的图片为例—【suy】 文章目录 【图像取证篇】手机拍摄的照片包含有哪些信息&#xff1f;手机拍摄的照片&#xff08;一&#xff09;计算机照片属性查看&#xff08;二&#xff09;手机照片详细信息…

安卓手机取证要点(一)

微信发送的视频一般在以下文件夹里&#xff1a; 微信发送的语音一般在以下文件夹里&#xff1a; 语音文件类型一般为&#xff1a;amr文件&#xff1a; amr是一种主要用于移动设备上的音频文件格式&#xff0c;由于占用资源小&#xff0c;便于发录音彩信&#xff0c;所以手机上…

「技术视界」精编手机取证分析速查手册

要做好取证分析工作&#xff0c;对取证知识的熟练和掌握必不可少。之前在【技术视界】栏目我们推出了一篇《【技术视界】Windows取证分析基础知识大全&#xff0c;赶快收藏&#xff01;》文章&#xff0c;广受大家好评。 今天&#xff0c;我们又给大家整理了在手机取证分析中的…

逆向开发学习手机取证之技术手段分析

手机取证的应用背景 随着移动终端的迅速发展&#xff0c;利用移动终端进行各类非法或犯罪行为的犯罪行为不断出现&#xff0c;而且呈现 出高速增长的势头&#xff0c;这使得电子数据取证的主要 目标从存储介质向移动终端延伸。美国科研机 构电子数据取证包括手机在内的取证实现…

手机取证设备(手机点验设备、手机合规检测、双路并行手机取证深度分析系统、手机点验数据恢复)

支持功能 支持多路点验、多路取证&#xff1a;可同时对多部手机进行采集、数据解析、数据分析、点验结果展示,采集完成后, 数据在后台自动解析, 效率更高&#xff0c;可检查手机使用违规敏感不良行为记录&#xff0c;如不良言论、涉蜜信息、违规翻蔷、wang赌wang贷、不良消费、…

说说尾递归

原文&#xff1a;https://www.cnblogs.com/catch/p/3495450.html 微博上看到有人在讨论尾递归&#xff0c;想起以前曾看过老赵写的一篇相关的博客&#xff0c;介绍的比较详细了&#xff0c;相信很多人都看过&#xff0c;我也在下面留了言&#xff0c;但挑了个刺&#xff0c;表…

Kotlin尾递归优化

Kotlin尾递归优化 尾调用&#xff08;Tail Call&#xff09;是函数式编程的一个重要概念&#xff0c;本文介绍它的含义和用法。 1. 尾递归 ​ 如果一个函数中所有递归形式的调用都出现在函数的末尾&#xff0c;我们称这个递归函数是尾递归的。当递归调用是整个函数体中最后执…

c语言尾递归,C语言——递归与尾递归

在计算机科学领域中&#xff0c;递归式通过递归函数来实现的。程序调用自身的编程技巧称为递归( recursion)。 一个过程或者函数在其定义或者说明中有直接或者间接调用自身的一种方法&#xff0c;它通常把一个大型复杂的问题层层转化为一个与原问题类似的规模较小的问题来求解&…

php 尾递归,又见尾递归

这几天看到几篇关于尾递归的文章&#xff0c;之前对尾递归没有多大概念&#xff0c;所以回头研究了一下尾递归。 尾递归的概念 尾递归(Tail Recursion)的概念是递归概念的一个子集。对于普通的递归&#xff0c;由于必须要记住递归的调用堆栈&#xff0c;由此产生的耗用是难以估…

javascript尾递归优化

JS中的递归 我们来看一个阶乘的代码 function foo( n ){if(n < 1){return 1;}return n * foo( n - 1 ); }foo(5); // 120下面分析一下&#xff0c;代码运行过程中,执行上下文栈是怎么变化的 这个代码是在全局作用域中执行的&#xff0c;所以在foo函数得到执行之前&#x…

Scala尾递归

一、首先来简单介绍一下递归和尾递归 1.递归&#xff1a; 简单来说就是在函数内部调用函数本身来完成函数体。对于返回值的要求并不很严格。 递归的缺点&#xff1a;递归效率比较低&#xff0c;调用次数过多还会出现栈溢出的问题。 2.尾递归&#xff1a; 尾递归的核心思想&…

java 递归 尾递归_递归和尾递归

C允许一个函数调用其本身&#xff0c;这种调用过程被称作递归(recursion)。 最简单的递归形式是把递归调用语句放在函数结尾即恰在return语句之前。这种形式被称作尾递归或者结尾递归&#xff0c;因为递归调用出现在函数尾部。由于为递归的作用相当于一条循环语句&#xff0c;所…

递归算法和尾递归

一、递归算法 1、递归算法思想 递归算法是在程序中不断反复调用&#xff08;间接或直接地调用&#xff09;自身&#xff0c;来达到解决问题的算法。 递归是一个方法在其方法体内调用自身方法的调用方式。递归调用分为两种情况&#xff1a; 直接递归&#xff0c;即在方法中调用…

尾递归(Tail Recursion)

向上递归(Pass-Up Recursion) 先来看一下传统的递归 def sum(lst):"""把lst所有元素求和"""if len(lst) 0:return 0return lst[0] sum(lst[1:])加入sum([1,2,3]),则是先求sum([2,3])&#xff1b;而要求sum([2,3]),则要求sum([3]), 求sum([3]…

尾递归

什么是尾递归 什么是尾递归呢?(tail recursion), 顾名思议&#xff0c;就是一种“不一样的”递归&#xff0c;说到它的不一样&#xff0c;就得先说说一般的递归。对于一般的递归&#xff0c;比如下面的求阶乘&#xff0c;教科书上会告诉我们&#xff0c;如果这个函数调用的深…