天天看點

木馬程式的資訊存儲位置

将資訊置于目前不使用的擴充字段或者在不和目前資訊沖突的前提下将資訊“擠”進目前字段,正如current->flags可以重用一樣,比如,如果标準核心中已經定義個若幹flag标志,比如running,sleeping等,我們就可以使用還沒有使用的标志,要知道如果flags字段是一個32位的整型,那麼标準的标志占有極少的一部分,我們可以随意使用剩下的部分用于我們自己的目的,例如我們在設定一個程序為隐藏的時候将其flags于一個還沒有被标準核心使用的flag,我們暫且稱為new相與,然後在顯示程序的時候判斷該程序的flags字段是否有new,如果有的話就不顯示,反之顯示,這是一種很簡單的方式,但是有的時候卻不能奏效,比如涉及到别的資料結構而不僅僅是一個标志位可以識别的情形,那麼就需要額外的資料結構了,這另外一種方式就是使用額外的連結清單或者别的什麼容器來容納額外的資訊,比如KNARK中使用的那樣,這種方式比較容易被發現,畢竟核心中出現了陌生面孔,現在就看看在KNARK這個rootkit中的方式:

在隐藏端口的時候,KNARK使用了以下資料結構:

struct nethide_list //隐藏端口使用

{

struct nethide_list *next;

char *nl_hidestr; //端口号的字元串表示

} *knark_nethide_list = NULL;

int knark_add_nethide(char *hidestr)

struct nethide_list *nl = knark_nethide_list;

if(nl->nl_hidestr) //找到一個空閑的slot

while(nl->next)

nl = nl->next;

nl->next = kmalloc(sizeof(struct nethide_list), GFP_KERNEL);

if(nl->next == NULL) return -1;

}

nl->next = NULL;

nl->nl_hidestr = hidestr;

return 0;

下面看看隐藏檔案使用的資料結構:

struct knark_dev_struct { //每個裝置一個

kdev_t d_dev; int d_nfiles;

ino_t d_inode[MAX_SECRET_FILES]; //最大的檔案數的inode數組

char *d_name[MAX_SECRET_FILES]; //最大的檔案數的name數組

};

struct knark_fs_struct {

int f_ndevs;

struct knark_dev_struct *f_dev[MAX_SECRET_DEVS];

} *kfs;

一旦想隐藏一個檔案,那麼就會往對應的knark_fs_struct的相應的knark_dev_struct中插入一條記錄,在顯示檔案的時候會查詢這個連結清單,如果檔案存在于這個容器那麼不予顯示。

繼續閱讀