系統服務掛鉤 HOOK 2

2021-04-12 16:49:48 字數 4668 閱讀 5831

下面主要以**為主(未經嚴格測試,僅供學習參考),實現了

1、 保護檔案/目錄不被刪除

2、 隱藏檔案/目錄

3、 隱藏程序

4、 保護程序不被結束

5、 保護登錄檔鍵不被開啟

6、 保護登錄檔鍵不被刪除

網上有幾篇文章介紹了部分功能,並提供的原始碼。所以我主要把對原始碼的理解寫下來,並對原始碼做簡化,更利於理解。

保護檔案/目錄不被刪除

掛鉤 zwsetinformationfile

ntstatus

zwsetinformationfile(

in handle  filehandle,

out pio_status_block  iostatusblock,

in pvoid  fileinformation,

in ulong  length,

in file_information_class  fileinformationclass

);當fileinformationclass= filedispositioninformation時,fileinformation指向乙個

file_disposition_information 結構,其定義如下:

typedef struct _file_disposition_information file_disposition_information;

如果deletefile被設為true時,那麼當 zwclose 被呼叫後檔案將被刪除。這種情況下我們只要返回status_no_such_file或status_access_denied。

ntstatus hook_zwsetinformationfile(

in handle  filehandle,

out pio_status_block  iostatusblock,

in pvoid  fileinformation,

in ulong  length,

in file_information_class  fileinformationclass

)obdereferenceobject(object) ;

if ( lpuname->length > 0 &&

wcscmp( lpuname->buffer , l」要保護的檔名」 ) == 0 )}}

rc = gfn_realzwsetinformationfile( filehandle , iostatusblock ,

fileinformation , length , fileinformationclass ) ;

return rc ;

}隱藏檔案/目錄

掛鉤 zwquerydirectoryfile

注:該函式未文件化,在ntifs.h內定義,掛鉤前先用 extern 宣告。

extern ntsysapi ntstatus ntapi zwquerydirectoryfile(

in handle hfile,

in handle hevent optional,

in pio_apc_routine ioapcroutine optional,

in pvoid ioapccontext optional,

out pio_status_block piostatusblock,

out pvoid fileinformationbuffer,

in ulong fileinformationbufferlength,

in file_information_class fileinfoclass,

in boolean breturnonlyoneentry,

in punicode_string pathmask optional,

in boolean brestartquery);

引數比較多,看得頭都大了^_^,其實真正重要的引數就三個

鉤子函式先呼叫真正的函式,當fileinfoclass= filebothdirectoryinformation(3)時,

fileinformationbuffer返回請求的目錄下的子目錄和檔案,是一組file_both_dir_

information結構:

typedef struct _file_both_dir_information file_both_dir_information, *pfile_both_dir_information;

我們要隱藏某個檔案或目錄,只需要把該結點從鍊錶中刪除。需要注意的是,hevent

引數或ioapcroutine引數如果傳入有效的值,表示函式以非同步的方式處理,這時應該不做其它處理,直接呼叫真正的函式。

ntstatus hook_zwquerydirectoryfile (

in handle hfile,

in handle hevent optional,

in pio_apc_routine ioapcroutine optional,

in pvoid ioapccontext optional,

out pio_status_block piostatusblock,

out pvoid fileinformationbuffer,

in ulong fileinformationbufferlength,

in file_information_class fileinfoclass,

in boolean breturnonlyoneentry,

in punicode_string pathmask optional,

in boolean brestartquery

)else

break;

}else}}

// 移到下乙個結點

plastfileinfo = pfileinfo;

pfileinfo = (pfile_both_dir_information)( (ulong)pfileinfo

+ pfileinfo->nextentryoffset );

}while(!blastone);

}return rc ; }

pfileinfo->filename 只提供檔名或目錄名,如果要取得完整路徑,需要通過hfile取,如同上面的例子一樣。我使用比較簡單的演算法,只要檔案/目錄名中含有」hidefile」,就讓它消失!其實這個只能在explorer中隱藏,在命令提示符下仍然可以cd進去,為了更徹底點,

我攔截了zwopenfile

ntstatus hook_zwopenfile(

out phandle  filehandle,

in access_mask  desiredaccess,

in pobject_attributes  objectattributes,

out pio_status_block  iostatusblock,

in ulong  shareaccess,

in ulong  openoptions

)  

rc = gfn_realzwopenfile( filehandle , desiredaccess ,

objectattributes , iostatusblock , shareaccess , openoptions ) ;

return rc ;

}由於**都大同小異,後面幾項功能的**不一一帖出了。

隱藏程序掛鉤 zwquerysysteminformation ,未文件化的函式,函式定義參考:

可以在 winternl.h 中找到

system_information_class 的定義

typedef enum _system_information_class system_information_class;

當 systeminformationclass== systemprocessinformation時,

systeminformation指向乙個system_process_information 結構陣列,其中每個成員表示系統中執行的每個程序。注:msdn上如是說,但網上的**卻是說指向

system_processes

struct _system_processes

;兩個結構大小差距甚大,意義也不盡相同。

測試後發現

system_processes可以正常工作。

保護程序不被結束可以掛鉤

系統服務掛鉤 HOOK 1

不僅win32 api可以掛鉤,系統服務也可以掛鉤。開發者為了捕獲各種事件,可以掛鉤檔案建立函式createfile,登錄檔訪問函式regcreatekey。使用掛鉤可以改變作業系統的行為,只要適當地改變掛鉤的資料結構和上下文,足夠引起新的行為。例如,通過掛鉤ntcreatefile系統服務,可以保...

Hook 系統服務隱藏埠

主頁 有時候寫程式,除錯程式真是一件非常有趣的事,就比如這次,蹦蹦跳跳,笑嘻嘻,意猶未盡的就把這個程式搞好了。stat 或者其他各種列舉埠的工具,比如fport,或者 sysinternals 的 tcpview,都是呼叫 iphlpapi.dll 中的 api 來完成埠的列舉。而 iphlpapi...

Hook 系統服務隱藏埠

主頁 http jiurl.yeah.日期 2004 03 30 有時候寫程式,除錯程式真是一件非常有趣的事,就比如這次,蹦蹦跳跳,笑嘻嘻,意猶未盡的就把這個程式搞好了。stat 或者其他各種列舉埠的工具,比如fport,或者 sysinternals 的 tcpview,都是呼叫 iphlpapi...