《超星圖書閱覽器》圖書目錄文件格式探秘
========================================《超星圖書閱覽器》圖書目錄文件格式探秘
========================================
版本 1.1
Shun Cox (shuncox@263.net)
注意:
本文可以任意復制、轉換和發布,但必須保持文件內容的一致和完整。
有任何問題請到 bookexpress.iscool.net 或郵件 shuncox@263.net
一、.dat 文件
_____________________________________________________________________
整體結構為
+-----------+
|? ? 頭? ? |
+-----------+
|? 記錄 1? |
+-----------+
|? 記錄 2? |
+-----------+
|? ...? ? |
+-----------+
|? 記錄 n? |
+-----------+
.dat 文件的頭結構
struct DatHead {
? ? DWORD Mark;????????// 標志,'SSDT'
? ? WORD Ver;????????// 可能是版本號,一般為 2
? ? WORD Type;????????// 類型,在 site 和 address 中都為 2,
????????????// bktree 中為 0(V3.51 中為 2),
????????????// bklist 中為 3
? ? DWORD NumOfRec;????// 含有多少記錄
? ? DWORD LenPerRec;????// 每個紀錄的長度
? ? DWORD LenOfHead;????// 頭的長度
? ? DWORD EncOffset;????// 加密段開始處,只在 bklist 中有效
????????????// (在 V3.51 中此變量無效)
};
二、不同 .dat 文件的記錄結構
_____________________________________________________________________
site.dat
--------
記錄完全加密
struct SiteInfo {
? ? char Path[32];????// 本地路徑
? ? char Name[64];????// 圖書館名稱
? ? WORD Rev1;????????// 未知
? ? char Date[22];????// 更新日期
? ? char URL[132];????// 更新書庫的 URL
? ? DWORD Rev2;????????// 未知
};
address.dat
-----------
記錄完全加密
struct AddrInfo {
? ? DWORD Rev;????????// 未知
? ? char Addr[];????// 下載主機地址
};
bktree.dat
----------
V3.51 之前記錄沒有加密,V3.51 對整個記錄完全加密
struct TreeInfo {
? ? char Name[100];????// 分類名稱
? ? WORD Rev;????????// 未知
? ? WORD Level;????????// 分類所處的層數
? ? DWORD Start;????// 在相應 bklist 中的起始記錄號
? ? DWORD Num;????????// 圖書數量
};
bklist.dat
----------
bklist 的記錄相對復雜
偏移 0 處(V3.51 以前不加密,V3.51 對整個記錄完全加密):
struct BookInfo {
? ? char Name[100];????// 書名
? ? DWORD Pages;????// 頁數
? ? WORD AddrNo;????// 主機編號(從 1 開始,主機地址在
address 中)
};
偏移 DatHead::EncOffset 處為加密段(V3.51 從 0x6a 開始):
* 對于 SSREADER V3.4
struct EncInfo {
? ? WORD EncLen;????// 加密長度
? ? // 加密開始
? ? WORD Copyright;????// 版權,如果(Copyright >> 8 == 0)則可以下載
? ? char Path[100];????// 路徑和文件名
? ? char Author[];????// 作者,如果(DatHead::LenPerRec != 0x110)則無
};
* 對于 SSREADER V3.5 - V3.51
struct EncInfo {
? ? WORD EncLen;????// 加密長度(在 V3.51 中此變量無效)
? ? // 加密開始
? ? WORD Copyright;????// 版權,如果(Copyright >> 8 == 0)則可以下載
? ? char Rev[58];????// 未知
? ? DWORD SN;????????// 超星書號
? ? char Path[];????// 路徑和文件名
};
三、解密算法
_____________________________________________________________________
解密以 0x10 字節為單位順序進行,最后不足單位的字節忽略。
void Decrypt(DWORD *s)
{
? ? DWORD v = 0xe3779b90;
? ? DWORD d = 0x9e3779b9;
? ? static DWORD k[] = {0x3f65496d, 0x61737745,????0x2e2c2e5e,
????0x38375f2f};
? ? int i;
? ? for (i = 0; i < 0x10; i++) {
? ? ? ? s[3] -= ((s[0] << 4) + k[2]) ^ (s[0] + v) ^
? ? ? ? ? ? ? ? ((s[0] >> 5) + k[1]);
? ? ? ? s[2] -= ((s[3] << 4) + k[0]) ^ (s[3] + v) ^
? ? ? ? ? ? ? ? ((s[3] >> 5) + k[3]);
? ? ? ? s[1] -= ((s[2] << 4) + k[2]) ^ (s[2] + v) ^
? ? ? ? ? ? ? ? ((s[2] >> 5) + k[3]);
? ? ? ? s[0] -= ((s[1] << 4) + k[0]) ^ (s[1] + v) ^
? ? ? ? ? ? ? ? ((s[1] >> 5) + k[1]);
? ? ? ? v -= d;
? ? }
}
_____________________________________________________________________
“超星圖書閱覽器” 是北京世紀超星信息技術發展公司的注冊商標
<<< 全文結束
posted on 2008-09-04 14:50 死神 閱讀(458) 評論(0) 編輯 收藏 所屬分類: 文件格式