相關(guān)資訊
本類常用軟件
-
福建農(nóng)村信用社手機銀行客戶端下載下載量:584212
-
Windows優(yōu)化大師下載量:419727
-
90美女秀(視頻聊天軟件)下載量:366966
-
廣西農(nóng)村信用社手機銀行客戶端下載下載量:365708
-
快播手機版下載量:325898
初識文件系統(tǒng)相關(guān)驅(qū)動的時候,卷的概念比較模糊,有分區(qū)了,為啥還得有個卷……當(dāng)初認(rèn)為一個分區(qū)就是一個卷,后來發(fā)現(xiàn),這是不準(zhǔn)確的。
卷:卷是扇區(qū)的邏輯集合,這些扇區(qū)可能位于一個磁盤上,也可能來自多個磁盤。一個物理磁盤上的扇區(qū)可以劃分成多個分區(qū)(partition),每個分區(qū)包含一組連續(xù)的扇區(qū);而卷負(fù)責(zé)管理一個或多個分區(qū)中的扇區(qū)。在windows中,卷有兩種,簡單卷和多分區(qū)卷。
文件系統(tǒng);是卷內(nèi)部的一種邏輯結(jié)構(gòu),允許用戶以文件(數(shù)據(jù)流)方式來訪問和組織數(shù)據(jù)。
卷與文件系統(tǒng):給卷分配一個驅(qū)動器字母并不等于該卷就有了對應(yīng)的文件系統(tǒng);卷上的數(shù)據(jù)是以扇區(qū)來管理的,而文件系統(tǒng)則為扇區(qū)中的數(shù)據(jù)定義了結(jié)構(gòu)信息。為了能以文件和目錄的方式來方訪問一個卷上的數(shù)據(jù),該卷必須被關(guān)聯(lián)上一個文件系統(tǒng),此過程稱為卷識別。
文件系統(tǒng)驅(qū)動程序識別一個卷的依據(jù)是,檢查該卷的引導(dǎo)扇區(qū),看是否符合該文件系統(tǒng)所要求的必要條件,包括一些標(biāo)識字符串和關(guān)鍵結(jié)構(gòu)信息。識別通過后,文件系統(tǒng)驅(qū)動程序會創(chuàng)建這個卷的文件系統(tǒng)實例(即:一個文件系統(tǒng)設(shè)備對象)并設(shè)置好設(shè)備對象的相關(guān)屬性。
從上述信息,我們可以粗略的認(rèn)為,在一個空白卷上構(gòu)造一個文件系統(tǒng),就是在該卷的引導(dǎo)扇區(qū)中寫入文件系統(tǒng)關(guān)聯(lián)的各種數(shù)據(jù)。
寫引導(dǎo)扇區(qū),可以調(diào)用系統(tǒng)接口來完成,也可以自行填充相關(guān)的數(shù)據(jù)(符合格式規(guī)定就行,Ramdisk例子中有FAT的引導(dǎo)扇區(qū)格式)。以前弄的那個文件保險箱,格式化的時候,是調(diào)用系統(tǒng)的外殼(shell32.dll)的函數(shù)SHFormatDrive,彈出一個對話框,再進行格式化操作。真正執(zhí)行格式化的并非是這個外殼函數(shù),真正執(zhí)行格式化的操作函數(shù)應(yīng)該在這個對話框的窗口過程中。用OD跟進去瞧瞧。(PS:有啥不對或者,不足,歡迎拍磚)
代碼:
push esi ;
dwInitParampush offset sub_7D668179 ;
lpDialogFuncpush [ebp+hWndParent] ; hWndParentpush 7000h ;
lpTemplateNamepush hInstance ;
hInstancecall sub_7D6103B1
在IDA中,看了一下,很明顯,上面是一個創(chuàng)建對話框函數(shù),跟進對話框過程函數(shù)(lpDialogFunc)。
代碼:
push edi ;
lpThreadIdpush edi ;
dwCreationFlagspush esi ;
lpParameterpush offset sub_7D667FA1 ;
lpStartAddresspush edi ;
dwStackSizepush edi ;
lpThreadAttributescall ds:CreateThread
在窗口過程函數(shù)中,上面這段代碼比較顯眼,因為那界面上有個進度條,驅(qū)動進度條而又不使得界面卡死,通常使用線程,(在加密界面 第三版 的那個殼里面 也是這么弄的),跟進線程函數(shù)。
在線程函數(shù)中,首先就看到文件系統(tǒng)相關(guān)的東西:
代碼:
loc_7D668029: ; "FAT32"mov [ebp+var_4],
offset aFat32jmp short loc_7D668042mov [ebp+var_4], offset aExfat ;
"exFAT"jmp short loc_7D668042loc_7D668032: ;
"NTFS"mov [ebp+var_4], offset aNtfsjmp short loc_7D668042loc_7D66803B: ;
"FAT"mov [ebp+var_4], offset aFat
格式化的函數(shù)應(yīng)該離這里不遠(yuǎn)了,繼續(xù)往下,一些獲取句柄,發(fā)送消息,處理外殼通知的一些地方直接跳過,真正格式化的函數(shù)的的名字并沒有出現(xiàn)在地圖中。不過有兩個CALL,是通過函數(shù)指針來調(diào)用的。
代碼:
第一個:push dword ptr [esi+60h]lea eax, [esi+64h]push [ebp+var_C]push eaxpush
[ebp+var_4]push [ebp+var_10]push ebxcall dword ptr [esi+14h]
第二個:loc_7D668110:lea eax, [esi+48h]push eaxpush dword ptr [esi+4]push
dword ptr [esi+28h]call dword ptr [esi+2Ch]
接下來跑OD,瞧瞧這兩個函數(shù)指針指向哪個函數(shù)。
對話框函數(shù)執(zhí)行后,立馬蹦出了那個格式化對話框。跳轉(zhuǎn)到窗口過程,在創(chuàng)建線程附近下斷。然后設(shè)置格式化相關(guān)選項,開始格式化
代碼:
(格式化警告)7D6683E5 68 31000100 PUSH 0x100317D6683EA 33FF
XOR EDI,EDI7D6683EC 57 PUSH EDI7D6683ED 68 16700000
PUSH 0x70167D6683F2 FF75 08 PUSH DWORD PTR SS:
[EBP+0x8]7D6683F5
FF35 A4F5797D PUSH DWORD PTR DS:[0x7D79F5A4] ;
shell32.7D5900007D6683FB E8 274C1000 CALL shell32.ShellMessageBoxW ;
彈框函數(shù)在提示線程函數(shù)時,OD會出現(xiàn)一種假死現(xiàn)象,F(xiàn)8按下,程序狀態(tài)變?yōu)檫\行了,沒斷下來……解決方法:
在之前按F8的地方,往后一句代碼上,F(xiàn)2設(shè)個斷點,暫停程序,再回復(fù)運行(OD工具欄上的)。就可以斷下來了。繼續(xù)F8,如果卡了,重復(fù)上述步驟@_@,直到哪兩個函數(shù)指針的位置。
(線程函數(shù)中)
第一個函數(shù)指針調(diào)用代碼
代碼:
7D6680F3 68 4B71667D PUSH shell32.7D66714B ;
CallBackFunction7D6680F8 75 16 JNZ SHORT shell32.7D6681107D6680FA FF76 60
PUSH DWORD PTR DS:[ESI+0x60] ;
20487D6680FD 8D46 64 LEA EAX,DWORD PTR DS:[ESI+0x64]7D668100 FF75 F4
PUSH DWORD PTR SS:[EBP-0xC] ;
7D668103 50 PUSH EAX ;
L"Text"7D668104 FF75 FC PUSH DWORD PTR SS:[EBP-0x4] ;
L"NTFS"7D668107 FF75 F0 PUSH DWORD PTR SS:[EBP-0x10] ;
0xC7D66810A 53 PUSH EBX ; L"Z:\\"7D66810B FF56 14
CALL DWORD PTR DS:[ESI+0x14] ;
fmifs.FormatEx
第二個函數(shù)指針調(diào)用代碼:
代碼:
7D668110 8D46 48 LEA EAX,DWORD PTR DS:[ESI+0x48]7D668113 50
PUSH EAX7D668114 FF76 04 PUSH DWORD PTR DS:
[ESI+0x4]7D668117 FF76 28
PUSH DWORD PTR DS:[ESI+0x28]7D66811A FF56 2C
CALL DWORD PTR DS:[ESI+0x2C]
瞧瞧ESI結(jié)構(gòu)里是啥:
代碼:
dd ESI:00185280 00000002 //+000185284 00000019 //+400185288 0000FFFF
//+80018528C 00000001
//+c00185290 696D0000 fmifs.696D0000
//+1000185294 696D1EDF fmifs.FormatEx
//+1400185298 696D27A5 fmifs.QuerySupportedMedia
//+180018529C 696D2743 fmifs.EnableVolumeCompression
//+1c001852A0 696D33E0 fmifs.ChkdskEx
//+20001852A4 696D2BED fmifs.QueryDeviceInformation+
//+24001852A8 6CFE0000 diskcopy.6CFE0000
//+28001852AC 6CFE2FC8 diskcopy.#1 //+2c
最后,找到兩個模塊 fmifs.dll (FormatEx函數(shù))和 diskcopy.dll,用PEditor瞧瞧,這兩個模塊有啥導(dǎo)出函數(shù)。
diskcopy.dll
fmifs.dll
接著就是弄清里面的函數(shù)怎么用了。貌似FormatEx未文檔話,上百度,果然有結(jié)果。A下來,改改,能用了,FormatEx回調(diào)里面,貌似信息量很多,沒仔細(xì)調(diào),而且容量小的磁盤,沒有進度信息貌似沒有。(整個外殼包裝一下)
Src:FormatDisk.rar.