天天看點

Sql Server之旅——第六站 使用winHex利器加深了解資料頁

  

        這篇我來介紹一個winhex利器,這個工具網上有介紹,用途大着呢,可以用來玩資料修複,恢複删除檔案等等。。。。它能夠将一個file解析成

hex形式,這樣你就可以對hex進行修改,然後你就可以看到修複後的結果,為什麼要在sqlserver系列中說這個呢???很簡單呀,sqlserver的DB本

質上也是一個mdf檔案,對吧,既然是檔案,我就可以利用winhex對它進行随意的修改,然後你也知道sqlserver的資料都是以資料頁的形式封裝的,

那我就可以修改它的資料頁,對不對,這樣我就可以随便改變記錄的順序,包括槽位,記錄,頁頭等等。。。說幹就幹吧!!!

一:準備資料

  我計劃在資料庫中插入三條測試資料,如圖:

接下來通過上一章介紹的DBCC指令,檢視下三條記錄的資料頁情況,如下圖:

  我想大家現在都清楚了,資料頁中的一條條存儲記錄都是通過頁尾的槽位指向的,具體可以參見前幾篇對資料頁的介紹,比如你看到頁尾的:

8d0076006000了嗎?要注意,這些都是按照位元組逆序來的。

  1. 6000  這個就是slot0,也就是  (0x0) - 96 (0x60)

  2. 0x76  這個就是slot1,也就是(0x1) - 118 (0x76)  

  2. 0x8d  這個就是slot2,也就是(0x2) - 141 (0x8d)  

是不是有點意思,如果你一定要看到slot具體指向的内容,你可以繼續用上一節介紹的DBCC指令,一清二楚。

仔細觀察下上面的藍色字型,有沒有總結出各個slot槽位對應的記錄内容,比如:

  slot0槽位指向的記錄内容:  amy =>  616d79。

  slot1槽位指向的記錄内容:  anna => 616e6e61。

  slot2槽位指向的記錄内容:  smart => 736d617274。

這裡你要知道,這裡都是16進制表示的,是以2個16進制對應一個位元組。

二:使用WinHex修改資料

  我們大家都知道,sqlserver引擎會通過掃描slot槽位來呈現資料,就像上面的記錄那樣,依次掃描slot0...slot1....slot2...來呈現資料,如下圖:

Sql Server之旅——第六站 使用winHex利器加深了解資料頁

上面這個截圖沒什麼稀奇的地方,大家也覺得見怪不怪的,那下面就有一個想法來了,如果我通過winHex來交換slot0和slot1的順序,那效果會是

怎樣???按照常理說,這時候引擎還是按照slot槽位依次掃描,這時候應該會将ID=2的記錄先噴出來,然後再噴出ID=1,ID=3。。。事實是不是

這樣子呢?好奇吧,我們來看看。。。

三:相關步驟

1.  我們知道Ctrip資料庫是聯機的,我們要修改它必須先脫機,然後再關掉資料頁的一緻性校驗(這個也是資料庫的保護機制,防止第三方惡意的去篡

     改資料),這個應該大家都明白,如下圖:

Sql Server之旅——第六站 使用winHex利器加深了解資料頁

2.  從網上下載下傳一個破解版的winhex,然後打開本地的Ctrip.mdf檔案,調整winhex的編輯模式為預設的可讀寫,如圖:

Sql Server之旅——第六站 使用winHex利器加深了解資料頁

3. 我們知道一個資料頁的大小是8KB=8192B,那麼第78号資料頁的起始位置的偏移量應該就是:78*8192=638976,然後通過快捷鍵

    Alt+G打開偏移量清單,鍵入638976,如下圖:

Sql Server之旅——第六站 使用winHex利器加深了解資料頁

找到記錄的内容之後,我們再來找槽位,槽位的開始位置在78号資料頁的末尾,那怎麼算呢?這個算法也很簡單,offset=79*8192-1=647167。

說幹就幹。

Sql Server之旅——第六站 使用winHex利器加深了解資料頁

當你真的找到了偏移量,是不是很興奮呢?下面要做的就是把60和76交換一下,也就是将slot0和slot1交換,看看怎麼樣????

4. 交換完畢後,ctrl+s儲存,然後讓Ctrip資料庫聯機,并使用Sql語句檢視下現在的效果???

Sql Server之旅——第六站 使用winHex利器加深了解資料頁

當你看到這張圖的時候,是不是已經瘋了。。。。這樣我就非常肯定的論證了,引擎真的就是通過依次掃描slot的槽位來指向記錄的,如果你

大概了解了上面的操作,現在你可以修改任意資料頁的資料了,隻要你找得到資料頁的偏移量,然後任由你發揮啦~~~~感謝感謝。。。

上一篇: CareerCup-1.6