欢迎来到 黑吧安全网 聚焦网络安全前沿资讯,精华内容,交流技术心得!

逆向分析很难吗?看我如何逆向分析Notability文件格式

来源:本站整理 作者:佚名 时间:2018-05-09 TAG: 我要投稿

我个人一直喜欢拿笔记一些关于编程方面的东西,所以果断剁手入了一只Apple Pencil,因为听说这货用起来比较爽。接下来,我开始使用Notability for iPad,这个软件确实不错。但是我又遇到了一个问题:我之前的数据都在Android App中,但现在我使用的是iPad,这就很尴尬了。
Notability支持以PDF格式导入文件,但是这样导入进来的文件是只读的,而且你只能在这基础之上进行内容添加,无法直接修改编辑。
于是我的朋友给了我一个建议:为什么不尝试去逆向分析一下Notability文件格式?可能一下子就搞定了呢?
直奔主题
第一步:从.note文件开始
我从App导出了一个.note文件,把它拖到了Dropbox里面,然后复制到了我的Linux电脑中,该文件名为:template.note。
第二步:解压文件
.note文件是什么?为了弄清楚它到底是什么鬼,我们直接用file命令就可以了,运行完之后原来它是一个zip文件:
$file template.note
template.note:Zip archive data, at least v2.0 to extract
$unzip template.note
将其解压到template/目录中,内容如下:
$find template/
template/
template/thumbnail
template/Assets
template/Session.plist
template/thumb3x.png
template/Recordings
template/Recordings/library.plist
template/thumb2x.png
template/thumbnail2x
template/metadata.plist
template/Images
template/thumb6x.png
template/thumb.png
好吧,问题又来了:.plist文件又是什么鬼?
第三步:解码.plist文件
.plist文件算是苹果专用的一种文件格式了,其中包括XML格式和二进制格式,我们的这个文件是二进制格式的。
$file template/Session.plist
template/Session.plist:Apple binary property list
这里可以使用一个名叫plistutil的Linux实用工具来进行内容解码:
sudo apt install plistutil
我把.plist文件中的所有内容转换成了XML格式,其中(template/Session.plist)包含了所有的画画数据(notability_session.xml)。
我怎么判断出它们是绘画数据的呢?因为其中包含一个名叫“curvespoints”的命名域:
curvespoints
mgG+QjOrB0NmuUBDVT3MQgA5kUNEJIlCTBXCQ2YWDEIAT7JCM4tqQ+YFUEMzGVlDJnKj
QzOnR0Na4d5DMzU2QzMzukKafLZDM5dZQ2aDrkNmCqtDM4qmQzNJ6UMAkZ5DZpadQjPQ
A0SFx51CsM4DRHjvnUI7zQNEsRCeQrTLA0QiU55CpsgDRKl6nkJUxQNEzZqeQs3AA0Sv
rp5CEr8DRHW3nkIdvQNEM82eQma4A0RNHJ9CrqkDRNV2n0KUmANEmtGfQs2IA0QoPqBC
p3UDRJugoEINZQNEANagQs1eA0SKIaFCC1QDREOEoULIRgNEzQyiQoA1A0TpVKJCUSsD
ROCWokKvIgNEzcmiQrMdA0SVk6NCtAgDRH10pEJr9gJEzZOlQmbfAkTyaadCkrUCRFb8
qUKYewJEmjCtQmY+AkTkaLBCSQICRKEqtEIkyAFEAPi3QjOSAUS+RbtCMGMBRK6lvkKk
MwFEANDBQmYDAURBQMZCHb0ARCxqykKSdgBEzQDPQrMwAET6vtNCwdL/Q34M2UJwPv9D
mT7eQpm6/kNsXuNCcjr+QzQE6EIV2f1DM7vsQjNi/UMSDu9C6CT9Qztz8UIY4fxDmRD0
QpmY/EMwL/ZC3F/8Q0Fu+EKoJPxDM8L6Qmbl+0N9tf1Ck5P7Q6JnAENsOvtDmu4BQ5nf
+kOgxgJDQK36Q0OWA0MCe/pDmmQEQ5lF+kNbgQVDQ/v5Q6yaBkMkr/lDZr0HQzNk+UPB
...
其中,curvespoints代表的是文件中曲线的点位信息。
第四步:解码曲线数据
下面给出的是用于对base64编码数据进行解码的Python脚本代码:
import subprocess
import plistlib
import struct
def unpack_struct(string, fmt):
returnstruct.unpack('{num}{format}'.format(num=len(string)/4, format=fmt), string)
plistlib.readPlistFromString(subprocess.check_output(['plistutil','-i', 'file.plist']))
curves_points= pl['$objects'][8]['curvespoints'].data
unpack_struct(curvespoints,'f')
解码后的数据如下,其中包含了曲线的浮点数坐标信息:
(407.59869384765625,
 396.6827087402344,
 408.05926513671875,
 396.3546447753906,
 408.2127990722656,
 396.2452697753906,
 408.3787536621094,
 396.1249084472656,
 408.55938720703125,
 395.9921875)
第五步:解码其他数据
解码其他比特数据其实非常简单:
1.   curvesnumpoints:一个32位整形数组,其中包含了每一条曲线的坐标数量 (unpack_struct(curves['curvesnumpoints'].data, ‘i’));
2.   curveswidth:一个32位浮点数数组,存储了每一条曲线的粗细信息;
3.   curvescolors:一个32位RGBA值数组 (0x00FFEEFF十六进制值表示#00FFEE);
4.   curvesfractionalwidths:可变长度曲线的宽度信息,我将其全部设置为了1.0;
5.   eventTokens:不确定这是什么玩意儿,我全部设置成了1.0。
第六步:在图上画点
为了确定这些坐标点数据是真实正确的,我将它们全部画到了画布上:

第七步:生成.note文件
1.   打开一个空白的.note文件;
2.   替换其中的Session.plist文件;
3.   修改curvesnumpoints、curveswidth和curvescolors等数据;
4.   压缩文件,将其导入到app中。
结果
下面就是我Android App中保存的数据:

下面给出的是转换后导入的结果:

基本上是一样的了。
总结
虽然notability文件格式相对来说还是比一些复杂的文件格式要简单一些,但其实逆向分析也没有大家想象的那么难,很多其他格式的文件也可以使用类似的方法进行逆向分析。
 

【声明】:黑吧安全网(http://www.myhack58.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱admin@myhack58.com,我们会在最短的时间内进行处理。
  • 最新更新
    • 相关阅读
      • 本类热门
        • 最近下载