linux下inotify可以實現監控檔案系統事件(開啟,讀寫刪除等),inotify最常見的api有以下幾個:
inotify_add_watch原型如下:
int inotify_add_watch(int fd, constchar* pathname, int mask)
inotify的mask型別具體定義見:linux-3.18.6/include/uapi/linux/inotify.h#29
1
2
3
4
5
6
7
8
9
10
11
12
#define in_access 0x00000001 /* file was accessed */
#define in_modify 0x00000002 /* file was modified */
#define in_attrib 0x00000004 /* metadata changed */
#define in_close_write 0x00000008 /* writtable file was closed */
#define in_close_nowrite 0x00000010 /* unwrittable file closed */
#define in_open 0x00000020 /* file was opened */
#define in_moved_from 0x00000040 /* file was moved from x */
#define in_moved_to 0x00000080 /* file was moved to y */
#define in_create 0x00000100 /* subfile was created */
#define in_delete 0x00000200 /* subfile was deleted */
#define in_delete_self 0x00000400 /* self was deleted */
#define in_move_self 0x00000800 /* self was moved */
從read函式讀出的內容是多個 inotify_event 結構體,該結構體定義如下:
1
2
3
4
5
6
7
8
struct
inotify_event;
每個觸發的事件都對應了乙個inotify_event結構體,只要判斷這個結構體中的mask是否為指定的事件(open,read等)即可判斷這個發生的事件是否對我們有用。
select系統呼叫是用來讓我們的程式監視多個檔案控制代碼的狀態變化,select函式原型及引數說明如下:
1
2
intselect
(int
maxfd
,fd_set *
rdset
,fd_set *
wrset,\
fd_set *
exset
,struct
timeval *
timeout);
通過inotify監控/proc/pid資料夾下的關鍵檔案變化(maps的讀,mem的讀等),若想檢視某程序的的虛擬位址空間或者想dump記憶體,則會觸發開啟或讀取的事件,只要接收到這些事件,則說明程序正在被除錯,直接kill主程序。主要**如下:
//fork子程序呼叫該函式,並且傳入父程序pid
void
antidebug
(int
ppid)
while(1
) i+=
sizeof
(struct
inotify_event)+
event
->
len; }
} }
inotify_rm_watch(fd
,wd);
close(fd
); }
反除錯 時間
include include include using namespace std void isdebuger tbefore tafter return intmain rdtsc時鐘檢測反除錯 使用時鐘檢測方法是利用rdtsc這個彙編指令,它返回至系統重新啟動以來的時鐘數,並且將其作為乙個...
反除錯技術二
五 使用ntqueryinformationprocess函式 ntqueryinformationprocess函式是乙個未公開的api,它的第二個引數可以用來查詢程序的除錯埠。如果程序被除錯,那麼返回的埠值會是 1,否則就是其他的值。由於這個函式是乙個未公開的函式,因此需要使用loadlibra...
反除錯技術二
五 使用ntqueryinformationprocess函式 ntqueryinformationprocess函式是乙個未公開的api,它的第二個引數可以用來查詢程序的除錯埠。如果程序被除錯,那麼返回的埠值會是 1,否則就是其他的值。由於這個函式是乙個未公開的函式,因此需要使用loadlibra...