SQL Server之旅(6):使用winHex利器加深理解資料頁

發表於2015-03-17

這篇我來介紹一個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…來呈現資料,如下圖:

上面這個截圖沒什麼稀奇的地方,大家也覺得見怪不怪的,那下面就有一個想法來了,如果我通過winHex來交換slot0和slot1的順序,那效果會是怎樣???按照常理說,這時候引擎還是按照slot槽位依次掃描,這時候應該會將ID=2的記錄先噴出來,然後再噴出ID=1,ID=3。。。事實是不是這樣子呢?好奇吧,我們來看看。。。

三:相關步驟

1.  我們知道Ctrip資料庫是聯機的,我們要修改它必須先離線,然後再關掉資料頁的一致性校驗(這個也是資料庫的保護機制,防止第三方惡意的去篡改資料),這個應該大家都明白,如下圖:

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

3. 我們知道一個資料頁的大小是8KB=8192B,那麼第78號資料頁的起始位置的偏移量應該就是:78*8192=638976,然後通過快捷鍵Alt+G開啟偏移量列表,鍵入638976,如下圖:

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

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

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

當你看到這張圖的時候,是不是已經瘋了。。。。這樣我就非常肯定的論證了,引擎真的就是通過依次掃描slot的槽位來指向記錄的,如果你大概理解了上面的操作,現在你可以修改任意資料頁的資料了,只要你找得到資料頁的偏移量,然後任由你發揮啦~~~~感謝感謝。。。

相關文章