word轉換成html

一.概述
將word轉換成html,然後在qt中將html顯示出來。
其中先要將word文檔解析成xml文檔,這裏需要base64方法,具體介紹如下:
Base64是一種基於64個可打印字符來表示二進制數據的表示方法。由於2的6次方等於64,所以每6個位元爲一個單元,對應某個可打印字符。三個字節有24個位元,對應於4個Base64單元,即3個字節需要用4個可打印字符來表示。它可用來作爲電子郵件的傳輸編碼。在Base64中的可打印字符包括字母A-Z、a-z、數字0-9 ,這樣共有62個字符,此外兩個可打印符號在不同的系統中而不同。
Base64常用於在通常處理文本數據的場合,表示、傳輸、存儲一些二進制數據。包括MIME的email,email via MIME, 在XML中存儲複雜數據.
然後需要一個xml解析庫:
SAX接口解析XML文件的基本原理爲:首先獲得一個實現了SAX接口的解析器,這個解析器通常是由第三方軟件公司提供的;然後自己寫一個符合SAX標準的處理器類,並且把這個類註冊到剛剛做好的解析器;解析XML文件;解析器會把XML文件作爲一個文件流讀出來,然後再把文件流轉換成一個事件流,這個事件流中的內容包括“文檔開始”、“文檔結束”、“元素開始”、“元素結束”等等標誌文件狀態的事件;根據事件調用註冊到解析器裏的處理器裏面的相應的方法;在解析器進行XML文件的解析的同時,應用程序可以調用解析器提供的方法,對解析器的行爲進行控制或獲取解析器的狀態。  
二.初始化過程
由於該開源代碼涉及的庫有兩個,還可能設計到解密word文檔,所以初始化也就比較複雜,當然,初始化只是爲後面轉換作準備,真正複雜的還是轉換部分。好了,先看看初始化流程:
1.文件驗證與處理
(1)檢測doc文件和config文件有沒有存在
(2)從完整目錄中解析出doc文件名
(3)求出文件名長度並拷貝到dirName
(4)求出ramdisk目錄,刪除該目錄並重新建立該目錄;
(5)在該目錄下根據doc文件名和目錄新建html文件;
(6)爲一些標誌位和文件名,config文件變量賦值;
2. wvinit初始化過程
2.1.gsf初始化
有可能word轉換過程還需要轉換成一個gsf格式的文件,這個格式可能是圖片顯示或者文字解析的,無論如何,這裏需要初始化gsf庫;
(1)首先調用g_type_init(),初始化的類型系統以及各種其他的代碼部分(如各種基本類型的實現或信號系統)
用 法:char *getenv(char *envvar);
函數說明:getenv()用來取得參數envvar環境變量的內容。參數envvar爲環境變量的名稱,如果該變量存在則會返回指向該內容的指針。環境變量的格式爲envvar=value。getenv函數的返回值存儲在一個全局二維數組裏,當你再次使用getenv函數時不用擔心會覆蓋上次的調用結果。
返回值: 執行成功則返回指向該內容的指針,找不到符合的環境變量名稱則返回NULL。如果變量存在但無關聯值,它將運行成功並返回一個空字符串,即該字符的第一個字節是null。
g_type_init()執行流程:
const gchar *
g_getenv (const gchar *variable)
{
  g_return_val_if_fail (variable != NULL, NULL);

  return getenv (variable);
}
 if (env_string != NULL)
    {
      GDebugKey debug_keys[] = {
        { "objects", G_TYPE_DEBUG_OBJECTS },
        { "signals", G_TYPE_DEBUG_SIGNALS },
      };

      _g_type_debug_flags |= g_parse_debug_string (env_string, debug_keys, G_N_ELEMENTS (debug_keys));
    }
這裏只是初始化一些類型之類的,我們就不仔細看了。只是說下初始化了哪些東西:
setup GObject library wide debugging flags
quarks
 type qname hash table
invalid type G_TYPE_INVALID (0)
interface fundamental type G_TYPE_INTERFACE (!classed)
G_TYPE_TYPE_PLUGIN
G_TYPE_ENUM & G_TYPE_FLAGS
 G_TYPE_BOXED
 G_TYPE_PARAM
 G_TYPE_OBJECT
Value Transformations
Signal system
base64_init ();


word文檔使用OLE2格式,就是用來存儲縮略圖的,其內部存了好多bmp或者jpg縮略文件,利用OLE2的靈活文件結構,它把每一個縮略圖保存爲一個記錄,就像一個小型文件夾。

微軟開放了word二進制格式方便大家對我們平時頻繁接觸的doc ppt和execl文檔的格式的瞭解。但其複雜的設計還是讓人很難徹底搞清楚。縱觀整個文件,簡單說,是一個複合文件結構CFB,類似我們常見的文件系統,簡單的說它就是將一個簡化的文件系統在一個文件中表示。裏面有目錄storage和文件stream的概念。

每個文件都有一個Header,一般有512字節。然後至少有一個用於分配除頭外的文件其他部分的空間的FAT,在FAT中指出文件中所有結構的位置及大小,如FAT本身,Mini FAT, DirectoryEntry FAT等。整個文件以FAT爲單元,FAT,Mini FAT, DirectoryEntry FAT都是FAT Sectors。此外,文件中還有mini FAT及其他Stream,一般在DirectoryEntry FAT中給出其Sector位置。

word二進制格式最複雜的該數位於WordDocument中的FIB頭了,其中含有多層子域,有的域又有很多子域,真的不好記明白。除其之外,就是各個具體stream的詳細結構了,WordDocument以FIB開頭,後面還有文件中文本值等許多域;SummaryInformation和DocumentSummaryInformation兩個流也有其相應的結構格式,Table流也是。

一般的,上述特殊流和特定FAT在二進制文件中的佈局爲(文件中有內容時):

Header : WordDocument : 1Table : SummaryInformation : DocumentSummaryInformation :

FAT : DirectoryEntry FAT : Mini FAT : Mini Stream

金山的WPS系列文檔沒有公開其二進制格式,分析比較麻煩。通過觀察其二進制,並結合Word的格式,基本上可以有一個大體的框架。其和word一樣是採用CFB結構的,但其佈局一般爲:

Header : FAT : DirectoryEntry FAT : Mini FAT:SummaryInformation :

DocumentSummaryInformation :

WordDocument DirectoryEntry FAT2:DirectoryEntry FAT :0Table : DATA Stream

Word DOC方面的幾個漏洞分析:

MS08072 Microsoft Word Malformed FIB Arbitrary Free Vulnerability 一文給出詳細說明(MS08−072)

MS06027 Fuzzing in Word溢出分析和利用講得不錯

另外,關於文件格式解析的方法,How to crack a Binary File Format一文說明其中的注意點和基本方法

微軟在2009年7月份,發佈了一個word二進制查看工具Offvis 挺好用,可以查看word文檔的結構

010 Editor工具也可以用來查看並修改二進制文件,蠻強大的,還能支持插件,腳本。功能比較齊全。




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章