通過inotify實現反除錯

2021-09-07 15:33:52 字數 2231 閱讀 4327

linux下inotify可以實現監控檔案系統事件(開啟,讀寫刪除等),inotify最常見的api有以下幾個:

inotify_add_watch原型如下:

int inotify_add_watch(int fd, const

char* 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...