當(dāng)前位置: 首頁IT技術(shù) → 簡單分析R3磁盤格式化的函數(shù)

簡單分析R3磁盤格式化的函數(shù)

更多

初識文件系統(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.

熱門評論
最新評論
發(fā)表評論 查看所有評論(0)
昵稱:
表情: 高興 可 汗 我不要 害羞 好 下下下 送花 屎 親親
字?jǐn)?shù): 0/500 (您的評論需要經(jīng)過審核才能顯示)