下面主要以**為主(未經嚴格測試,僅供學習參考),實現了
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...