我愛我的家園!

          成功在于你是否努力,希望在于你是否相信自己!

           

          《超星圖書閱覽器》圖書目錄文件格式探秘

          ========================================
          《超星圖書閱覽器》圖書目錄文件格式探秘
          ========================================
          版本 1.1
          Shun Cox (shuncox@263.net)

          注意:
          本文可以任意復制、轉(zhuǎn)換和發(fā)布,但必須保持文件內(nèi)容的一致和完整。
          有任何問題請到 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;????????// 分類所處的層數(shù)
          ? ? DWORD Start;????// 在相應 bklist 中的起始記錄號
          ? ? DWORD Num;????????// 圖書數(shù)量
          };

          bklist.dat
          ----------
          bklist 的記錄相對復雜

          偏移 0 處(V3.51 以前不加密,V3.51 對整個記錄完全加密):
          struct BookInfo {
          ? ? char Name[100];????// 書名
          ? ? DWORD Pages;????// 頁數(shù)
          ? ? 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 字節(jié)為單位順序進行,最后不足單位的字節(jié)忽略。

          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;
          ? ? }
          }

          _____________________________________________________________________
          “超星圖書閱覽器” 是北京世紀超星信息技術發(fā)展公司的注冊商標
          <<< 全文結束

          posted on 2008-09-04 14:50 死神 閱讀(466) 評論(0)  編輯  收藏 所屬分類: 文件格式

          導航

          統(tǒng)計

          公告

          歡迎大家來到我的個人世界!

          常用鏈接

          留言簿(3)

          隨筆分類(5)

          隨筆檔案(9)

          文章分類(37)

          文章檔案(41)

          相冊

          語音技術

          最新隨筆

          搜索

          積分與排名

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 阿拉善左旗| 方城县| 石林| 平阴县| 黎城县| 平潭县| 长白| 丰原市| 庆安县| 吴堡县| 右玉县| 牙克石市| 宁化县| 东山县| 桑植县| 雅安市| 鄱阳县| 靖宇县| 泗洪县| 新巴尔虎右旗| 米林县| 柳江县| 儋州市| 保定市| 玛多县| 岳池县| 永嘉县| 双柏县| 临湘市| 上杭县| 永年县| 板桥市| 三门峡市| 珲春市| 开阳县| 屯留县| 周宁县| 卫辉市| 达孜县| 略阳县| 甘洛县|