用HOOK來修改API函式的功能(4) 環境搭建

2021-09-05 05:42:10 字數 2886 閱讀 5057

這就需要搭建環境,而這個環境你必須使用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 彭春華 閱讀人次 條 很明顯,當被除錯程序在函式入口產生中斷除錯資訊時,除錯程式只能得到函式的輸入引數,而不能得到我們希望的輸出引數及返回值!為了實現我們的目標,我們必須在函式呼叫結束時,再次產生中斷,取得函式的輸出引數和返回值。在處理函式入口中斷時,就必須...