簡單說說WinHex(二)創建新文件

今天就用WinHex這個軟件,通過修改十六進制數據來修改文件目錄項,以達到在一個U盤中創建文件夾與文件的目的。

我用的U盤,裏面的文件系統是FAT32。

以下就是FAT32文件系統的整體佈局:文件目錄項就在每一個分區中的DADA區。

以管理員身份打開WinHex軟件,既然要修改文件系統中的數據,就在檢測到的磁盤中選擇物理磁盤。

一般在製作過程中,U盤都是被做成一個分區的,我用的這個也是,因此在界面中只能看到界面中只有一個分區表;

在“可移動磁盤”中偏移量從0x000000000~0x0000001F0這個範圍內,就是FAT32文件系統整體佈局中的MBR十六進制數據。

MBR由三部分組成,引導代碼,分區表和結束符標誌。

從偏移量0x000000000~0x0000001BD這部分時就是引導代碼;偏移量0x0000001BE~0X0000001FD就是分區表(即紅框);偏移量0x00000001FE和0x00000001FF就是結束標識符了,規定分區結束標識符是“55 AA”,如果寫成其他數據,就會顯示該U盤還未初始化。

紅框中的分區表共有64個字節,一個區佔16個字節,所以原本該U盤的是可以分成四個區的,圖中用藍框標出來的就是每一個分區所佔據的偏移量,但是正如圖中所示,只有前16個字節有數據,後面都是00,即沒有數據的,說明該U盤只有一個分區。

而在“可移動磁盤2,分區1”中,出現是另外一番景象,此時的偏移量0x0000000~0x0000001F0就是FAT32文件系統的DBR,DBR中記錄了文件系統在磁盤上的起始位置、大小、FAT表個數以及大小等相關信息。

而綠框中的文件,就是U盤中的邏輯文件,但是並不代表每一個都是存在的,也有可能是已經被刪除的,但是文件數據依舊被保留了下來。

 

鼠標點擊“根目錄”,會發現下面的顯示框已經調到了偏移量0x000F92000。這個根目錄就是我們這一整個分區中DATA數據最開始的地方,裏面記錄這該分區中每一個文件的信息,比如文件屬性,建立時間,建立日期,訪問日期,文件簇號(即文件內容存儲的地方),修改日期,所佔字節等。

而記錄這些信息的地方,就叫文件目錄項,從偏移量0x000F92000開始,存放的都是文件的十六進制屬性數據,每一個文件屬性佔32個字節,而他們的文件名,會顯示在右邊藍色框框,是的,顯示的都是亂碼,不過從亂碼中也能根據點蛛絲馬跡知道具體是哪個文件。

如果點擊了除”根目錄“外的其他文件,也會跳轉到一處偏移量,不過那已經不再是文件目錄項了,而是該文件中存儲的內容,記住,只有”根目錄“跳轉到的偏移量纔是U盤的文件目錄項。

好,現在來開始創建文件,從偏移量0x000F92000開始往下找,有數據的說明已經是有文件了,所以我們就找沒有數據的,即都是0的位置,那裏就是我們創建文件的開始地方。

往下找找到了0x000F92A20和0x000F92A30可以存放新的文件,於是我們就在這兩行修改數據便可。

假設現在我們建一個文件,文件名爲WINHEX.TXT,創建日期爲2019.8.7,訪問日期爲2.09.8.8,修改日期爲22019.8.8;創建時間爲23:25:10,修改時間爲23:25:20,文件大小爲1000字節。

首先,偏移字節爲00處,存放該文件的文件名中第一個ASCII字符,很明顯,第一個字符爲W,ASCII值爲87,因此轉成十六進制是57。

偏移字節爲01~0A這10個字節中,就存放文件名中除了第一個字符的其他字符,如果字符數量不夠,不足的部分用0x20填充,注意的是08,09,0A這三個自己,放的是文件的後綴。

剩下的INHEX的ASCII值爲73,78,72,69,88,因此十六進制是49,4E,48,45,58.不足的用0x20填補。

後綴中TXT的ASCII值爲84,88,84.因此是十六進制是54,58,54。

偏移字節0B中存放的是該文件的屬性:

0x01——只讀;0x02——隱藏;0x04——系統文件;0x08——卷標;0x10——目錄;0x20——存檔;

我們新建文件後,是要在裏面存放數據的,因此是存檔文件0x20。

偏移字節0C是保留字節,不做修改,保留原來值00。

