Word二进制结构
巡山小妖精
520次浏览
2021年01月17日 16:16
最佳经验
本文由作者推荐
树叶贴画作品图片大全-雨景
Office
檔案格式(
1
)
2008
年
08
月
05
日
星期二
09:16
**
這是我去年撰寫
office
檔剖析程式時
,
順手寫下來的文件
.
先貼一部份看
看大家需不需要了解
...
1. Ole
物件檔
Office
檔案或是
Embeded Object
,這些檔案都是透過< br>IStorage
界面來儲存的,
一般稱為
OLE
物件檔
(也 稱為
Laola
檔)
。
什麼是
IStorage
界面呢?它 是
Windows
所提供的一個
OLE
界面,主要是提供給
OLE< br>物件做為儲存資料之用。
IStorage
之所以好用,
主要是它提供類似一個 目錄/子目錄/檔案的階層式組織,
統包在
一個檔案裡,
如此其他物件便可以在同一個 檔案裡,
以目錄階層的方式,
儲存多
種不同的資料。因此要解
Office< br>檔,首先必須要弄清
IStorage
所儲存的
OLE
物件檔格式。< br>
為了快速存取類似目錄檔案的結構,
IStorage
模仿了類似 實際的目錄檔案結構。
它將檔案中每
512
byte
視為一個單位,
稱為大區塊資料
(
BBD
,
Big
Block
Dat a
)
。
不過說實在的,這些名稱真的很容易令人混淆不清(看過
MS
的文件就會知道,
因為還有很多定義的用字都很接近)。因此這邊我不沿用
MS
的名稱 定義,大家
把它想成是一個磁區(
sector
)就對了,反正
IStora ge
就是在模仿磁碟目錄結
構,
直接使用磁碟的用詞反而容易懂。
而為了管理 這些磁區,
當然就要有
FAT
(檔
案磁區配置表,
MS
稱它 為大區塊庫,真難懂)。不過檔案一詞在這邊反而會混
淆,
因此儲存在
IStorag e
的“檔案”,
我便沿用
MS
的名稱,
稱為資料串
(
stream
)
。
以下便開始從檔頭說起:
檔頭當然就是在檔案的開頭處,剛好是一個磁區(
512
byte
)。由於 這個檔頭是
固定有的,不能被使用,因此實際的磁區位置,必須從
512 byte
開 始計算起。
也就是說
Sec#0
的位置在
512
,
Sec# 1
的位置在
1024
,
以此類推。以下便是檔
頭的重要資料:
00h (8 byte )
:檔頭標記,一開始的前
8
個
byte
固定為
D0 CF 11 E0 A1 B1 1A
E1
,否則便不是
OLE
物件檔
2Ch (long)
:
FAT
使用的磁區數
30h (long)
:檔案目錄結構屬性開始的磁區
3Ch (long)
:小資料儲存區
FAT
開始的磁區
44h
:額外記錄
FAT
使用磁區的開始磁區
48h
:額外記錄
FAT
使用磁區的磁區數
4Ch
開始:
FAT
使用的磁區(
long
),數量由
2Ch
中 的磁區數決定
這邊注意到有一個小資料儲存區。由於每個磁區都是
512 byte
,拿來放小資料
的話,會非常浪費空間,因此
IStorage
便將 較小的資料,統一另行儲存。各位
可以將小資料儲存區想成是另一個檔案,
這個檔案又是模擬目 錄檔案結構,
只是
每個磁區縮小到
64 byte
而已。這個部份我待會再談,先將基本
512 byte
磁區
的模擬方式弄懂,小資料儲存區的格式便更容易懂了。
由於在
IStorage
中,所有資料在磁區的儲存次序,都和
FAT
有 關,因此必須先
弄清
FAT
的配置方式。
從檔頭中,
我們可以知道< br>FAT
使用了那些磁區,
將這些磁
區的資料組合在一起,便是真正的
F AT
資料(磁區可能跳來跳去的)。而在
FAT
資料裡,其實便是記錄著每個磁區的下 一個磁區是什麼(每筆資料均為
long
)。
這邊的磁區值可能為:
0xfffffffd (-3)
:特殊區塊(
FAT
使用的磁區便是)
0xfffffffe (-2)
:結束標記(表示已無下個資料磁區)
0xffffffff (-1)
:尚未被使用的磁區
其他:下個資料所在的磁區
因此如果知道一個資料串從那個磁區開始,便 可以直接參照
FAT
,看看資料所在
的下個磁區是在那裡。
例如
Se c#10
,
便查看
FAT
中第
10
個(由
0
編起)
的
long
值磁區編號,
便是下一個。
如此一路查下去,< br>便可以得到整個資料串所使用的磁
區數和次序。應該很簡單吧?
這 裡有一個情況必須特別處理的,
那就是超大型的
OLE
檔。
由於
FA T
表使用的磁
區是放在
Ole
檔頭
4Ch
開始的地方,但因 為檔頭只有
512 byte
而已,因此只能
記錄
109
個磁區(約為
7MB
左右)
。
如果
Ole
檔更大,
使 得
FAT
使用的磁區表記
錄空間不夠使用時,
便必須讀取
44h所指的磁區,
視為下一個記錄
FAT
使用磁區
的磁區。
只是如果 還是不夠儲存時,
再下一個磁區在那裡呢?其實它是記錄在該
磁區內容的最後一個值,
以串列形式組成
(
-1
表示結束)。
因此在讀取整個
FAT
表時,必須考慮到此一情形。
接下來我們來看看檔案目錄結構屬性的資料
(起始磁區 記錄在檔頭)
。
這個部份
也是一個資料串,
因此算出來的位置,
都是 相對於資料串,
你必須換算成是第幾
個磁區,
然後再從
FAT
裡得到 實際所在的磁區。
例如所要的資料是在第
540
byte
處,那麼由資料串 開頭算起是
Sec#1
,如果在
FAT
表裡查到這個資料串的磁區編
號為
{9,13,22,41}
,實際所在的磁區便是
Sec#13
(
offset
也要重算)。不懂的
話請再想想弄清楚。
檔案目錄結構屬性的資料,每個佔
128 byte
,並以指標加以串連。以下便是每
個結構屬性的值(第一個結構屬性就是根目錄):
00h
:
共
64
byte
,
記錄資料串名稱(
unicode
),
根目錄一律為
Entry
(把< br>它想成是檔名或目錄名就對了)
40h (short)
:資料串名稱的byte
長度,
0
表這個屬性沒有用到(
deleted
)
42h (char)
:本結構屬性的形態,
1=
目錄,
2=
檔案,
5=
根目錄
44h (long)
:上一個結構屬性指標,
-1
表沒有
48h (long)
:下一個結構屬性指標,
-1
表沒有
4Ch (lo ng)
:若本結構屬性的形態為目錄或根目錄,則指向本目錄裡各子目錄
/
檔案的第一 個結構屬性(指標)
74h (long)
:資料所在的起始磁區
78h (long)
:資料的
byte
數