這就需要搭建環境,而這個環境你必須使用ddk。我在這裡假設你已經安裝了ddk,並且會使用ddk來編譯乙個
我的sources檔案是這樣寫的:
targetname=testdriver
targettype=driver
targetpath=obj
browser_info=1
c_defines=-ddriver
includes=c:\ntddk\inc;
user_c_flags=/facs
sources=my.c
其中targetname=testdriver指明編譯出來的檔名稱叫做testdriver。
targettype=driver指明生成的檔案型別是*.sys。
sources=my.c指明需要編譯的源**檔案。
下面來看看my.c檔案內容。
作為乙個wdm驅動,首先執行的應該是driverentry例程。該例程類似於c語言中的main函式。
ntstatus driverentry(in pdriver_object driverobject, in punicode_string registrypath)
deviceobject->flags |= do_buffered_io;
rtlinitunicodestring(&linkstring, l"
\\??\\mydriver");
status = iocreatesymboliclink (&linkstring, &namestring);
if (!nt_success( status ))
//mydrvdispatch例程是乙個irp的分發例程(在我的**中沒有怎麼用到它)
driverobject->majorfunction[irp_mj_create] = mydrvdispatch;
driverobject->majorfunction[irp_mj_close] = mydrvdispatch;
driverobject->majorfunction[irp_mj_cleanup] = mydrvdispatch;
//mydrvdispatchioctl例程比較重要,該例程可以接受來自外界exe程式傳送給它的引數。例如在我的專案中,由乙個外界exe程式
//傳送過來需要保護的檔名稱、登錄檔鍵值等資料,都是使用這個例程來接收的。
driverobject->majorfunction[irp_mj_device_control] = mydrvdispatchioctl;
__asm
看過我文章的朋友一定不會對下面的**陌生。
//檔案刪除
realzwsetinformationfile=(zwsetinformationfile)(keservicedescriptortable->servicetablebase[systemservice("zwsetinformationfile")]);
(zwsetinformationfile)(keservicedescriptortable->servicetablebase[systemservice("zwsetinformationfile")])=hookzwsetinformationfile;
//登錄檔刪除
realzwdeletekey=(realzwdeletekey)(keservicedescriptortable->servicetablebase[systemservice("zwdeletekey")]);
(realzwdeletekey)(keservicedescriptortable->servicetablebase[systemservice("zwdeletekey")])=hookzwdeletekey;
//刪除登錄檔內容
realzwdeletevaluekey=(realzwdeletevaluekey)(keservicedescriptortable->servicetablebase[systemservice("zwdeletevaluekey")]);
(realzwdeletevaluekey)(keservicedescriptortable->servicetablebase[systemservice("zwdeletevaluekey")])=hookzwdeletevaluekey;
//設定登錄檔鍵值
realzwsetvaluekey=(realzwsetvaluekey)(keservicedescriptortable->servicetablebase[systemservice("zwsetvaluekey")]);
(realzwsetvaluekey)(keservicedescriptortable->servicetablebase[systemservice("zwsetvaluekey")])=hookzwsetvaluekey;
//建立檔案
realzwcreatefile=(realzwcreatefile)(keservicedescriptortable->servicetablebase[systemservice("zwcreatefile")]);
(realzwcreatefile)(keservicedescriptortable->servicetablebase[systemservice("zwcreatefile")])=hookzwcreatefile;
__asm
return status_success; }
在解除安裝驅動的時候使用的driverunload例程**如下:
void driverunload (in pdriver_object pdriverobject)
這樣就搭建出了乙個完整的wdm驅動框架。編譯後可以生成乙個具有一定功能的驅動程式。
下次我將會寫如何將我們編寫好的驅動進行安裝,並通過外界的exe程式和這個驅動程式進行通訊。
用HOOK來修改API函式的功能 之禁止刪除檔案
在 未文件化函式中 有個函式叫做zwsetinformationfile。這個函式對應的win32的函式有 setfileattributes setendoffile setfilepointer setfiletime deletefile 也就是說,以上的函式均是和這個zwsetinforma...
用HOOK來修改API函式的功能(4) 環境搭建
原始出處 作者資訊和本宣告。否則將追究法律責任。這就需要搭建環境,而這個環境你必須使用ddk。我在這裡假設你已經安裝了ddk,並且會使用ddk來編譯乙個 我的sources檔案是這樣寫的 targetname testdriver targettype driver targetpath obj b...
用Debug函式實現API函式的跟蹤(3)
用debug函式實現api函式的跟蹤 3 彭春華 閱讀人次 條 很明顯,當被除錯程序在函式入口產生中斷除錯資訊時,除錯程式只能得到函式的輸入引數,而不能得到我們希望的輸出引數及返回值!為了實現我們的目標,我們必須在函式呼叫結束時,再次產生中斷,取得函式的輸出引數和返回值。在處理函式入口中斷時,就必須...