安卓加密软件_【winhex/Xways实战应用】安卓QQ卸载后的手工恢复实战

编程知识 更新时间:2023-05-03 02:33:40

原创:阮咸 330wang

 

0x01 案例说明

接到总部给分配的一个活,说是客户要不惜一切代价恢复一些聊天记录。案发时间是2014年xx月初,客户发现时间2014年xx月中旬。涉案手机有两部,涉案电脑有两台。经过与客户交流得知,目前能提供线索的只有一部手机。其它的设备由于各种原因被排除在外。

0x02 恢复可行性分析

1.这两台电脑上一台上安装了还原精灵,QQ聊天记录会在关机时被清除。所以电脑上的QQ聊天记录不好恢复。另外一台根本没有聊天的痕迹。2.由于电脑上的QQ聊天记录存放的数据库文件是加密的,以碎片的方式恢复聊天记录数据库几乎是不可能的。3.再看手机,如果手机系统版本比较高,不管应用是删除还是卸载,数据区都会清0。4.其中的一台手机,在案发时间内根本没有使用过,直接忽略掉。5.另一台是早期的手机,安卓版本是4.0,不存在清0的问题。所以有恢复的可能。6.安卓QQ的聊天记录存储也是加密的,只不过它是xor(异或)加密。只要得到手机的解密密钥和数据库结构,就可以做碎片恢复。7.安卓QQ的解密密钥一般是它的串号(存在其它特殊情况),数据库结构根据QQ版本的不同而不同。目前有关安卓QQ我们在实际测试过程中发现了至少24种不同的结构(包括最新发现的)。综上所述,这四个检材中有一个手机有可能能恢复出相关的数据。下面着重对这个手机进行恢复操作。

0x03 手机镜像