偏移字節0D中存放創建時間,精確到十分之一秒,什麼意思呢,因此實際上,一個文件的創建時間電腦是可以精確到ms級別的,比如23時25分10秒12毫秒,這裏我們就寫00,意爲精確到0毫秒。

偏移字節0E~0F這兩個字節存放文件的創建時間,16bit中要存放時、分、秒三種信息,其中時佔5bit,分佔6bit,秒佔5bit,其中秒是以2s爲一個單位的。

創建時間爲23:25:10(單位是5),轉換成二進制分別是10111,011001,00101(5的二進制),組成16bit就是1011101100100101,即0xBB25;

需要注意的是,FAT32系統中數據的存放都是採用LSB模式,即低位先發,因此應該先發25,再發BB。

偏移字節10~11中存放文件創建日期,16bit中要存放年,月,日三種信息,年佔7bit,月佔4,日佔5bit。

之前是跟時分秒所佔bit不同,是因爲日的有效值是1~31,正好用5bit可以放滿;月有效值爲1~12,只需要4bit就可以完全表示;年的有效值爲0~127,這是一個相對於1980的相對值(年份計算的時候需要減去1980),因此可以表示從1980~2107之間的任何一年。那2107年後呢,拉閘唄。

創建日期2019.8.7,轉化爲0100111,1000,00111,組成就是0100111100000111,即0x4F07,由於是低位先發,因此是07 4F。

偏移字節12~13中存放文件的最後訪問日期,爲2019.8.8,同樣是年佔7bit,月佔4,日佔5bit,即0100111,1000,01000,組成16bit就是0100111100001000,即0x4F08,由於LSB,因此是08 4F。

偏移字節14~15中存放的是文件起始簇號的高兩個字節,在“剩餘簇”中我們就可以看看還剩下多少簇是可以用的,我們選了14簇號,簇號的表示是4個字節的,簇號14應該表示爲0x0000000E。這裏存放高兩個字節,因此是00 00。

偏移字節16~17存放文件的最後修改時間,爲23:25:20,與創建時間格式一樣,爲10111,011001,01010,組成16bit爲1011101100101010,即0xBB2A,由於LSB,因此是2A BB。

當然,如果嚴格來說,雖然給文件定下了簇號,但還是需要在FAT1表或者FAT2表(兩個表是同步的)中給該簇號一個結束標誌符,表示該文件佔有簇號只有14號(一個簇佔4個字節),當然如果文件內容過大,需要佔多個簇號的話,就在簇號中數據下一個簇號的十六進制位置數據,就跟鏈表一樣。

便宜字節18~19存放文件最後被修改的日期,爲2019.8.8,格式與創建日期一致,爲0100111,1000,00111,組成16bit爲0100111100000111,即0x4F08,低位先發,因此是08 4F。

偏移字節1A~1B存放文件起始簇號低兩個字節,剛纔知道簇號14爲0x0000000E,低兩個字節就是0x000E,低位先發,因此是0E 00。

偏移字節1C~1F存放文件的字節大小,佔4個字節,我們設置爲1000字節,即0x000003E8,低位先發,因此是E8 03 00 00。

在WinHex設置完後,點擊保存,就可以在U盤中看到新建好的文件WINHEX.TXT了。

這時候我們試着在裏面寫入點什麼數據吧,就寫"HAHAhaha"這幾個字符。我們點擊WINHEX.TXT這個文件,就會跳轉到0x000FAA000偏移量處,從這裏開始存放的,就是文件中的內容了。

直接輸入“HAHAhaha"幾個字符的ASCII值得十六進制數據(這裏就不用低位先發了),即48 41 48 41 68 61 68 61。

保存後就可以直接打開WINHEX.TXT文件,可以看到裏面有我們剛寫進去的數據。

注意:在WinHex創建文件的過程中,文件名字符必須要大寫,文件後綴也是要大寫,寫成其他的,最後在打開文件的時候會提示此文件是不存在的,目前還不知道是軟件原因還是什麼其他原因。

不過這也不用糾結,畢竟WinHex軟件的主要目的是用來檢查和修改數據的,如果要在裏面創建文件,耗費的工作量和時間都是巨大的,完全沒必要,完全可以直接點幾下鼠標新建文件,瞬間建立。

在WinHex嘗試創建文件無非是爲了更好的理解FAT32文件系統的工作原理,以後需要修改文件屬性啥的,就立馬知道該去什麼抵擋修改以及怎麼修改了。

 

 

 

 

 

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