这篇主要讲解如何解析Manifest.mbdb文件。

使用二进制工具打开这个文件,文件的头6个字节是固定的,相当于是文件的一种标识

后面的内容是一个一个的项,可以使用一个循环来读取文件,一个一个解析。

这里有一个概念要先说一下,就是域,域是用来定位一个文件在手机上的全路径。比如上图的 AppDomain-cairot,这个域就表示文件在手机上的目录为 /var/mobile/Applications/,不同的域对应的手机的目录是不一样的,下面给出所有域和目录的一个对应关系,下面是自己的一段代码, 看懂这段代码就知道域和路径的关系了。

if (item.Domain == "WirelessDomain")
{
item.PathOnPhone.Format("/var/wireless/%s", item.Path);
}
else if (item.Domain == "ManagedPreferencesDomain")
{
item.PathOnPhone.Format("/var/Managed Preferences/%s", item.Path);
}
else if (item.Domain == "MediaDomain")
{
item.PathOnPhone.Format("/var/mobile/%s", item.Path);
}
else if (item.Domain == "SystemPreferencesDomain")
{
item.PathOnPhone.Format("/var/preferences/%s", item.Path);
}
else if (item.Domain == "CameraRollDomain")
{
item.PathOnPhone.Format("/var/mobile/%s", item.Path);
}
else if (item.Domain == "RootDomain")
{
item.PathOnPhone.Format("/var/root/%s", item.Path);
}
else if (item.Domain == "MobileDeviceDomain")
{
item.PathOnPhone.Format("/var/MobileDevice/%s", item.Path);
}
else if (item.Domain == "KeychainDomain")
{
item.PathOnPhone.Format("/var/Keychains/%s", item.Path);
}
else if (item.Domain == "HomeDomain")
{
item.PathOnPhone.Format("/var/mobile/%s", item.Path);
}
else if (item.Domain == "DatabaseDomain")
{
item.PathOnPhone.Format("/var/db/%s", item.Path);
}
else if (item.Domain.Find("AppDomain-") == 0)
{
CAtlStringA strTmp(item.Domain);
strTmp.Replace("AppDomain-", "");
item.PathOnPhone.Format("/var/mobile/Applications/%s/%s",strTmp , item.Path);
}

1) 获取域。 头6个字节之后的2个字节,标识域的长度,但是2字节的内容并不是直接标识长度,看下面的代码。先读出一个字节,然后再读出一个字节,进行运算之后得出的一个长度。下图就是 AppDomain-cairot

std::string CBackupMbdb::ReadNextStringBy2bytesLen(CBinaryReader& reader)
{
std::string strResult;
byte num =  reader.ReadByte();
byte num2 =  reader.ReadByte();
if ((num == 0xff) && (num2 == 0xff))
{
return strResult;
}
int num3 = (num * 0x100) + num2;
strResult = reader.ReadString(num3);
return strResult;
}

2) 之后就是手机上路径。这个路径和域组合之后就可以得出文件在iphone 上的全路径了。第一个图中的item.path 就是这个路径,item.Domain 就是域。 根据上面的代码就可以组合出全路径了。这个路径获取方法和域是一样的。先读取文件的2个字节,然后根据这两个字节的大小读取内容。从上图看先读的两个为0000,所以路径就是空字符串。

3)链接路径。这个我也不是很清楚,貌似像是windows 的快捷方式一样,会指向一个其他的路径。反正我没用上这个东西。 读取的方式和前面一样

4) 紧接着数据的一段哈希。先读出2个字节,然后根据这两个字节计算出一个大小,进行一些判断之后把16 进制的数据转换成字符串。

std::string CBackupMbdb::smethod10(CBinaryReader& reader)
{
std::string strResult ;
byte num =  reader.ReadByte();
byte num2 =  reader.ReadByte();
if ((num == 0xff) && (num2 == 0xff))
{
return strResult;
}
int num6 = (num * 0x100) + num2;
CAutoVectorPtr<byte> pBuffer;
pBuffer.Allocate(num6);
reader.Read(pBuffer.m_p,num6);
int index = 0;
index = 0;
while (index < num6)
{
if ((pBuffer.m_p[index] < 0x20) || (pBuffer.m_p[index] >= 0x80))
{
break;
}
index++;
}
if (index == num6)
{
strResult = bytes_to_hex_string(pBuffer.m_p,num6);
}
return strResult;
}

5)  第五个内容的读取方法和第四个一样,但是所有的读出来的都是空字符串。

6)   读出固定的40个字节,这40个字节里面包含的信息很多,不过大部分都是不需要的,只有一个字段是重要的,这个字段会影响后面的文件读取。

CAutoVectorPtr<byte> pRecordInfo;
pRecordInfo.Allocate(40);
reader.Read(pRecordInfo.m_p,40);

//0x27 也就是最后的位置保存了这个项的属性个数,要用这个数字循环读出属性来。

itemInfo.PropertyCount = pRecordInfo[0x27];

for (int i=0;i<itemInfo.PropertyCount;i++)
{
CAtlStringA key = ReadNextStringBy2bytesLen(reader).c_str();
CAtlStringA value = smethod10(reader).c_str();
itemInfo.Properties[key] = value;
}

7)  根据第一步和第二步得出来的域和路径计算SHA1值,这个哈希值也就是本地的路径。

std::string strHash1Src;
if (itemInfo.Path.IsEmpty())
{
strHash1Src = itemInfo.Domain;
}
else
{
strHash1Src = itemInfo.Domain + "-" + itemInfo.Path;
}
std::string strTmp;
CAppUtilis::EncrypBySHA1(strHash1Src,strTmp);