接到手机以后,手机处于关机状态,由于这个手机型号是联想A789。通过查询它的参数(http://detail.zol/328/327598/param.shtml),知道它的CPU品牌是联发科MTK,所以第一步,用flash_tool来回读它的镜像。从网上下载这个手机专用的刷机工具,发现这是旧版本(V3.0版本)的flash_tool,打开回读工具后,正常回读,但是每读取一点就断,还得重新读取。不知是工具的原因还是手机的原因。由于时间紧迫,所以想试试ROOT的方法,手机开机后发现手机已经有ROOT了!和客户交流,客户说这个手机已经在几个地方做过了,ROOT是其他人做的。当时心就凉了一半,因为不知道手机的ROOT方式,如果用第三方软件ROOT的话,会往手机上推送大量的apk软件,这些apk软件肯定会放到data分区上,造成原始数据覆盖。先不管这些了,既然有了ROOT,先做镜像来吧。手工镜像过程省略,可以参考http://www.intohard/article-219-1.html来镜像手机,如果有手机恢复/取证软件的话可以直接用手机镜像工具做镜像。

0x04镜像分析

取完镜像后,用winhex加载镜像,并解释为磁盘模式,结果发现这个手机的采用MBR磁盘格式,如下图所示

图1联想A789镜像依次展开各个分区,分区1有可能是引导分区,分区2是system系统分区,分区3是cache分区,分区4是data用户数据分区,分区5是内置SD卡分区。一般system分区包含app、bin、sbin等目录,其中app目录中存储系统apk应用,bin、sbin目录存储系统要用到的一些命令。cache分区一般存放的文件比较少。data分区一般包含data、system等目录,其中data目录用来存储各种应用的数据,比方说微信聊天的数据库就存放在/data/data/com.tencent.mm目录下。如果data分区中有media目录,一般这个目录是SD卡所在的目录。也就是说SD卡数据和应用的用户数据共同占用data分区。这个目录下的子目录一般包括Android、DCIM、Music等目录。当然在老式机器中,SD卡会单独占用一个分区。区分的原理就是查看子目录的位置。如果DCIM目录位于/data/media/0目录下,说明SD卡上的数据和用户数据共用data区。如果DCIM直接位于根目录下,说明SD卡数据单独占用一个分区。

图2第二个分区,根据结构看是系统分区

图3cache分区,有我们镜像时上传的busybox

图4data分区,保存用户数据(QQ,微信,短信,联系人等)的分区

图5内置SD卡分区因为QQ的聊天数据库存放于/data目录下,所以下面对data分区进行分析,如下图:

图6/data/data目录下没有发现QQ的痕迹找到这个分区下的data目录,并对其现存的子目录进行排序,发现下面没有QQ的记录痕迹。

图7内置SD卡tencent目录下有QQ的痕迹

再看一下SD卡的tencent目录,发现有MobileQQ目录,这说明一个很重要的问题,就是QQ被卸载了!!对于被卸载的安卓QQ能恢复聊天记录吗?QQ的聊天记录存在于数据库中,如果数据库因为卸载QQ被删除后,它会存在于文件系统的空闲空间中。只要空闲空间没有被系统自动清0,还是有希望找到相关的聊天记录的。由于安卓从4.2版本才开始清0操作,但是现在的版本是4.0,所以恢复的机率还是很大的。我们采用QQ数据库单元结构精确区分技术,加上QQ及时解密技术,制作了QQ碎片恢复脚本,详细解析位于下一节。

0x05 QQ数据库解密算法

QQ数据库对某个表中的text和blob字段进行异或加密,密钥是一般是imei。下面是数据库字段加密/解密的关键算法,请注意代码加黑部分:    public static byte[]cryptBytes(byte[] bytes) {        if (bytes == null) {            return bytes;        }        if (!isPassInit) {            genCodeKey();        }        try {            int length =bytes.length;            byte[] bytesDec =new byte[length];            for (int i = 0; i< length; i++) {                bytesDec[i] =(byte) (bytes[i] ^ codeKey[i % codeKeyLen]);            }            return bytesDec;        } catch (Throwable e){            return bytes;        }    } 注意:1.bytes是取到的Text或blob字段的加密内容,codeKey是解密密钥。         2.对于name字段,有算法的变体,对于其它旧聊天表(表名结尾不挂_New的聊天表),也有算法的变体。           3.虽然有算法的变体,但是基本算法xor是不变的。

0x06恢复data分区的QQ痕迹

前面我们说过,只要聊天数据没有被清0,就有恢复的可能,但是安卓QQ存放时是异或加密的,所以得到加密密钥是必须的。一般情况下加密密钥是手机的串号,在这里要怎么确定串号呢?如果加密密钥不是手机的串号,它还有另外一种模式,这种模式比较少见。这里我们以加密密钥是串号为例给大家进行说明。如果加密密钥不是串号,则我们解密出来的字符串就是乱码,通过解密结果,我们再重新查找相关的解密密钥。一个通用的方法,在手机拨号界面输入“*#06#”就能得到手机的串号。另外可以全分区搜索“imei”这个字符串,也可以确定手机的串号。

图8字符串搜索“imei”

图9搜索串号的结果

  图10搜索到的串号:868****17086251下面确定安卓QQ的结构,之前我们也说过安卓QQ有多种结构,通过一一对比数据库的单元结构,我们确定了一种符合条件的QQ结构。或者在data分区搜索数据表的结构“_Newmr_”字符串,我们也可以找到相关的数据库结构。当然搜索其它的字符串也可以得到相关的数据库结构,只要满足相关的QQ数据库结构就行。其它方法留作大家思考。

图11QQ聊天记录数据库的结构

整理下就是:CREATE TABLE mr_friend_64FE***********1C26ADDBA9BAE70C6_New (_id INTEGER PRIMARY KEY AUTOINCREMENT,extInt INTEGER,extLong INTEGER,extStr TEXT,extraflag INTEGER,frienduin TEXT,isValid INTEGER,sread INTEGER,issend INTEGER,istroop INTEGER,longMsgCount INTEGER,longMsgId INTEGER,longMsgIndex INTEGER,msgData BLOB,msgId INTEGER,msgUid INTEGER,msgseq INTEGER,msgtype INTEGER,selfuin TEXT,sendFailCode INTEGER,senderuin TEXT,shmsgseq INTEGER,time INTEGER,uniseq INTEGER,versionCode INTEGER,vipBubbleID INTEGER,UNIQUE(time,senderuin,msgData,istroop,shmsgseq) ON CONFLICT IGNORE)}其中关键的字段是frienduin(好友的QQ号/群号),msgData(发送内容),selfuin(自己的QQ号),senderuin(发送者的QQ号),time(时间戳)。   关键字段中除了time为int类型不加密存储外,其它的都是text或blob类型的,这些类型安卓QQ都是加密存储的。  因为客户只要10位QQ的聊天记录,这大大的减少生成关键搜索数据的精确性。根据这个建表语句,生成了存储这条项目的关键搜索数据,通过对这个数据进行16进制搜索确定了几百条记录。如下图所示:

