IOS 设备备份文件详解 (二)
这篇主要讲解如何解析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 设备备份文件详解 (二)的更多相关文章
- IOS 设备备份文件详解 (一)
IOS设备如果没有越狱的话想获取一些敏感的信息还是有写复杂的,比如获取上网信息,短信,通话记录等等这些,但是有一个通用的方法可以获取到这些信息,那就是IOS 设备的备份功能.文章不涉及如何备份以及恢复 ...
- Linux dts 设备树详解(二) 动手编写设备树dts
Linux dts 设备树详解(一) 基础知识 Linux dts 设备树详解(二) 动手编写设备树dts 文章目录 前言 硬件结构 设备树dts文件 前言 在简单了解概念之后,我们可以开始尝试写一个 ...
- Linux dts 设备树详解(一) 基础知识
Linux dts 设备树详解(一) 基础知识 Linux dts 设备树详解(二) 动手编写设备树dts 文章目录 1 前言 2 概念 2.1 什么是设备树 dts(device tree)? 2. ...
- Linux DTS(Device Tree Source)设备树详解之二(dts匹配及发挥作用的流程篇)【转】
转自:https://blog.csdn.net/radianceblau/article/details/74722395 版权声明:本文为博主原创文章,未经博主允许不得转载.如本文对您有帮助,欢迎 ...
- iOS中-Qutarz2D详解及使用
在iOS中Qutarz2D 详解及使用 (一)初识 介绍 Quartz 2D是二维绘图引擎. 能完成的工作有: 绘制图形 : 线条\三角形\矩形\圆\弧等 绘制文字 绘制\生成图片(图像) 读取\生成 ...
- iOS 2D绘图详解(Quartz 2D)之路径(点,直线,虚线,曲线,圆弧,椭圆,矩形)
前言:一个路径可以包含由一个或者多个shape以及子路径subpath,quartz提供了很多方便的shape可以直接调用.例如:point,line,Arc(圆弧),Curves(曲线),Ellip ...
- iOS应用开发详解
<iOS应用开发详解> 基本信息 作者: 郭宏志 出版社:电子工业出版社 ISBN:9787121207075 上架时间:2013-6-28 出版日期:2013 年7月 开本:16开 ...
- 了解iOS消息推送一文就够:史上最全iOS Push技术详解
本文作者:陈裕发, 腾讯系统测试工程师,由腾讯WeTest整理发表. 1.引言 开发iOS系统中的Push推送,通常有以下3种情况: 1)在线Push:比如QQ.微信等IM界面处于前台时,聊天消息和指 ...
- iOS开发者证书-详解
iOS开发者证书-详解/生成/使用 本文假设你已经有一些基本的Xcode开发经验, 并注册了iOS开发者账号. 相关基础 加密算法 现代密码学中, 主要有两种加密算法: 对称密钥加密 和 公开密钥加密 ...
随机推荐
- 测试json字符和java对象属性不一样在多个json框架下转换的表现
package com.longge.mytest; import java.io.IOException; import org.junit.Test; import com.alibaba.fas ...
- DATEDIF函数
DATEDIF(start_date,end_date,unit) DATEDIF函数是Excel隐藏函数,在帮助和插入公式里面没有. 返回两个日期之间的年\月\日间隔数.常使用DATEDIF函数计算 ...
- Ubuntu 安装asciidoc时默认推荐了巨大的安装包
$ sudo apt-get install asciidocReading package lists... DoneBuilding dependency tree Reading s ...
- ios 中基本控件的定义
我的开发笔记--UILabel的详细使用及特殊效果 我的开发笔记--UIButton的详细使用 我的开发笔记---UISegmentedControl的详细使用 我的开发笔记---UITextFiel ...
- DPDK无法分出连续大页面(contiguous hugepages)的几个解决方法
在使用DPDK或者SPDK的时候,需要在进程刚启动的时候使用rte_eal_init初始化Environment Abstract Layer,应用进程会通过这个函数告诉EAL为它映射多大的hugep ...
- oracle安装后tnsnames.ora内容
# tnsnames.ora Network Configuration File: D:\Develop\oracle11g\product\11.2.0\dbhome_1\network\admi ...
- java struts2入门学习--防止表单重复提交.OGNL语言学习
一.知识点回顾 防止表单重复提交核心思想: 客户端和服务器端和写一个token,比较两个token的值相同,则非重复提交;不同,则是重复提交. 1.getSession三种方式比较: request. ...
- python学习笔记——爬虫中提取网页中的信息
1 数据类型 网页中的数据类型可分为结构化数据.半结构化数据.非结构化数据三种 1.1 结构化数据 常见的是MySQL,表现为二维形式的数据 1.2 半结构化数据 是结构化数据的一种形式,并不符合关系 ...
- android开发资源
android仿微信 http://www.oschina.net/code/snippet_253900_33261
- pingback协议与traceback协议的区别
wordpress 的 pingback协议与traceback协议区别