然后一直循环读取文件,直到文件读完就可以解析出所有的文件路径了

转让Android,IOS 手机助手各种技术资料,文档,以及源码,有需要的可以联系我QQ: 2506314894

IOS 设备备份文件详解 (二)的更多相关文章

  1. IOS 设备备份文件详解 (一)

    IOS设备如果没有越狱的话想获取一些敏感的信息还是有写复杂的,比如获取上网信息,短信,通话记录等等这些,但是有一个通用的方法可以获取到这些信息,那就是IOS 设备的备份功能.文章不涉及如何备份以及恢复 ...

  2. Linux dts 设备树详解(二) 动手编写设备树dts

    Linux dts 设备树详解(一) 基础知识 Linux dts 设备树详解(二) 动手编写设备树dts 文章目录 前言 硬件结构 设备树dts文件 前言 在简单了解概念之后,我们可以开始尝试写一个 ...

  3. Linux dts 设备树详解(一) 基础知识

    Linux dts 设备树详解(一) 基础知识 Linux dts 设备树详解(二) 动手编写设备树dts 文章目录 1 前言 2 概念 2.1 什么是设备树 dts(device tree)? 2. ...

  4. Linux DTS(Device Tree Source)设备树详解之二(dts匹配及发挥作用的流程篇)【转】

    转自:https://blog.csdn.net/radianceblau/article/details/74722395 版权声明:本文为博主原创文章,未经博主允许不得转载.如本文对您有帮助,欢迎 ...

  5. iOS中-Qutarz2D详解及使用

    在iOS中Qutarz2D 详解及使用 (一)初识 介绍 Quartz 2D是二维绘图引擎. 能完成的工作有: 绘制图形 : 线条\三角形\矩形\圆\弧等 绘制文字 绘制\生成图片(图像) 读取\生成 ...

  6. iOS 2D绘图详解(Quartz 2D)之路径(点,直线,虚线,曲线,圆弧,椭圆,矩形)

    前言:一个路径可以包含由一个或者多个shape以及子路径subpath,quartz提供了很多方便的shape可以直接调用.例如:point,line,Arc(圆弧),Curves(曲线),Ellip ...

  7. iOS应用开发详解

    <iOS应用开发详解> 基本信息 作者: 郭宏志    出版社:电子工业出版社 ISBN:9787121207075 上架时间:2013-6-28 出版日期:2013 年7月 开本:16开 ...

  8. 了解iOS消息推送一文就够:史上最全iOS Push技术详解

    本文作者:陈裕发, 腾讯系统测试工程师,由腾讯WeTest整理发表. 1.引言 开发iOS系统中的Push推送,通常有以下3种情况: 1)在线Push:比如QQ.微信等IM界面处于前台时,聊天消息和指 ...

  9. iOS开发者证书-详解

    iOS开发者证书-详解/生成/使用 本文假设你已经有一些基本的Xcode开发经验, 并注册了iOS开发者账号. 相关基础 加密算法 现代密码学中, 主要有两种加密算法: 对称密钥加密 和 公开密钥加密 ...

随机推荐

  1. cocos2d-js 3.0 rc2 自定义UI控件组件 例子:能播放动画的MenuItem。MenuItemSprite的bug

    其实总体自定义UI组件都比较简单,尤其是cocos2d-js是开源的,如果有什么不明白的直接看js代码或者C++代码即可.当然js代码基本就够了. 另外,js的ctor函数虽然说是构造函数,但毕竟不是 ...

  2. 〖Linux〗Ubuntu13.10搭建文件共享Samba服务器

    1. 安装 $ sudo apt-get install samba 2. 配置smb用户密码 # cat /etc/passwd | mksmbpasswd > /etc/samba/smbp ...

  3. SpringCloud学习资料

    CSDN博客:http://blog.csdn.net/k21325/article/details/52789829 http://blog.csdn.net/qq_26562641/article ...

  4. 取某字段不为空的数据is not null

    SELECT * FROM 表名  where  uid='xxx'  and  time  is not null

  5. vsftp 虚拟用户测试

    1.创建用于进行FTP验证的帐号密码数据库文件,单数行为账户名,偶数行为密码.[root@rhel1 vsftpd]# vi /etc/vsftpd/vuser.listuser1123456user ...

  6. C++基础学习教程(六)----类编写的前情回想以及项目实战(1)

    在開始类的编写之前我们依旧须要回想整理一下前面所说的内容,(前面尽管是一个自己定义数据类型的实现过程,可是内容有点繁杂). 先看一段代码: /** @file calssStruct.cpp */ / ...

  7. ajax post方式下载后台传来的文件

    参考:http://stackoverflow.com/questions/16086162/handle-file-download-from-ajax-post $.ajax({ type: &q ...

  8. Javascript 计算字符串所占字节数

    最近项目有个需求要用js计算一串字符串写入到localStorage里所占的内存,众所周知的,js是使用Unicode编码的.而Unicode的实现有N种,其中用的最多的就是UTF-8和UTF-16. ...

  9. ldap文件

    demo.ldif dn:dc=sgp,dc=com objectclass:domain objectclass:top o:Michael Blog dc:sgp dn:ou=Developer, ...

  10. 使用requests库实现多线程下载

    多线程下载主要用到http请求中的header Content-Length:资源长度,用于确认资源的总长度,从而便于规划每个线程的任务量 Range:bytes=beg1-end1;beg2-end ...