RAR格式的研究.doc_第1頁(yè)
RAR格式的研究.doc_第2頁(yè)
RAR格式的研究.doc_第3頁(yè)
RAR格式的研究.doc_第4頁(yè)
RAR格式的研究.doc_第5頁(yè)
已閱讀5頁(yè),還剩26頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

RAR文件格式的研究摘要 隨著科技的發(fā)展,RAR文件的使用已經(jīng)滲透到人們生活,越來(lái)越多的工具被開(kāi)發(fā)出來(lái)處理壓縮文件,例如Winrar,zip,gzip等等,這些工具都為用戶(hù)提供了良好的管理界面環(huán)境。RAR文件中蘊(yùn)藏著豐富的個(gè)人信息,發(fā)掘分析其中的有用線(xiàn)索是調(diào)查取證的重要手段,而其首要條件就是需要對(duì)RAR文件進(jìn)行格式解析。本文利用RAR實(shí)驗(yàn)室提供的Unrar程序?qū)ar數(shù)據(jù)文件進(jìn)行格式解析,從而為證據(jù)信息獲取提供重要手段。關(guān)鍵詞 Winrar文件 壓縮文件 格式分析 加密解密 UnrarThe Research of Rar Files FormatAbstract 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簡(jiǎn)介2第二章 RAR2.1 實(shí)例32.2 文件塊結(jié)構(gòu)32.2.1 標(biāo)記塊42.2.2 壓縮文件頭42.2.3 文件頭52.2.4 結(jié)尾塊82.2.5 舊風(fēng)格的塊類(lèi)型8第三章RAR文件解壓流程113.1 壓縮文件處理步驟113.2 壓縮文件處理流程圖13第四章加密RAR文件數(shù)據(jù)的處理144.1 密鑰的生成144.2 源數(shù)據(jù)的恢復(fù)14第五章Unrar源程序分析155.1 典型函數(shù)分析155.1.1 RAR外圍處理函數(shù)155.1.2 文件頭處理函數(shù)185.1.3 RAR文件數(shù)據(jù)處理函數(shù)205.1.4 其余處理函數(shù)225.2 RAR解壓縮的代碼24第六章總結(jié)與展望26致謝語(yǔ)27參考文獻(xiàn)28RAR文件格式的研究引言隨著科學(xué)技術(shù)水平的快速發(fā)展,越來(lái)越多的科研和工程應(yīng)用部門(mén)對(duì)數(shù)據(jù)壓縮和解壓縮技術(shù)提出了更高的要求。RAR作為現(xiàn)在最流行的數(shù)據(jù)壓縮軟件而備受關(guān)注,RAR的壓縮技術(shù),密鑰生成技術(shù),加解密技術(shù)成為大家熱衷研究的課題。很多人都有過(guò)這樣的經(jīng)歷:用RAR對(duì)自己的文件或文檔進(jìn)行有效地管理,對(duì)一些較重要的進(jìn)行加密處理,可是一段時(shí)間之后需要使用時(shí),卻忘記了密碼,用過(guò)各種手段之后不得不以失敗告終。同樣針對(duì)網(wǎng)絡(luò)犯罪,傳輸經(jīng)過(guò)加密后的RAR壓縮文件,這時(shí)對(duì)RAR信息的取證極為重要,從中挖掘、捕獲直接的犯罪信息成為調(diào)查取證的重要手段。利用RAR文件進(jìn)行取證,首要的任務(wù)就是要解析RAR文件的數(shù)據(jù)格式以及解壓的方法,將經(jīng)過(guò)加密的二進(jìn)制文件數(shù)據(jù)還原成為課件的文本文檔格式。本文分為六個(gè)部分:第一章 RAR簡(jiǎn)介第二章 RAR壓縮文件格式分析第三章 RAR文件解壓流程第四章 加密RAR文件中數(shù)據(jù)的處理第五章 Unrar源程序分析第六章 總結(jié)與展望第一章RAR簡(jiǎn)介RAR是一種專(zhuān)利文件格式,用于數(shù)據(jù)壓縮與歸檔打包,開(kāi)發(fā)者尤金羅謝爾(Eugene Roshal),所以RAR的全名是:Roshal ARchive。首個(gè)公開(kāi)版本RAR 1.3發(fā)布于1993年1。Roshal最初編寫(xiě)了Dos版本的編碼和解碼程序,后來(lái)被移植到很多平臺(tái),例如比較著名的Windows平臺(tái)上的WinRAR。Eugene Roshal公開(kāi)了解碼程序的源代碼,但是編碼程序仍然是私有的2。RAR因?yàn)槠洫?dú)特的壓縮算法,能夠在無(wú)損數(shù)據(jù)壓縮的基礎(chǔ)上,達(dá)到很高的壓縮比,同時(shí)壓縮速度也不會(huì)很低3。因?yàn)镽AR文件頭需要占據(jù)一定空間,在數(shù)據(jù)壓縮余地不大時(shí),壓縮過(guò)的文件可能比源文件要大,除此之外RAR文件中可能會(huì)加入冗余數(shù)據(jù)用戶(hù)恢復(fù)記錄,在壓縮包本身受損但恢復(fù)記錄夠多是可以對(duì)受損壓縮包進(jìn)行恢復(fù)。但是RAR最主要的一個(gè)優(yōu)點(diǎn)是分卷壓縮,可以把文件壓縮目標(biāo)分割到多個(gè)文件,并且很容易從這樣的分割的壓縮文件中解壓出源文件4。另外,RAR也可以把所有文件壓縮到同一個(gè)數(shù)據(jù)區(qū)以加大壓縮比,代價(jià)就是解壓一個(gè)單獨(dú)的文件是必須解壓其前面所有文件5。RAR同時(shí)也擁有成熟的加密算法,2.0版本前加密算法未公開(kāi),2.0后使用AES算法加密,在沒(méi)有密碼情況下目前只有暴力破解。第二章RAR壓縮文件格式分析前面一章簡(jiǎn)要介紹了RAR的歷史,本章將會(huì)從RAR文件的格式入手,對(duì)一個(gè)標(biāo)準(zhǔn)的RAR文件進(jìn)行分析,深入了解RAR文件中的每一個(gè)塊,甚至每一個(gè)字節(jié)的含義。2.1 實(shí)例創(chuàng)建Helloworld.rar文件,添加進(jìn)文件名為test.txt的文本文件,該文本文件中包含以下字符串:Hello world!在Ultra中加載rar文件:圖2-1Helloworld.rar文件的二進(jìn)制編碼2.2 文件塊結(jié)構(gòu)壓縮文件由可變長(zhǎng)度的塊組成。這些塊的順序可以變化,但是第一塊必須是一個(gè)在壓縮文件頭后的標(biāo)記塊6?,F(xiàn)在公開(kāi)的塊類(lèi)型有7:標(biāo)記塊,壓縮文件頭塊,文件頭塊,注釋頭,用戶(hù)身份信息,子塊和恢復(fù)記錄塊等。每一塊均由下列結(jié)構(gòu)開(kāi)始:HEAD_CRC2 字節(jié) 所有塊或塊部分的 CRCHEAD_TYPE1 字節(jié) 塊類(lèi)型HEAD_FLAGS2 字節(jié) 塊標(biāo)記HEAD_SIZE2 字節(jié) 塊大小如果塊標(biāo)記的第一位被置1的話(huà),還存在:ADD_SIZE4 字節(jié) 可選結(jié)構(gòu) - 增加塊大小所以文件大小的計(jì)算分兩種情況,當(dāng)塊標(biāo)記HEAD_FLAGS首位未置1,則總塊大小就是HEAD_SIZE,當(dāng)塊標(biāo)記HEAD_FLAGS首位置1,可選結(jié)構(gòu)存在,則總塊大小為HEAD_SIZE+ ADD_SIZE8。2.2.1 標(biāo)記塊 ( MARK_HEAD )HEAD_CRC2字節(jié)總是 0x6152HEAD_TYPE1字節(jié)頭類(lèi)型 0x72HEAD_FLAGS2字節(jié)總是 0x1a21HEAD_SIZE2字節(jié)塊大小 = 0x0007,即7個(gè)字節(jié)Test文件:HEAD_CRC:HEAD_TYPE:HEAD_FLAGS:HEAD_SIZE:所以這里標(biāo)記塊的大小固定是7個(gè)字節(jié),且是一個(gè)固定的字節(jié)序列。2.2.2 壓縮文件頭 ( MAIN_HEAD )HEAD_CRC2字節(jié)HEAD_TYPE 到 RESERVED2 的 CRC 結(jié)構(gòu)HEAD_TYPE1字節(jié)頭類(lèi)型:0x73HEAD_FLAGS2字節(jié)位標(biāo)記: 0x0001 - 卷屬性(壓縮文件卷) 0x0002 - 壓縮文件注釋存在 RAR 3.x 使用分開(kāi)的注釋塊,不設(shè)置這個(gè)標(biāo)記。 0x0004 - 壓縮文件鎖定屬性 0x0008 - 固實(shí)屬性 (固實(shí)壓縮文件) 0x0010 - 新的卷命名法則 (volname.partN.rar) 0x0020 - 用戶(hù)信息存在 RAR 3.x 不設(shè)置這個(gè)標(biāo)記。 0x0040 - 恢復(fù)記錄存在 0x0080 - 塊頭被加密 0x0100 - 第一卷(只有 RAR 3.0 及以后版本設(shè)置) 其中的其它位為內(nèi)部使用保留HEAD_SIZE2字節(jié)壓縮文件頭總大小(包括壓縮文件注釋?zhuān)㏑ESERVED12字節(jié)保留RESERVED24字節(jié)保留對(duì)于壓縮文件頭里的位標(biāo)記,如果它的第九位被置1,塊頭被加密,也就是通常所說(shuō)的加密文件名,打開(kāi)這樣加密的rar文件時(shí),需要先輸入密碼才能看到壓縮包內(nèi)的文件列表。圖2-2壓縮文件中壓縮文件頭的格式這里頭類(lèi)型是0x73表示是壓縮文件頭塊,位標(biāo)記為0x0000未有位被置1,如果塊頭被加密則位標(biāo)記應(yīng)為0x8000,文件頭大小為0x0D00,所以這個(gè)壓縮文件頭塊占用13個(gè)字節(jié),保留字節(jié)用0x00填充。2.2.3 文件頭( FILE_HEAD )HEAD_CRC2 字節(jié)從 HEAD_TYPE 到 FILEATTR 的 CRC 結(jié)構(gòu)和文件名HEAD_TYPE1 字節(jié)頭類(lèi)型: 0x74HEAD_FLAGS2 字節(jié)位標(biāo)記: 0x01 - 文件在前一卷中繼續(xù) 0x02 - 文件在后一卷中繼續(xù) 0x04 - 文件使用密碼加密 0x08 - 文件注釋存在 RAR 3.x 使用分開(kāi)的注釋塊,不設(shè)置這個(gè)標(biāo)記。 0x10 - 前一文件信息被使用(固實(shí)標(biāo)記) (對(duì)于 RAR 2.0 和以后版本) 7 6 5 位(對(duì)于 RAR 2.0 和以后版本) 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 結(jié)構(gòu)存在。這些結(jié)構(gòu)僅用在非常大(大于 2GB)的文檔,對(duì)于小文件這些結(jié)構(gòu)不存在。9 0x200 - FILE_NAME 包含用 0隔開(kāi)的普通的和 Unicode 編碼的文件名。 所以 NAME_SIZE 結(jié)構(gòu)長(zhǎng)度等于普通文件名的長(zhǎng)度加 Unicode 編碼文件名的長(zhǎng)度再加1。 如果此標(biāo)記存在,單 FILE_NAME 不包含 0 字節(jié),它意味文件 使用 UTF-8 編碼。10 0x400 - 頭在文件名后包含附加的8位,它對(duì)于增加加密的安全性是必需 的。(所謂的Salt)。 0x800 - 版本標(biāo)記。他是老文件版本,版本號(hào)作為;n附加到文件名后。 0x1000 - 擴(kuò)展時(shí)間區(qū)域存在。 0x8000 -此位總被設(shè)置,所以完整的塊的大小是HEAD_SIZE+ PACK_SIZE (如果 0x100 位被設(shè)置,再加上 HIGH_PACK_SIZE)HEAD_SIZE2字節(jié)文件頭的全部大小(包含文件名和注釋)PACK_SIZE4字節(jié)已壓縮文件大小UNP_SIZE4字節(jié)未壓縮文件大小HOST_OS1字節(jié)保存壓縮文件使用的操作系統(tǒng) 0 - MS DOS 1 - OS/2 2 - Win32 3 - Unix 4 - Mac OS 5 - BeOSFILE_CRC4字節(jié)文件 CRCFTIME4字節(jié)MS DOS 標(biāo)準(zhǔn)格式的日期和時(shí)間UNP_VER1字節(jié)解壓文件所需要最低 RAR 版本 版本編碼方法 10 * 主版本 + 副版本。METHOD1字節(jié)壓縮方式 0x30 - 存儲(chǔ) 0x31 - 最快壓縮 0x32 - 快速壓縮 0x33 - 標(biāo)準(zhǔn)壓縮 0x34 - 較好壓縮 0x35 - 最好壓縮NAME_SIZE2字節(jié)文件名大小ATTR4字節(jié)文件屬性HIGH_PACK_SIZE 4字節(jié)壓縮文件大小 64 位值的高4字節(jié)。可選值,只有 HEAD_FLAGS 中的0x100 位被設(shè)置才存在。11HIGH_UNP_SIZE4字節(jié)未壓縮文件大小64位值的高4字節(jié)??蛇x值,只有 HEAD_FLAGS 中的0x100 位被設(shè)置才存在。FILE_NAME文件名 - NAME_SIZE 字節(jié)大小字符串SALT128字節(jié)如果 (HEAD_FLAGS & 0x400) != 0 則存在EXT_TIME可變大小如果 (HEAD_FLAGS & 0x1000) != 0 則存在圖2-3壓縮文件中文件頭的格式13在這個(gè)塊中,存在兩個(gè)crc值,一個(gè)是文件頭塊中從位標(biāo)記到文件名這42個(gè)字節(jié)的校驗(yàn),后一個(gè)則是壓縮包中所含文件的crc校驗(yàn),解壓時(shí),會(huì)計(jì)算解壓后生成文件的crc值,如果等于這里的crc,則解壓完成,如果不同,則報(bào)錯(cuò)中斷。2.2.4 結(jié)尾塊HEAD_CRC2字節(jié)從HEAD_TYPE到HEAD_SIZE的crc校驗(yàn)值HEAD_TYPE1字節(jié)頭類(lèi)型0x7BHEAD_FLAGS2字節(jié)位標(biāo)記HEAD_SIZE2字節(jié)注釋頭大小與標(biāo)記塊類(lèi)似的是,結(jié)尾塊也是一個(gè)固定字節(jié)串的塊,依次是0xC4 3D 7B 00 40 07 00。2.2.5 舊風(fēng)格的塊類(lèi)型除以上格式塊以外,還存在一些舊風(fēng)格的塊類(lèi)型,不過(guò)在新的版本中已經(jīng)不存在了。注釋頭塊:HEAD_CRC2字節(jié)從HEAD_TYPE到COMM_CRC的crc校驗(yàn)值HEAD_TYPE1字節(jié)頭類(lèi)型0x75HEAD_FLAGS2字節(jié)位標(biāo)記HEAD_SIZE2字節(jié)注釋頭大小UNP_SIZE2字節(jié)未壓縮注釋大小UNP_VER1字節(jié)提取注釋的RAR最低版本METHOD1字節(jié)壓縮方法COMM_CRC2字節(jié)注釋CRCCOMMENT 注釋正文額外信息塊:HEAD_CRC2字節(jié)塊CRCHEAD_TYPE1字節(jié)頭類(lèi)型0x76HEAD_FLAGS2字節(jié)位標(biāo)記HEAD_SIZE2字節(jié)總塊大小INFO 額外信息正文字塊14:在壓縮文件中任意文件頭塊后面都可以附加一個(gè)字塊。這個(gè)字塊依賴(lài)于它前面的這個(gè)主塊。當(dāng)更新時(shí)新版本的RAR壓縮包可能會(huì)刪除或者移動(dòng)這個(gè)字塊。字塊包含下面幾個(gè)部分:HEAD_CRC2字節(jié)塊crcHEAD_TYPE1字節(jié)頭類(lèi)型: 0x77HEAD_FLAGS2字節(jié)位標(biāo)記HEAD_SIZE2字節(jié)總塊大小DATA_SIZE4字節(jié)總數(shù)據(jù)塊大小SUB_TYPE2字節(jié)子塊類(lèi)型RESERVED1字節(jié)保留字段,必須為0其余字段由SUB_TYPE決定其余字段類(lèi)型以SUB_TYPE為0x100為例,0x100定義子塊類(lèi)型為擴(kuò)展屬性類(lèi)型,一般用于壓縮一些文件屬性信息較詳細(xì)的文件。字段中可以包括以下格式:HEAD_CRC2字節(jié)塊CRCHEAD_TYPE1字節(jié)頭類(lèi)型: 0x77HEAD_FLAGS2字節(jié)位標(biāo)記HEAD_SIZE2字節(jié)總塊大小DATA_SIZE4字節(jié)總數(shù)據(jù)大小SUB_TYPE2字節(jié)0x100/定義子塊為擴(kuò)展屬性類(lèi)型15RESERVED1字節(jié)全0/以上為子塊中固定格式UNP_SIZE4字節(jié)未壓縮擴(kuò)展屬性大小/以下為擴(kuò)展屬性附加字段UNP_VER1字節(jié)RAR版本信息METHOD1字節(jié)壓縮方法EA_CRC4字節(jié)擴(kuò)展屬性CRC第三章RAR文件解壓流程上一章節(jié)分析了RAR文件的格式,本章要從RAR文件的解壓開(kāi)始,進(jìn)一步分析一般情況下是如何處理RAR文件的,詳細(xì)了解文件解壓處理的流程。3.1 壓縮文件處理步驟文件的處理過(guò)程可以簡(jiǎn)要分成下面幾步,其中省略了壓縮包的打開(kāi)和關(guān)閉過(guò)程和內(nèi)存分配的步驟。RAR文件具體步驟如下:1. 讀取和檢查標(biāo)記塊一般情況下就是需要讀取文件首個(gè)7字節(jié),檢查是否與固定情況相同,如果相同則表明這是一個(gè)RAR文件。2. 讀取壓縮文件頭這里讀取緊接下來(lái)的7字節(jié),首先檢查第三個(gè)字節(jié),即塊類(lèi)型是否為0x73,其次檢查位標(biāo)記的兩個(gè)字節(jié),特別需要注意的是0x0008位和0x0080位。如果0x08位為1,則壓縮包使用固實(shí)壓縮方法處理。固實(shí)壓縮包是用一種特殊壓縮方式壓縮的RAR壓縮包,它把壓縮包中的所有文件當(dāng)成一個(gè)連續(xù)數(shù)據(jù)流來(lái)看待。固實(shí)壓縮只被RAR格式的壓縮包支持,ZIP壓縮包不支持。使用固實(shí)壓縮可以明顯提高壓縮比,特別是在添加大量的小文件時(shí)。如果0x80位為1的話(huà),則表示從下一個(gè)塊開(kāi)始所有數(shù)據(jù)均被加密處理,如果需要解壓,或者需要了解任何有關(guān)壓縮文件的信息都需要進(jìn)行數(shù)據(jù)恢復(fù)處理。3. 讀?。ㄏ忍^(guò) HEAD_SIZE-sizeof(MAIN_HEAD) 字節(jié))這里需要跳過(guò)壓縮文件頭,將指針指向下一個(gè)塊,也就是文件頭塊的開(kāi)始位置,然后讀取緊接下來(lái)的7字節(jié)。4. 如果發(fā)現(xiàn)壓縮文件結(jié)尾則壓縮文件處理終止,否則讀取7字節(jié)到結(jié)構(gòu) HEAD_CRC,HEAD_TYPE,HEAD_FLAGS,HEAD_SIZE 中。接下來(lái)的這幾個(gè)步驟構(gòu)成了一個(gè)循環(huán)體,所以需要設(shè)置一個(gè)檢驗(yàn)條件,因?yàn)槊總€(gè)壓縮包的最后一個(gè)塊都是結(jié)尾塊,而且是一個(gè)固定的字符串,這個(gè)時(shí)候只需要比較字符串就可以判斷是否壓縮文件終止。5. 檢查 HEAD_TYPE if HEAD_TYPE=0x74 讀取文件頭 ( 開(kāi)始的 7 字節(jié)必須讀取) 讀取或跳過(guò) HEAD_SIZE-sizeof(FILE_HEAD) 字節(jié) if (HEAD_FLAGS & 0x100) 讀取或跳過(guò) HIGH_PACK_SIZE*0x100000000+PACK_SIZE 字節(jié) else 讀取或跳過(guò) PACK_SIZE 字節(jié) else 讀取 corresponding HEAD_TYPE 塊: 讀取 HEAD_SIZE-7 字節(jié) if (HEAD_FLAGS & 0x8000) 讀取 ADD_SIZE 字節(jié)6. goto步驟43.2 壓縮文件處理流程圖文件處理中止讀取或跳過(guò) HIGH_PACK_SIZE*0x100000000+PACK_SIZE 字節(jié)讀取和檢查標(biāo)記塊讀取壓縮文件頭讀取或跳過(guò) HEAD_SIZE-sizeof(MAIN_HEAD) 字節(jié)發(fā)現(xiàn)文件尾讀取7字節(jié)到結(jié)構(gòu) HEAD_CRC,HEAD_TYPE,HEAD_FLAGS,HEAD_SIZE 中檢查頭類(lèi)型是否為74HEAD_FLAGS & 0x100=1讀取 corresponding HEAD_TYPE 塊讀取 HEAD_SIZE-7 字節(jié)if (HEAD_FLAGS & 0x8000)讀取 ADD_SIZE 字節(jié)讀取文件頭并且讀取或跳過(guò) HEAD_SIZE-sizeof(FILE_HEAD) 字節(jié)讀取或跳過(guò) PACK_SIZE 字節(jié)是否是是否否圖3-1壓縮文件處理流程圖第四章加密RAR文件數(shù)據(jù)的處理從第一章的分析我們知道,當(dāng)壓縮文件頭的位標(biāo)記的0x0080位置1,或者文件頭塊的第0x0004位置1,則RAR文件被加密,那么說(shuō)明需要密碼才能解壓,所以需要先用密碼將加密文件中的數(shù)據(jù)恢復(fù)成原始?jí)嚎s數(shù)據(jù),才能用上面所述步驟解壓。4.1 密鑰的生成將明文的密碼與Salt一起,通過(guò)HASH算法,生成兩個(gè)16字節(jié)的密鑰。生成的2個(gè)16字節(jié)中,其中一個(gè)是KEY,也就是AES算法的參數(shù),另一個(gè)16字節(jié)為initVector,用于處理加密數(shù)據(jù)的第一個(gè)16字節(jié)。4.2 源數(shù)據(jù)的恢復(fù)加密RAR文件中的數(shù)據(jù)是采用AES算法的rijndael標(biāo)準(zhǔn)應(yīng)用,由于AES算法是對(duì)稱(chēng)的,所以解密的過(guò)程,是加密過(guò)程的逆運(yùn)算。但解密時(shí)AES算法過(guò)程與加密所用的不一樣,這是是因?yàn)榻饷苓^(guò)程中由KEY生成的子密鑰表不一樣。仍然需要我們將密碼輸入,與salt一起生成兩個(gè)16字節(jié)密鑰,KEY和initVector。然后才能用這兩個(gè)參數(shù)處理下面的源數(shù)據(jù)恢復(fù)的操作處理。第五章 Unrar源程序分析Unrar源程序是專(zhuān)門(mén)配套用來(lái)解壓RAR文件的程序,以L(fǎng)inux版本為例,可以通過(guò)gcc編譯和link連接后生成可執(zhí)行文件,生成的可執(zhí)行文件可以用來(lái)解壓任意RAR文件。Unrar源程序包中包括58個(gè)頭文件和58個(gè)C+文件,以及一個(gè)makefile編譯文件,這是RAR實(shí)驗(yàn)室首度公開(kāi)的源碼程序。5.1 典型函數(shù)分析Unrar中常見(jiàn)的函數(shù)大概分外圍處理函數(shù),文件頭處理函數(shù),數(shù)據(jù)處理函數(shù)和其余處理函數(shù)。5.1.1 RAR外圍處理函數(shù)=HANDLE PASCAL RAROpenArchive(struct RAROpenArchiveData *ArchiveData)=用途打開(kāi)RAR壓縮包,并且為壓縮分配內(nèi)存空間參數(shù)ArchiveData:指針指向RAROpenArchiveData結(jié)構(gòu)體結(jié)構(gòu)體RAROpenArchiveData:ArcName/壓縮包文件名 輸入?yún)?shù),指向壓縮包文件名,文件名必須是一個(gè)以0結(jié)尾的字符串OpenMode/打開(kāi)方式 輸入?yún)?shù) OpenMode有以下幾種打開(kāi)方式 方式一:RAR_OM_LIST(只讀取文件頭) 這種打開(kāi)方式只會(huì)讀取壓縮包中文件頭字段信息 方式二:RAR_OM_EXTRACT 這種打開(kāi)方式會(huì)解壓出壓縮包中所有文件并且進(jìn)行CRC檢驗(yàn) RAR_OM_LIST_INCSPLIT 這種打開(kāi)方式同樣只會(huì)讀取壓縮包中的文件頭字段信息。但是如果在這個(gè)模式下打開(kāi)壓縮包,之后運(yùn)行函數(shù)RARReadHeaderEx會(huì)返回所有文件的頭信息,而在RAR_OM_LIST的模式下這些頭信息會(huì)自動(dòng)忽略。所以以RAR_OM_LIST_INCSPLIT模式處理RAR時(shí),會(huì)得到一系列的文件頭,這些文件頭信息中間會(huì)用“file continued from previous volume”這樣的字樣隔開(kāi)。OpenResult /結(jié)果的返回信息 輸出參數(shù) 一個(gè)RAR文件的打開(kāi)可能出現(xiàn)以下幾種結(jié)果:CmtBuf 輸入?yún)?shù),指針指向壓縮包注釋信息的緩沖區(qū),注釋信息最大64Kb,同樣也必須以0結(jié)尾,如果注釋大于分配的緩沖區(qū)大小,剩余信息就會(huì)被截?cái)?。如果CmtBuf被設(shè)置成0的話(huà),就不需要提取注釋信息。CmtBufSize 輸入?yún)?shù),指出壓縮包注釋信息緩沖區(qū)的大小CmtSize 輸出參數(shù),實(shí)際讀出的注釋信息的大小,不能超過(guò)分配的空間大小CmtState 輸出參數(shù),CmtState的狀態(tài)有以下幾種情況:=HANDLE PASCAL RAROpenArchiveEx(struct RAROpenArchiveDataEx *ArchiveData)=用途: 具體用途與RAROpenArchive相似,但是RAROpenArchiveDataEx能夠允許使用Unicode統(tǒng)一編碼的文件名,并且能夠返回壓縮包標(biāo)志位信息。 以下列出參數(shù)RAROpenArchiveDataEx結(jié)構(gòu)體的信息,其余字段信息和函數(shù)返回值的具體描述省略,可以參考RAROpenArchive。=int PASCAL RARCloseArchive(HANDLE hArcData)=用途: 關(guān)閉RAR壓縮包,并且釋放所有分配的內(nèi)存。一般在對(duì)壓縮包的所有處理完成之后運(yùn)行,也可是壓縮包處理過(guò)程出現(xiàn)錯(cuò)誤被迫中止。參數(shù):hArcData 這個(gè)參數(shù)是運(yùn)行函數(shù)RAROpenArchive獲取的數(shù)據(jù)。返回值5.1.2 文件頭處理函數(shù)=int PASCAL RARReadHeader(HANDLE hArcData, struct RARHeaderData *HeaderData)=用途 讀取壓縮文件頭參數(shù)hArcData 這個(gè)參數(shù)是運(yùn)行函數(shù)RAROpenArchive獲取的數(shù)據(jù)。HeaderData 指針指向RARHeaderData結(jié)構(gòu)體:結(jié)構(gòu)體字段的參數(shù)具體描述:ArcName 輸出參數(shù),輸出RAR文件名,此文件名必須是以0為結(jié)尾的字符串。FileName 輸出參數(shù),輸出以O(shè)EM (DOS)編碼的文件名,也必須是以0為結(jié)尾的字符串。Flags 輸出參數(shù),文件頭塊的位標(biāo)記PackSize 輸出參數(shù),標(biāo)明文件壓縮后的大小或者如果文件被分卷則表示每一分卷的大小。UnpSize 輸出參數(shù),文件未壓縮是的大小HostOS 輸出參數(shù),保存壓縮文件使用的操作系統(tǒng)FileCRC 輸出參數(shù),未壓縮文件的crc,如果文件被分卷,則之后最后一個(gè)分卷才含有正確的crc值,并且只能用RAR_OM_LIST_INCSPLIT模式才能獲取。FileTime 輸出參數(shù),MS DOS標(biāo)準(zhǔn)格式的時(shí)間和日期UnpVer 輸出參數(shù),解壓文件所需要的最低RAR版本Method 輸出參數(shù),壓縮方式FileAttr 輸出參數(shù),文件屬性CmtBuf 輸入?yún)?shù),注釋緩沖區(qū)CmtBufSize 輸入?yún)?shù),注釋緩沖區(qū)大小CmtSize 輸出參數(shù),讀進(jìn)緩沖區(qū)的注釋大小CmtState 輸出參數(shù)Return values=int PASCAL RARReadHeaderEx(HANDLE hArcData,struct RARHeaderDataEx *HeaderData)=用途 與函數(shù)RARReadHeader類(lèi)似5.1.3 RAR文件數(shù)據(jù)處理函數(shù)=int PASCAL RARProcessFile(HANDLE hArcData, int Operation, char *DestPath, char *DestName)=用途 從當(dāng)前位置移動(dòng)到下一個(gè)文件的位置,并且從壓縮包中解壓出當(dāng)前文件,如果是在RAR_OM_LIST模式下運(yùn)行的話(huà),則不解壓直接移動(dòng)到下一個(gè)位置。參數(shù)hArcData 這個(gè)參數(shù)是運(yùn)行函數(shù)RAROpenArchive獲取的數(shù)據(jù)。Operation 文件操作 有以下三種情況:第一種:RAR_SKIP直接移動(dòng)到壓縮包中的下一個(gè)文件處,但是如果是在RAR_OM_LIST模式下的話(huà),或者壓縮包被固實(shí)處理,則當(dāng)前文件還是會(huì)被處理,并且速度會(huì)慢于正常情況下的處理。第二種:RAR_TEST測(cè)試當(dāng)前文件,移動(dòng)到下一個(gè)文件處。同樣如果是在RAR_OM_LIST 模式下的話(huà)操作將等同于RAR_SKIP。第三種:RAR_EXTRACT加壓當(dāng)前文件,移動(dòng)到下一個(gè)文件處。同樣如果是在RAR_OM_LIST 模式下的話(huà)操作將等同于RAR_SKIP。DestPath 指針指向文件解壓后要放到的路徑,必須是一個(gè)以0為結(jié)尾的字符串。如果此參數(shù)被設(shè)置成NULL,則在當(dāng)前目錄下解壓縮。只有DestName是NULL是此參數(shù)才有意義。DestName 指針指向一個(gè)包含全路徑和名稱(chēng)的字符,這里路徑為解壓路徑,名稱(chēng)為希望另存的名稱(chēng),如果為NULL,則使用默認(rèn)的名稱(chēng)。如果DestName被定義了,則會(huì)自動(dòng)更改壓縮包的路徑和名稱(chēng)設(shè)置。 DestPath和DestName都必須用OEM編碼。如果需要的話(huà),可以調(diào)用CharToOem函數(shù)將文本轉(zhuǎn)化為OEM編碼。Return values注:如果中途需要中止解壓,可以直接輸入return -1。=int PASCAL RARProcessFileW(HANDLE hArcData, int Operation, wchar_t *DestPath, wchar_t *DestName)=用途: RARProcessFile的代碼版本,功能與RARProcessFile類(lèi)似5.1.4 其余處理函數(shù)=void PASCAL RARSetCallback (HANDLE hArcData,int PASCAL (*CallbackProc) (UINT msg,LPARAM UserData,LPARAM P1,LPARAM P2) , LPARAM UserData);=用途 設(shè)置一個(gè)用戶(hù)定義的回調(diào)函數(shù)來(lái)處理Unrar活動(dòng)。參數(shù)hArcData 這個(gè)參數(shù)是運(yùn)行函數(shù)RAROpenArchive獲取的數(shù)據(jù)。CallbackProc 指針指向用戶(hù)定義的回調(diào)函數(shù) 這個(gè)回調(diào)函數(shù)可以有下面幾個(gè)參數(shù) Msg處理事件的類(lèi)型。 UserData用戶(hù)定義的傳遞給RARSetCallback的值 P1 and P2事件依賴(lài)的參數(shù) 可以處理的事件類(lèi)型有:UCM_CHANGEVOLUME改變分卷,參數(shù)不同是有以下兩種處理方式:P1指向下一卷中以0為結(jié)尾的名稱(chēng)P2該函數(shù)調(diào)用模式有:UCM_PROCESSDATA處理解壓后的數(shù)據(jù),他可以用來(lái)處理文件雖然被解壓了卻沒(méi)有出現(xiàn)在磁盤(pán)上的情況。提示用戶(hù)修改參數(shù)值或者return -1中止操作。P1可以用來(lái)指向解壓后產(chǎn)生的數(shù)據(jù),但是不能修改。P2 解壓后的數(shù)據(jù)大小,可以用來(lái)檢驗(yàn)它是否超過(guò)最高字典大?。≧AR 3.8為4MB)UCM_NEEDPASSWORD當(dāng)文件名被加密時(shí),提示必須輸入密碼才能查看文件名。甚至在處理加密了壓縮包而未加密文件名的RAR文件是,它可以用來(lái)代替函數(shù)RARSetPassword。P1指針指向用來(lái)存儲(chǔ)密碼的緩沖區(qū),如果要查看文件名,這個(gè)緩沖區(qū)中的必須存在一個(gè)可行的密碼P2密碼緩沖區(qū)的大小。UserData 用戶(hù)傳遞給回調(diào)函數(shù)的數(shù)據(jù) Unrar中的任何其他函數(shù)都不能調(diào)用callback函數(shù)。=void PASCAL RARSetPassword(HANDLE hArcData, char *Password);=用途 設(shè)置密碼來(lái)解密文件參數(shù)hArcData 這個(gè)參數(shù)是運(yùn)行函數(shù)RAROpenArchive獲取的數(shù)據(jù)。Password 必須指向以0為結(jié)尾的密碼字符串。=void PASCAL RARGetDllVersion();=用途 返回API版本信息5.2 調(diào)用Unrar解壓縮的代碼以上定義了程序中所有用到的數(shù)據(jù)類(lèi)型。這一段代碼是程序的主體,但只是解壓中一個(gè)最基本情況的應(yīng)用,會(huì)用到獨(dú)特的庫(kù)文件Unrar.Lib??偨Y(jié)與展望RAR文件解析研究范圍十分廣泛。在網(wǎng)絡(luò)發(fā)展初期,由于帶寬有限,人們不斷地尋找可以講數(shù)據(jù)壓縮同時(shí)又能完全恢復(fù)的技術(shù),于是RAR文件壓縮技術(shù)就有了初步的發(fā)展。隨著信息技術(shù)的發(fā)展,數(shù)據(jù)量成指數(shù)級(jí)增長(zhǎng),所傳送的數(shù)據(jù)量大大增加,超過(guò)了網(wǎng)絡(luò)帶寬所能承受的極限:同時(shí),由于大量的文檔和數(shù)據(jù)需要存儲(chǔ)和備份,也給數(shù)據(jù)的存儲(chǔ)帶來(lái)極大地壓力。因此有必要R

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論