Kernel Mode Driver Framework

淺談WDFFunctions


在WDF驅動程式架構,系統載入驅動程式時,呼叫的進入點是FxDriverEntry(),而不是原本的DriverEntry(),只是FxDriverEntry()最終會呼叫DriverEntry(),這個DriverEntry()也就是原本使用者寫的進入點,在DriverEntry()裡面會呼叫WdfDriverCreate()用來產生WDF Driver Object,讓司徒好奇的是,WdfDriverCreate()裡面的WdfFunctions[]究竟是如何得到的呢?因為司徒在移植KMDF(從C/C++到MASM32)時,便找不到這個指標的內容,於是司徒逆向看下相關檔案,這才發現WdfFunctions[]是執行後填入的東西,過程分析如下。

司徒使用一個簡單的範例做測試:

public DriverEntry

.data
config WDF_DRIVER_CONFIG <0>

.code
DriverEntry proc pOurDriver:PDRIVER_OBJECT, pOurRegistry:PUNICODE_STRING
  invoke WDF_DRIVER_CONFIG_INIT, offset config, 0
  invoke WdfDriverCreate, pOurDriver, pOurRegistry, WDF_NO_OBJECT_ATTRIBUTES, offset config, WDF_NO_HANDLE
  mov eax, STATUS_UNSUCCESSFUL
  ret
DriverEntry endp
end DriverEntry
.end

接著逆向main.obj


接著跟到_WdfDriverCreate@20


extern WdfFunctions[]


WdfFunctions[]定義如下:

typedef void (*WDFFUNC) (void);
extern WDFFUNC WdfFunctions [];

接著逆向WDFDriverEntry.lib

看到這裡應該有個底了,這些指標並不在已經事先指定好,也就是不是在編譯時期產生,而是在執行時再填入

往回找參考的地方


調用地方是_FxDriverEntryWorker@8


而_FxDriverEntry@8就是調用_FxDriverEntryWorker@8的最原始地方


返回上一頁