图12精确命中的聊天记录只不过这些聊天记录都是加密存储的,我们也可以看到,这些搜索到的数据都位于空闲空间内(FreeSpace),这也验证了QQ是被卸载的。但幸运的是,数据库中的内容没有被清除。剩下的就是把这些记录恢复成明文字样。比方说拿出其中的一条聊天记录分析一下,如下图:

图13待恢复的QQ聊天记录

第一个字节0x65表示整个记录的大小字节数0x6A表示这个记录的RowID0x1B表示单元结构记录头大小字节数剩下的0x1A个字节记录了每个字段的类型及大小字节数然后是开始字段的数据记录,这个数据记录所占的字节数和上面的0x1A个字节记录的内容是一一对应的同时也和建表语句中的字段名称是一一对应的。第一个有内容的是0x21所记录的10个字节,它的字段名称为frienduin,它的值为:0x0A060E********060406,把这个值用imei进行解密操作,得到的QQ号为:206****736第二个有内容的是0x2A对应的15个字节,它的字段名称为msgData,它的值为:0xDE8499******D48C97D587AFD7A69E,解密后,得到的内容并转换成utf-8编码为:没X你忙X(最后一个字是乱码打不出来)。第三个有内容的是0x06对应的8个字节,它的字段名称为msgUid第四个有内容的是0x04对应的4个字节,它的字段名称为msgseq第五个有内容的是0x02对应的2个字节,它的字段名称为msgtype第六个有内容的是0x21所记录的10个字节,它的字段名称为selfuin,它的值为0x0A0E08********000208,把这个值用imei进行解密,得到QQ号为:280****158第七个有内容的是0x21所记录的10个字节,它的字段名称为senderuin,它的值为:0x0A060E********060406,把这个值用imei进行解密操作,得到的QQ号为:206****736第八个有内容的是0x02对应的两个字节,它的字段不重要忽略第九个有内容的是0x04对应的4个字节,它的字段名为:time,它的值为0x53B8F54F,转换成时间戳为:1404630351,换成时间值为:2014-07-06_15:05:51+8(解析方法参考0x09的其它资源)。这样我们得到了我们需要的内容:QQ号206****736在2014-07-06_15:05:51+8向QQ号280****158发送消息:没X你忙X这是对一条记录的分析过程,通过脚本编程的方式得到剩余的聊天记录。
WinHex使用教程
用WinHex进行取证调查
用WinHex修复损坏的复合文档文件头
【照片或特殊文件丢失】试试用 winhex 脚本进行数据恢复
【超详细教程】FTK 和 Winhex 协同工作
【黑客文本编辑工具】UltraEdit、WinHex、PEditor

更多推荐

安卓加密软件_【winhex/Xways实战应用】安卓QQ卸载后的手工恢复实战

本文发布于:2023-04-30 03:42:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/8e5ea5f2db0e1a4c97bc2ae36ffd11a5.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:实战   手工   加密软件   Xways   winhex

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!

  • 113120文章数
  • 28731阅读数
  • 0评论数