这篇主要讲解如何解析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. .NET 中的 async/await 异步编程

    原文出处: Teroy 的博客 前言 最近在学习Web Api框架的时候接触到了async/await,这个特性是.NET 4.5引入的,由于之前对于异步编程不是很了解,所以花费了一些时间学习一下相关 ...

  2. mysql Substr与char_length函数的应用

    update lee set name = SUBSTR(name, CHAR_LENGTH('lee')+1) where name like "lee%" char_lengt ...

  3. 在quartz的Job中获得Spring的WebApplicationContext或ServletContext

    有时候我们需要在web工程中定时器类里面获得spring的IOC容器,即WebApplicationContext,用它来获取实现了某接口的所有的bean,因为@Autowired貌似只能注入单个be ...

  4. window.parent 与 Window.top

    window.parent 返回当前窗口的父窗口对象. 如果一个窗口没有父窗口,则它的 parent 属性为自身的引用. 如果当前窗口是一个 <iframe>, <object> ...

  5. C#代码实现邮箱验证C#中及一些常用的正则表达式

    .验证用户名和密码:("^[a-zA-Z]\w{5,15}$")正确格式:"[A-Z][a-z]_[0-9]"组成,并且第一个字必须为字母6~16位: .验证电 ...

  6. mount 需要同时设置 noatime 和 nodiratime 吗?

    相信对性能.优化这些关键字有兴趣的朋友都知道在 Linux 下面挂载文件系统的时候设置 noatime 可以显著提高文件系统的性能.默认情况下,Linux ext2/ext3 文件系统在文件被访问.创 ...

  7. 微信小程序-携带参数的二维码条形码生成

    demo文件目录 index.js文件 //index.js var wxbarcode = require('../../utils/index.js'); Page({ data: { code: ...

  8. Using Repository Pattern in Entity Framework

    One of the most common pattern is followed in the world of Entity Framework is “Repository Pattern”. ...

  9. block(九)Block 和 Delegate 的使用比较

    Block 和 Delegate中的方法都可以理解成回调函数,当某件事情发生的时候取执行一段代码片段 Block(代码块) 优点:是一种轻量级的回调,能够直接访问上下文,使用块的地方和块的实现地方在同 ...

  10. svn开发常用整理

    1.删除tortoise svn中的账号信息 其实tortoise svn也是将账号信息存放在本地的配置文件中 在不同的操作系统下,操作基本类似,首先我们来看一下windows下如何操作的. 以win ...