admin管理员组文章数量:1640449
2024年7月3日发(作者:)
RAR文件格式的研究
[摘要]
随着科技的发展,RAR文件的使用已经渗透到人们生活,越来越多的工具被开发出
来处理压缩文件,例如Winrar,zip,gzip等等,这些工具都为用户提供了良好的管理界面环
境。RAR文件中蕴藏着丰富的个人信息,发掘分析其中的有用线索是调查取证的重要手段,
而其首要条件就是需要对RAR文件进行格式解析。本文利用RAR实验室提供的Unrar程序
对rar数据文件进行格式解析,从而为证据信息获取提供重要手段。
[关键词]
Winrar文件 压缩文件 格式分析 加密解密 Unrar
The Research of Rar Files’ Format
Abstract
With the rapid development and application of computer and network,the usage of RAR files
using computer more and more furious, more and more tools which come out for dealing with
compressed files, such as winrar, zip, pzip etc. These tools all provide a friendly user-interface. There
are rich personal information containing in RAR files. Analyzing and extracting the useable clues is very
significant for case-investigation and evidence-gaining. But chiefly you have to parse the file format of
RAR files. RAR lab privides the unrar functions which can be used to do the parsing work. These
functions will be an important information-gaining tools.
Key Words
Winrar Files Compressed-File Formats analysis Encryption-and-decryption Unrar
function
目录
引言...................................................................................................................................... 1
第一章 RAR简介 ............................................................................................................. 2
第二章 RAR
2.1 实例......................................................................................................................... 3
2.2 文件块结构 ............................................................................................................ 3
2.2.1 标记块 ............................................................................................................ 4
2.2.2 压缩文件头 ..................................................................................................... 4
2.2.3 文件头 ............................................................................................................ 5
2.2.4 结尾块 ............................................................................................................ 8
2.2.5 旧风格的块类型 ............................................................................................. 8
第三章 RAR文件解压流程 ............................................................................................. 11
3.1 压缩文件处理步骤 ................................................................................................. 11
3.2 压缩文件处理流程图.............................................................................................. 13
第四章 加密RAR文件数据的处理 .................................................................................. 14
4.1 密钥的生成 ............................................................................................................ 14
4.2 源数据的恢复 ........................................................................................................ 14
第五章 Unrar源程序分析 ............................................................................................... 15
5.1 典型函数分析 ........................................................................................................ 15
5.1.1 RAR外围处理函数 ....................................................................................... 15
5.1.2 文件头处理函数 ........................................................................................... 18
5.1.3 RAR文件数据处理函数 ................................................................................ 20
5.1.4 其余处理函数 ............................................................................................... 22
5.2 RAR解压缩的代码 ................................................................................................. 24
第六章 总结与展望 ......................................................................................................... 26
致谢语 ...................................................................................................... 错误!未定义书签。
参考文献 ............................................................................................................................ 28
RAR文件格式的研究
引言
随着科学技术水平的快速发展,越来越多的科研和工程应用部门对数据压缩和解压缩技
术提出了更高的要求。RAR作为现在最流行的数据压缩软件而备受关注,RAR的压缩技术,
密钥生成技术,加解密技术成为大家热衷研究的课题。
很多人都有过这样的经历:用RAR对自己的文件或文档进行有效地管理,对一些较重要
的进行加密处理,可是一段时间之后需要使用时,却忘记了密码,用过各种手段之后不得不
以失败告终。同样针对网络犯罪,传输经过加密后的RAR压缩文件,这时对RAR信息的取
证极为重要,从中挖掘、捕获直接的犯罪信息成为调查取证的重要手段。
利用RAR文件进行取证,首要的任务就是要解析RAR文件的数据格式以及解压的方法,
将经过加密的二进制文件数据还原成为课件的文本文档格式。
本文分为六个部分:
第一章 RAR简介
第二章 RAR压缩文件格式分析
第三章 RAR文件解压流程
第四章 加密RAR文件中数据的处理
第五章 Unrar源程序分析
第六章 总结与展望
第1页
RAR文件格式的研究
第一章 RAR简介
RAR是一种专利文件格式,用于数据压缩与归档打包,开发者尤金·罗谢尔(Eugene
Roshal),所以RAR的全名是:Roshal ARchive。首个公开版本RAR 1.3发布于1993年
[1]
。
Roshal最初编写了Dos版本的编码和解码程序,后来被移植到很多平台,例如比较著
名的Windows平台上的WinRAR。Eugene Roshal公开了解码程序的源代码,但是编
码程序仍然是私有的
[2]
。
RAR因为其独特的压缩算法,能够在无损数据压缩的基础上,达到很高的压缩比,
同时压缩速度也不会很低
[3]
。因为RAR文件头需要占据一定空间,在数据压缩余地不
大时,压缩过的文件可能比源文件要大,除此之外RAR文件中可能会加入冗余数据用
户恢复记录,在压缩包本身受损但恢复记录够多是可以对受损压缩包进行恢复。但是R
AR最主要的一个优点是分卷压缩,可以把文件压缩目标分割到多个文件,并且很容易
从这样的分割的压缩文件中解压出源文件
[4]
。另外,RAR也可以把所有文件压缩到同一
个数据区以加大压缩比,代价就是解压一个单独的文件是必须解压其前面所有文件
[5]
。
RAR同时也拥有成熟的加密算法,2.0版本前加密算法未公开,2.0后使用AES算
法加密,在没有密码情况下目前只有暴力破解。
第2页
RAR文件格式的研究
第二章 RAR压缩文件格式分析
前面一章简要介绍了RAR的历史,本章将会从RAR文件的格式入手,对一个标准的
RAR文件进行分析,深入了解RAR文件中的每一个块,甚至每一个字节的含义。
2.1 实例
创建文件,添加进文件名为的文本文件,该文本文件中包含以下
字符串:Hello world!
在Ultra中加载rar文件:
图2-1 文件的二进制编码
2.2 文件块结构
压缩文件由可变长度的块组成。这些块的顺序可以变化,但是第一块必须是一个在压缩
文件头后的标记块
[6]
。
现在公开的块类型有
[7]
:标记块,压缩文件头块,文件头块,注释头,用户身份信息,
子块和恢复记录块等。
每一块均由下列结构开始:
HEAD_CRC
HEAD_TYPE
HEAD_FLAGS
HEAD_SIZE
2 字节 所有块或块部分的 CRC
1 字节 块类型
2 字节 块标记
2 字节 块大小
如果块标记的第一位被置1的话,还存在:
ADD_SIZE 4 字节 可选结构 - 增加块大小
所以文件大小的计算分两种情况,当块标记HEAD_FLAGS首位未置1,则总块大小就
是HEAD_SIZE,当块标记HEAD_FLAGS首位置1,可选结构存在,则总块大小为
第3页
RAR文件格式的研究
HEAD_SIZE+ ADD_SIZE
[8]
。
2.2.1 标记块 ( MARK_HEAD )
HEAD_CRC
HEAD_TYPE
HEAD_FLAGS
HEAD_SIZE
2字节
1字节
2字节
2字节
总是 0x6152
头类型 0x72
总是 0x1a21
块大小 = 0x0007,即7个字节
Test文件:HEAD_CRC:
HEAD_TYPE:
HEAD_FLAGS:
HEAD_SIZE:
所以这里标记块的大小固定是7个字节,且是一个固定的字节序列。
2.2.2 压缩文件头 ( MAIN_HEAD )
HEAD_CRC
HEAD_TYPE
HEAD_FLAGS
2字节
1字节
2字节
HEAD_TYPE 到 RESERVED2 的 CRC 结构
头类型:0x73
位标记:
0x0001 - 卷属性(压缩文件卷)
0x0002 - 压缩文件注释存在
RAR 3.x 使用分开的注释块,不设置这个标记。
0x0004 - 压缩文件锁定属性
0x0008 - 固实属性 (固实压缩文件)
0x0010 - 新的卷命名法则 ('')
0x0020 - 用户信息存在
RAR 3.x 不设置这个标记。
0x0040 - 恢复记录存在
0x0080 - 块头被加密
0x0100 - 第一卷(只有 RAR 3.0 及以后版本设置)
其中的其它位为内部使用保留
第4页
RAR文件格式的研究
HEAD_SIZE
RESERVED1
RESERVED2
2字节
2字节
4字节
压缩文件头总大小(包括压缩文件注释)
保留
保留
对于压缩文件头里的位标记,如果它的第九位被置1,块头被加密,也就是通常所说的
加密文件名,打开这样加密的rar文件时,需要先输入密码才能看到压缩包内的文件列表。
图2-2 压缩文件中压缩文件头的格式
这里头类型是0x73表示是压缩文件头块,位标记为0x0000未有位被置1,如果块头被
加密则位标记应为0x8000,文件头大小为0x0D00,所以这个压缩文件头块占用13个字节,
保留字节用0x00填充。
2.2.3 文件头( FILE_HEAD )
HEAD_CRC
名
HEAD_TYPE
HEAD_FLAGS
1 字节
2 字节
头类型: 0x74
位标记:
2 字节 从 HEAD_TYPE 到 FILEATTR 的 CRC 结构和文件
0x01 - 文件在前一卷中继续
0x02 - 文件在后一卷中继续
0x04 - 文件使用密码加密
0x08 - 文件注释存在
RAR 3.x 使用分开的注释块,不设置这个标记。
0x10 - 前一文件信息被使用(固实标记)
(对于 RAR 2.0 和以后版本)
7 6 5 位(对于 RAR 2.0 和以后版本)
第5页
RAR文件格式的研究
0 0 0 - 字典大小 64 KB
0 0 1 - 字典大小 128 KB
0 1 0 - 字典大小 256 KB
0 1 1 - 字典大小 512 KB
1 0 0 - 字典大小 1024 KB
1 0 1 - 字典大小 2048 KB
1 1 0 - 字典大小 4096 KB
1 1 1 - 文件作为字典
0x100 - HIGH_PACK_SIZE 和 HIGH_UNP_SIZE 结构存在。这些结构仅
用在非常大(大于 2GB)的文档,对于小文件这些结构不存在。
[9]
0x200 - FILE_NAME 包含用 0隔开的普通的和 Unicode 编码的文件名。
所以 NAME_SIZE 结构长度等于普通文件名的长度加 Unicode
编码文件名的长度再加1。
如果此标记存在,单 FILE_NAME 不包含 0 字节,它意味文件
使用 UTF-8 编码。
[10]
0x400 - 头在文件名后包含附加的8位,它对于增加加密的安全性是必需
的。(所谓的'Salt')。
0x800 - 版本标记。他是老文件版本,版本号作为';n'附加到文件名后。
0x1000 - 扩展时间区域存在。
0x8000 -此位总被设置,所以完整的块的大小是HEAD_SIZE+ PACK_SIZE
(如果 0x100 位被设置,再加上 HIGH_PACK_SIZE)
HEAD_SIZE
PACK_SIZE
UNP_SIZE
HOST_OS
2字节
4字节
4字节
1字节
文件头的全部大小(包含文件名和注释)
已压缩文件大小
未压缩文件大小
保存压缩文件使用的操作系统
0 - MS DOS
1 - OS/2
2 - Win32
3 - Unix
4 - Mac OS
第6页
RAR文件格式的研究
5 - BeOS
FILE_CRC
FTIME
4字节
4字节
1字节
文件 CRC
MS DOS 标准格式的日期和时间
解压文件所需要最低 RAR 版本 UNP_VER
版本编码方法 10 * 主版本 + 副版本。
METHOD 1字节 压缩方式
0x30 - 存储
0x31 - 最快压缩
0x32 - 快速压缩
0x33 - 标准压缩
0x34 - 较好压缩
0x35 - 最好压缩
NAME_SIZE
ATTR
2字节
4字节
文件名大小
文件属性
HIGH_PACK_SIZE 4字节
压缩文件大小 64 位值的高4字节。可选值,只有 HEAD_FLAGS 中的0x100 位被设
置才存在。
[11]
HIGH_UNP_SIZE 4字节
未压缩文件大小64位值的高4字节。可选值,只有 HEAD_FLAGS 中的0x100 位被
设置才存在。
FILE_NAME
SALT
[12]
文件名 - NAME_SIZE 字节大小字符串
8字节 如果 (HEAD_FLAGS & 0x400) != 0 则存在
EXT_TIME 可变大小 如果 (HEAD_FLAGS & 0x1000) != 0 则存在
第7页
RAR文件格式的研究
图2-3 压缩文件中文件头的格式
[13]
在这个块中,存在两个crc值,一个是文件头块中从位标记到文件名这42个字节的校验,
后一个则是压缩包中所含文件的crc校验,解压时,会计算解压后生成文件的crc值,如果
等于这里的crc,则解压完成,如果不同,则报错中断。
2.2.4 结尾块
HEAD_CRC
HEAD_TYPE
HEAD_FLAGS
HEAD_SIZE
2字节
1字节
2字节
2字节
从HEAD_TYPE到HEAD_SIZE的crc校验值
头类型0x7B
位标记
注释头大小
与标记块类似的是,结尾块也是一个固定字节串的块,依次是0xC4 3D 7B 00 40 07 00。
2.2.5 旧风格的块类型
除以上格式块以外,还存在一些旧风格的块类型,不过在新的版本中已经不存在了。
注释头块:
HEAD_CRC
HEAD_TYPE
2字节
1字节
从HEAD_TYPE到COMM_CRC的crc校验值
头类型0x75
HEAD_FLAGS 2字节
HEAD_SIZE
UNP_SIZE
UNP_VER
位标记
注释头大小
未压缩注释大小
提取注释的RAR最低版本
第8页
2字节
2字节
1字节
RAR文件格式的研究
METHOD 1字节
2字节
压缩方法
注释CRC
注释正文
COMM_CRC
COMMENT
额外信息块:
HEAD_CRC
HEAD_TYPE
2字节
1字节
块CRC
头类型0x76
HEAD_FLAGS 2字节
HEAD_SIZE
位标记
总块大小 2字节
INFO
字块
[14]
:
额外信息正文
在压缩文件中任意文件头块后面都可以附加一个字块。这个字块依赖于它前面的这个主
块。当更新时新版本的RAR压缩包可能会删除或者移动这个字块。
字块包含下面几个部分:
HEAD_CRC
HEAD_TYPE
HEAD_FLAGS
HEAD_SIZE
DATA_SIZE
SUB_TYPE
2字节
1字节
2字节
2字节
4字节
2字节
1字节
块crc
头类型: 0x77
位标记
总块大小
总数据块大小
子块类型
保留字段,必须为0 RESERVED
其余字段 由SUB_TYPE决定其余字段类型
以SUB_TYPE为0x100为例,0x100定义子块类型为扩展属性类型,一般用于压缩一
些文件属性信息较详细的文件。
字段中可以包括以下格式:
HEAD_CRC
HEAD_TYPE
HEAD_FLAGS
HEAD_SIZE
DATA_SIZE
SUB_TYPE
2字节
1字节
2字节
2字节
4字节
2字节
块CRC
头类型: 0x77
位标记
总块大小
总数据大小
0x100 //定义子块为扩展属性类型
第9页
[15]
RAR文件格式的研究
RESERVED
UNP_SIZE
UNP_VER
METHOD
EA_CRC
1字节
4字节
1字节
1字节
4字节
全0
//以上为子块中固定格式
//以下为扩展属性附加字段 未压缩扩展属性大小
RAR版本信息
压缩方法
扩展属性CRC
第10页
RAR文件格式的研究
第三章 RAR文件解压流程
上一章节分析了RAR文件的格式,本章要从RAR文件的解压开始,进一步分析一般情
况下是如何处理RAR文件的,详细了解文件解压处理的流程。
3.1 压缩文件处理步骤
文件的处理过程可以简要分成下面几步,其中省略了压缩包的打开和关闭过程和内存分
配的步骤。RAR文件具体步骤如下:
1. 读取和检查标记块
一般情况下就是需要读取文件首个7字节,检查是否与固定情况相同,如果相同
则表明这是一个RAR文件。
2. 读取压缩文件头
这里读取紧接下来的7字节,首先检查第三个字节,即块类型是否为0x73,其次
检查位标记的两个字节,特别需要注意的是0x0008位和0x0080位。如果0x08位为1,
则压缩包使用固实压缩方法处理。
固实压缩包是用一种特殊压缩方式压缩的RAR压缩包,它把压缩包中的所有文
件当成一个连续数据流来看待。固实压缩只被RAR格式的压缩包支持,ZIP压缩包不支
持。使用固实压缩可以明显提高压缩比,特别是在添加大量的小文件时。
如果0x80位为1的话,则表示从下一个块开始所有数据均被加密处理,如果需
要解压,或者需要了解任何有关压缩文件的信息都需要进行数据恢复处理。
3. 读取(先跳过 HEAD_SIZE-sizeof(MAIN_HEAD) 字节)
这里需要跳过压缩文件头,将指针指向下一个块,也就是文件头块的开始位置,
然后读取紧接下来的7字节。
4. 如果发现压缩文件结尾则压缩文件处理终止,否则读取7字节到结构
HEAD_CRC,HEAD_TYPE,HEAD_FLAGS,HEAD_SIZE 中。
接下来的这几个步骤构成了一个循环体,所以需要设置一个检验条件,因为每个
压缩包的最后一个块都是结尾块,而且是一个固定的字符串,这个时候只需要比较字符
串就可以判断是否压缩文件终止。
5. 检查 HEAD_TYPE
第11页
RAR文件格式的研究
if HEAD_TYPE==0x74
读取文件头 ( 开始的 7 字节必须读取)
读取或跳过 HEAD_SIZE-sizeof(FILE_HEAD) 字节
if (HEAD_FLAGS & 0x100)
读取或跳过 HIGH_PACK_SIZE*0x100000000+PACK_SIZE 字节
else
读取或跳过 PACK_SIZE 字节
else
读取 corresponding HEAD_TYPE 块:
读取 HEAD_SIZE-7 字节
if (HEAD_FLAGS & 0x8000)
读取 ADD_SIZE 字节
6. goto步骤4
第12页
RAR文件格式的研究
3.2 压缩文件处理流程图
读取和检查标记块
读取压缩文件头
读取或跳过 HEAD_SIZE-sizeof(MAIN_HEAD) 字节
文件处理中止
是
否
发现文件尾
读取7字节到结构 HEAD_CRC,HEAD_TYPE,
HEAD_FLAGS,HEAD_SIZE 中
检查头类型是否为74
否
是
读取文件头并且读取或跳过 HEAD_SIZE-sizeof(FILE_HEAD) 字节
HEAD_FLAGS & 0x100==1
是
读取或跳过 HIGH_PACK_SIZE*
0x100000000+PACK_SIZE 字节
否
读取或跳过 PACK_SIZE 字节
读取 corresponding HEAD_TYPE 块
读取 HEAD_SIZE-7 字节
if (HEAD_FLAGS & 0x8000)读取
ADD_SIZE 字节
图3-1 压缩文件处理流程图
第13页
RAR文件格式的研究
第四章 加密RAR文件数据的处理
从第一章的分析我们知道,当压缩文件头的位标记的0x0080位置1,或者文件头块的第
0x0004位置1,则RAR文件被加密,那么说明需要密码才能解压,所以需要先用密码将加
密文件中的数据恢复成原始压缩数据,才能用上面所述步骤解压。
4.1 密钥的生成
将明文的密码与Salt一起,通过HASH算法,生成两个16字节的密钥。生成的2个16
字节中,其中一个是KEY,也就是AES算法的参数,另一个16字节为initVector,用于处
理加密数据的第一个16字节。
4.2 源数据的恢复
加密RAR文件中的数据是采用AES算法的rijndael标准应用,由于AES算法是对称的,
所以解密的过程,是加密过程的逆运算。但解密时AES算法过程与加密所用的不一样,这是
是因为解密过程中由KEY生成的子密钥表不一样。仍然需要我们将密码输入,与salt一起生
成两个16字节密钥,KEY和initVector。然后才能用这两个参数处理下面的源数据恢复的操
作处理。
第14页
RAR文件格式的研究
第五章 Unrar源程序分析
Unrar源程序是专门配套用来解压RAR文件的程序,以Linux版本为例,可以通过gcc
编译和link连接后生成可执行文件,生成的可执行文件可以用来解压任意RAR文件。
Unrar源程序包中包括58个头文件和58个C++文件,以及一个makefile编译文件,这
是RAR实验室首度公开的源码程序。
5.1 典型函数分析
Unrar中常见的函数大概分外围处理函数,文件头处理函数,数据处理函数和其余处理
函数。
5.1.1 RAR外围处理函数
====================================================================
HANDLE PASCAL RAROpenArchive(struct RAROpenArchiveData *ArchiveData)
====================================================================
用途
打开RAR压缩包,并且为压缩分配内存空间
参数
ArchiveData: 指针指向RAROpenArchiveData结构体
结构体RAROpenArchiveData:
ArcName //压缩包文件名
输入参数,指向压缩包文件名,文件名必须是一个以0结尾的字符串
OpenMode
输入参数
第15页
//打开方式
RAR文件格式的研究
OpenMode有以下几种打开方式
方式一:RAR_OM_LIST(只读取文件头)
这种打开方式只会读取压缩包中文件头字段信息
方式二:RAR_OM_EXTRACT
这种打开方式会解压出压缩包中所有文件并且进行CRC检验
RAR_OM_LIST_INCSPLIT
这种打开方式同样只会读取压缩包中的文件头字段信息。但是如果在这个
模式下打开压缩包,之后运行函数RARReadHeader[Ex]会返回所有文件的头信息,而在
RAR_OM_LIST的模式下这些头信息会自动忽略。所以以RAR_OM_LIST_INCSPLIT模式
处理RAR时,会得到一系列的文件头,这些文件头信息中间会用“file continued from previous
volume”这样的字样隔开。
OpenResult
输出参数
一个RAR文件的打开可能出现以下几种结果:
//结果的返回信息
CmtBuf
输入参数,指针指向压缩包注释信息的缓冲区,注释信息最大64Kb,同样也必须以0
结尾,如果注释大于分配的缓冲区大小,剩余信息就会被截断。如果CmtBuf被设置成0的
话,就不需要提取注释信息。
CmtBufSize
输入参数,指出压缩包注释信息缓冲区的大小
CmtSize
输出参数,实际读出的注释信息的大小,不能超过分配的空间大小
CmtState
输出参数,CmtState的状态有以下几种情况:
第16页
RAR文件格式的研究
====================================================================
HANDLE
*ArchiveData)
====================================================================
用途:
具体用途与RAROpenArchive相似,但是RAROpenArchiveDataEx能够允许使用
Unicode统一编码的文件名,并且能够返回压缩包标志位信息。
以下列出参数RAROpenArchiveDataEx结构体的信息,其余字段信息和函数返回值的
具体描述省略,可以参考RAROpenArchive。
PASCAL RAROpenArchiveEx(struct RAROpenArchiveDataEx
====================================================================
int PASCAL RARCloseArchive(HANDLE hArcData)
====================================================================
用途:
关闭RAR压缩包,并且释放所有分配的内存。一般在对压缩包的所有处理完成之后运
行,也可是压缩包处理过程出现错误被迫中止。
参数:
hArcData
这个参数是运行函数RAROpenArchive获取的数据。
第17页
RAR文件格式的研究
返回值
5.1.2 文件头处理函数
====================================================================
int PASCAL RARReadHeader(HANDLE hArcData, struct RARHeaderData
*HeaderData)
====================================================================
用途
读取压缩文件头
参数
hArcData
这个参数是运行函数RAROpenArchive获取的数据。
HeaderData
指针指向RARHeaderData结构体:
结构体字段的参数具体描述:
ArcName
输出参数,输出RAR文件名,此文件名必须是以0为结尾的字符串。
FileName
第18页
RAR文件格式的研究
输出参数,输出以OEM (DOS)编码的文件名,也必须是以0为结尾的字符串。
Flags
输出参数,文件头块的位标记
PackSize
输出参数,标明文件压缩后的大小或者如果文件被分卷则表示每一分卷的大小。
UnpSize
输出参数,文件未压缩是的大小
HostOS
输出参数,保存压缩文件使用的操作系统
FileCRC
输出参数,未压缩文件的crc,如果文件被分卷,则之后最后一个分卷才含有正确的
crc值,并且只能用RAR_OM_LIST_INCSPLIT模式才能获取。
FileTime
输出参数,MS DOS标准格式的时间和日期
UnpVer
输出参数,解压文件所需要的最低RAR版本
Method
输出参数,压缩方式
FileAttr
输出参数,文件属性
CmtBuf
输入参数,注释缓冲区
CmtBufSize
输入参数,注释缓冲区大小
CmtSize
输出参数,读进缓冲区的注释大小
CmtState
输出参数
Return values
第19页
RAR文件格式的研究
====================================================================
int PASCAL RARReadHeaderEx(HANDLE hArcData,struct RARHeaderDataEx
*HeaderData)
====================================================================
用途
与函数RARReadHeader类似
5.1.3 RAR文件数据处理函数
====================================================================
int PASCAL RARProcessFile(HANDLE hArcData,
int Operation,
char *DestPath,
第20页
RAR文件格式的研究
char *DestName)
====================================================================
用途
从当前位置移动到下一个文件的位置,并且从压缩包中解压出当前文件,如果是在
RAR_OM_LIST模式下运行的话,则不解压直接移动到下一个位置。
参数
hArcData
这个参数是运行函数RAROpenArchive获取的数据。
Operation
文件操作
有以下三种情况:
第一种:RAR_SKIP
直接移动到压缩包中的下一个文件处,但是如果是在RAR_OM_LIST模式下的话,
或者压缩包被固实处理,则当前文件还是会被处理,并且速度会慢于正常情况下的处理。
第二种:RAR_TEST
测试当前文件,移动到下一个文件处。同样如果是在RAR_OM_LIST 模式下的话操
作将等同于RAR_SKIP。
第三种:RAR_EXTRACT
加压当前文件,移动到下一个文件处。同样如果是在RAR_OM_LIST 模式下的话操
作将等同于RAR_SKIP。
DestPath
指针指向文件解压后要放到的路径,必须是一个以0为结尾的字符串。如果此参数被
设置成NULL,则在当前目录下解压缩。只有DestName是NULL是此参数才有意义。
DestName
指针指向一个包含全路径和名称的字符,这里路径为解压路径,名称为希望另存的名
称,如果为NULL,则使用默认的名称。如果DestName被定义了,则会自动更改压缩包的
路径和名称设置。
DestPath和DestName都必须用OEM编码。如果需要的话,可以调用CharToOem
函数将文本转化为OEM编码。
Return values
第21页
RAR文件格式的研究
注:如果中途需要中止解压,可以直接输入return -1。
====================================================================
int PASCAL RARProcessFileW(HANDLE hArcData,
int Operation,
wchar_t *DestPath,
wchar_t *DestName)
====================================================================
用途:
RARProcessFile的代码版本,功能与RARProcessFile类似
5.1.4 其余处理函数
====================================================================
void PASCAL RARSetCallback (HANDLE hArcData,
int PASCAL (*CallbackProc) (UINT msg,LPARAM UserData,
LPARAM P1,LPARAM P2) , LPARAM UserData);
====================================================================
用途
设置一个用户定义的回调函数来处理Unrar活动。
参数
hArcData
这个参数是运行函数RAROpenArchive获取的数据。
CallbackProc
指针指向用户定义的回调函数
这个回调函数可以有下面几个参数
第22页
RAR文件格式的研究
Msg
处理事件的类型。
用户定义的传递给RARSetCallback的值
事件依赖的参数
UserData
P1 and P2
可以处理的事件类型有:
UCM_CHANGEVOLUME
P1
P2
改变分卷,参数不同是有以下两种处理方式:
指向下一卷中以0为结尾的名称
该函数调用模式有:
UCM_PROCESSDATA 处理解压后的数据,他可以用来
处理文件虽然被解压了却没有出现在磁盘上的情况。提示用户修
改参数值或者return -1中止操作。
P1
P2
可以用来指向解压后产生的数据,但是不能修改。
解压后的数据大小,可以用来检验它是否超过最高字典大小
(RAR 3.8为4MB)
UCM_NEEDPASSWORD 当文件名被加密时,提示必
须输入密码才能查看文件名。甚 至在处理加密了压缩包而未加
密文件名的RAR文件是,它可以用来代替函数
RARSetPassword。
P1 指针指向用来存储密码的缓冲区,如果要查看文件名,
这个缓冲区中的必须存在一个可行的密码
P2
UserData
用户传递给回调函数的数据
Unrar中的任何其他函数都不能调用callback函数。
====================================================================
void PASCAL RARSetPassword(HANDLE hArcData, char *Password);
====================================================================
第23页
密码缓冲区的大小。
RAR文件格式的研究
用途
设置密码来解密文件
参数
hArcData
这个参数是运行函数RAROpenArchive获取的数据。
Password
必须指向以0为结尾的密码字符串。
====================================================================
void PASCAL RARGetDllVersion();
====================================================================
用途
返回API版本信息
5.2 调用Unrar解压缩的代码
以上定义了程序中所有用到的数据类型。
第24页
RAR文件格式的研究
这一段代码是程序的主体,但只是解压中一个最基本情况的应用,会用到独特的库文件
。
第25页
RAR文件格式的研究
总结与展望
RAR文件解析研究范围十分广泛。在网络发展初期,由于带宽有限,人们不断地寻找可
以讲数据压缩同时又能完全恢复的技术,于是RAR文件压缩技术就有了初步的发展。随着信
息技术的发展,数据量成指数级增长,所传送的数据量大大增加,超过了网络带宽所能承受
的极限:同时,由于大量的文档和数据需要存储和备份,也给数据的存储带来极大地压力。
因此有必要RAR格式信息以及解压的具体内容,以促进压缩技术的研究。
本文从压缩文件的格式分析入手,对压缩包中的块结构分别进行解析,进而讨论了压缩
文件一般处理情况和加密情况下的处理方法,加密情况下需要先使用密码进行源数据的恢复,
最后分析了解压程序Unrar源码中一些常见函数的详细解析。
本文的研究还有许多不足和值得改进之处,以后的研究方向可以更深入的从以下方面考
虑:
1、
2、
3、
研究更多可能存在的RAR格式。
分析研究整个解压过程的细节。
定位加密,解密模块,为将来有效地破解提供有用的信息。
第26页
致谢语
第27页
厦门大学本科论文 参考文献
参考文献
[1]Langdon G/Rissanes J. The format of RAR files[J]. IEEE Trans On Comm,1981,29(6):858-867.
[2]陆军/刘大昕. RAR常数级压缩方法中随机文件字节频率统计研究[J]. 微电子学与计算
机,2007,24(9):49-51.
[3]Ziv J/Lempel A. A universal algorithm for sequential data compression[J]. IEEE Transactions on
Information Theory,1977,23(3):337-343.
[4] RARlab. WinRAR Version History. 2005:Available at /WinRARVersion.
[5]李世畅/杨朝军/陶洋. Linux嵌入式系统的优化[J]. 重庆邮电学报,2008,14(4):61-64.
[6]王平. LZW无损压缩算法的实现与研究[J]. 计算机工程,2007,28(8):98-99.
[7]RARlab. . 2008:Available at /.
[8]王虹. 文件系统的管理方法[J]. 河南科学,2007,21(3):375-378.
[9] WinZip Computing,Inc. What’s New in WinZip 9.0. 2005:Available at /
[10] 陈浩. 压缩工具[M]. 上海:上海科学技术出版公司,2008.
[11] RARlab:WinRAR Archiver.2005:RAR—What’s New in the Latest Version. Available at
/.
[12] 尤霞光. 信息技术基础[M]. 北京:中国电力出版社,2007.
[13] Gary S.-/Raphael C.-. On the security of the WinRAR encryption feature[J]. Int. .
Secur,2006,5(2):115-123.
[14] 洪锦魁. WinZip 8.X压缩解压缩[M]. 北京:海洋出版社,2001.
[15] 朱明方/朱峰. 压缩软件精华工具集[M]. 北京:清华大学出版社,1996.
[16] 胡鸣. Windows网络编程技术[M]. 北京:科学出版社,2008.
第28页
版权声明:本文标题:RAR文件格式的研究 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://m.elefans.com/dongtai/1719997866a816065.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论