當前位置: 首頁IT技術 → 簡單分析R3磁盤格式化的函數

簡單分析R3磁盤格式化的函數

更多

初識文件系統(tǒng)相關驅動的時候,卷的概念比較模糊,有分區(qū)了,為啥還得有個卷……當初認為一個分區(qū)就是一個卷,后來發(fā)現,這是不準確的。

    卷:卷是扇區(qū)的邏輯集合,這些扇區(qū)可能位于一個磁盤上,也可能來自多個磁盤。一個物理磁盤上的扇區(qū)可以劃分成多個分區(qū)(partition),每個分區(qū)包含一組連續(xù)的扇區(qū);而卷負責管理一個或多個分區(qū)中的扇區(qū)。在windows中,卷有兩種,簡單卷和多分區(qū)卷。

    文件系統(tǒng);是卷內部的一種邏輯結構,允許用戶以文件(數據流)方式來訪問和組織數據。

    卷與文件系統(tǒng):給卷分配一個驅動器字母并不等于該卷就有了對應的文件系統(tǒng);卷上的數據是以扇區(qū)來管理的,而文件系統(tǒng)則為扇區(qū)中的數據定義了結構信息。為了能以文件和目錄的方式來方訪問一個卷上的數據,該卷必須被關聯(lián)上一個文件系統(tǒng),此過程稱為卷識別。
    
    文件系統(tǒng)驅動程序識別一個卷的依據是,檢查該卷的引導扇區(qū),看是否符合該文件系統(tǒng)所要求的必要條件,包括一些標識字符串和關鍵結構信息。識別通過后,文件系統(tǒng)驅動程序會創(chuàng)建這個卷的文件系統(tǒng)實例(即:一個文件系統(tǒng)設備對象)并設置好設備對象的相關屬性。

    從上述信息,我們可以粗略的認為,在一個空白卷上構造一個文件系統(tǒng),就是在該卷的引導扇區(qū)中寫入文件系統(tǒng)關聯(lián)的各種數據。

    寫引導扇區(qū),可以調用系統(tǒng)接口來完成,也可以自行填充相關的數據(符合格式規(guī)定就行,Ramdisk例子中有FAT的引導扇區(qū)格式)。以前弄的那個文件保險箱,格式化的時候,是調用系統(tǒng)的外殼(shell32.dll)的函數SHFormatDrive,彈出一個對話框,再進行格式化操作。真正執(zhí)行格式化的并非是這個外殼函數,真正執(zhí)行格式化的操作函數應該在這個對話框的窗口過程中。用OD跟進去瞧瞧。(PS:有啥不對或者,不足,歡迎拍磚

代碼:

push    esi             ;

 dwInitParampush    offset sub_7D668179 ; 

lpDialogFuncpush    [ebp+hWndParent] ; hWndParentpush    7000h    ;

 lpTemplateNamepush    hInstance       ; 

hInstancecall    sub_7D6103B1

在IDA中,看了一下,很明顯,上面是一個創(chuàng)建對話框函數,跟進對話框過程函數(lpDialogFunc)。

代碼:

push    edi             ; 

lpThreadIdpush    edi             ;

 dwCreationFlagspush    esi             ;

 lpParameterpush    offset sub_7D667FA1 ; 

lpStartAddresspush    edi             ; 

dwStackSizepush    edi             ;

 lpThreadAttributescall    ds:CreateThread

在窗口過程函數中,上面這段代碼比較顯眼,因為那界面上有個進度條,驅動進度條而又不使得界面卡死,通常使用線程,(在加密界面 第三版 的那個殼里面 也是這么弄的),跟進線程函數。

在線程函數中,首先就看到文件系統(tǒng)相關的東西:

代碼:

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

格式化的函數應該離這里不遠了,繼續(xù)往下,一些獲取句柄,發(fā)送消息,處理外殼通知的一些地方直接跳過,真正格式化的函數的的名字并沒有出現在地圖中。不過有兩個CALL,是通過函數指針來調用的。

代碼:

第一個: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,瞧瞧這兩個函數指針指向哪個函數。

對話框函數執(zhí)行后,立馬蹦出了那個格式化對話框。跳轉到窗口過程,在創(chuàng)建線程附近下斷。然后設置格式化相關選項,開始格式化

代碼:

(格式化警告)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    ; 

彈框函數在提示線程函數時,OD會出現一種假死現象,F8按下,程序狀態(tài)變?yōu)檫\行了,沒斷下來……解決方法:

在之前按F8的地方,往后一句代碼上,F2設個斷點,暫停程序,再回復運行(OD工具欄上的)。就可以斷下來了。繼續(xù)F8,如果卡了,重復上述步驟@_@,直到哪兩個函數指針的位置。

(線程函數中)
第一個函數指針調用代碼

代碼:

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


第二個函數指針調用代碼:

代碼:

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結構里是啥:

代碼:

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函數)和 diskcopy.dll,用PEditor瞧瞧,這兩個模塊有啥導出函數。
diskcopy.dll

fmifs.dll

接著就是弄清里面的函數怎么用了。貌似FormatEx未文檔話,上百度,果然有結果。A下來,改改,能用了,FormatEx回調里面,貌似信息量很多,沒仔細調,而且容量小的磁盤,沒有進度信息貌似沒有。(整個外殼包裝一下)


Src:FormatDisk.rar.

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