• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            修改linux內(nèi)核達(dá)到隱藏進(jìn)程目的(2.6.28)

            要求:

                

            高級(jí)操作系統(tǒng)與分布式系統(tǒng)作業(yè)

            pstop命令列出了unix中當(dāng)前所有進(jìn)程的相關(guān)信息,作業(yè)要求在linux中增加兩個(gè)系統(tǒng)調(diào)用,功能如下:

                hide():執(zhí)行此系統(tǒng)調(diào)用后,隱藏當(dāng)前進(jìn)程,即當(dāng)前進(jìn)程不能夠被pstop命令查看到。

                unhide():執(zhí)行此系統(tǒng)調(diào)用后,取消隱藏當(dāng)前進(jìn)程,即當(dāng)前進(jìn)程恢復(fù)正常,能夠被pstop命令查看到。

            解題思路:

                Ps命令和top命令從/proc文件系統(tǒng)中讀取進(jìn)程信息并顯示出來。因此,如果一個(gè)進(jìn)程的進(jìn)程號(hào)沒有在/proc文件系統(tǒng)中反映出來,則這個(gè)進(jìn)程被“隱藏”了,“隱藏”進(jìn)程在pstop命令的輸出不出現(xiàn)。

            2。修改linux的進(jìn)程控制塊task_struts,在進(jìn)程控制塊中增加一個(gè)字段:

                int hide;

                hide的值為1時(shí),表示該進(jìn)程被隱藏;為0時(shí),表示該進(jìn)程不被隱藏。

            3。修改創(chuàng)建進(jìn)程的相關(guān)代碼,在進(jìn)程創(chuàng)建時(shí),置hide0;即進(jìn)程在初始創(chuàng)建時(shí)(默認(rèn))不被隱藏。

            4。在系統(tǒng)中增加系統(tǒng)調(diào)用hide(),其功能為:

                 1)將進(jìn)程控制塊中的hide1

                 2)刪除/proc文件系統(tǒng)中該進(jìn)程的相關(guān)目錄項(xiàng);

            5。在系統(tǒng)中增加系統(tǒng)調(diào)用unhide(),其功能為:

                 1)將進(jìn)程控制塊中的hide0

                 2)增加/proc文件系統(tǒng)中該進(jìn)程的相關(guān)目錄項(xiàng)

            具體做法:(實(shí)驗(yàn)內(nèi)核版本2.6.28,)

                跟蹤內(nèi)核可知,proc目錄下進(jìn)程號(hào)目錄是動(dòng)態(tài)生成的,是在每次readdir,getdents時(shí)動(dòng)態(tài)生成,所以從某種意義上說增加或刪除/proc文件系統(tǒng)中該進(jìn)程的相關(guān)目錄項(xiàng)這種說法是不正確的。proc目錄內(nèi)容的填充函數(shù)是proc_pid_readdir(fs/proc/base.c)

            int proc_pid_readdir(struct file * filp, void * dirent, filldir_t filldir)  //內(nèi)核源碼,修改前
            {
             unsigned int nr = filp->f_pos - FIRST_PROCESS_ENTRY;
             struct task_struct *reaper = get_proc_task(filp->f_path.dentry->d_inode);
             struct tgid_iter iter;
             struct pid_namespace *ns;

             if (!reaper)
              goto out_no_task;

             for (; nr < ARRAY_SIZE(proc_base_stuff); filp->f_pos++, nr++) { //這個(gè)for,填充self目錄
              const struct pid_entry *p = &proc_base_stuff[nr];
              if (proc_base_fill_cache(filp, dirent, filldir, reaper, p) < 0)
               goto out;
             }

             ns = filp->f_dentry->d_sb->s_fs_info;
             iter.task = NULL;
             iter.tgid = filp->f_pos - TGID_OFFSET;
             for (iter = next_tgid(ns, iter);         
                  iter.task;
                  iter.tgid += 1, iter = next_tgid(ns, iter)) {  //這個(gè)for,根據(jù)系統(tǒng)內(nèi)進(jìn)程動(dòng)態(tài)添加子進(jìn)程號(hào)目錄,也正是我們需要修改的函數(shù)
              filp->f_pos = iter.tgid + TGID_OFFSET;
              if (proc_pid_fill_cache(filp, dirent, filldir, iter) < 0) {
               put_task_struct(iter.task);
               goto out;
              }
             }
             filp->f_pos = PID_MAX_LIMIT + TGID_OFFSET;
            out:
             put_task_struct(reaper);
            out_no_task:
             return 0;
            }
            將proc_pid_readdir函數(shù)中的for循環(huán)修改為

             for (iter = next_tgid(ns, iter);         
                  iter.task;
                  iter.tgid += 1, iter = next_tgid(ns, iter)) {  //這個(gè)for,根據(jù)系統(tǒng)內(nèi)進(jìn)程動(dòng)態(tài)添加子進(jìn)程號(hào)目錄,也正是我們需要修改的函數(shù)

            if(!iter.task->hide){
              filp->f_pos = iter.tgid + TGID_OFFSET;
              if (proc_pid_fill_cache(filp, dirent, filldir, iter) < 0) {
               put_task_struct(iter.task);
               goto out;
              }

            }
             }

            修改task_struct 添加hide字段(include/linux/sched.h)

            struct task_struct{

                ...//現(xiàn)有字段

                int hide;//添加hide字段,切忌不要在最開始添加,因?yàn)殚_始的字段的偏移量已固定,內(nèi)核中其他部分已直接引用,如果在最開始添加,將導(dǎo)致現(xiàn)有代碼不能正常工作

            }

            修改進(jìn)程創(chuàng)建代碼,初始化時(shí)置hide字段為0,修改copy_process函數(shù)(kernel/fork.c)

            p = dup_task_struct(current);
             if (!p)
              goto fork_out;

            p->hide=0;//添加

             rt_mutex_init_task(p);

            最后一步就是添加系統(tǒng)調(diào)用了,

            修改kernel/sys.c

            添加

            asmlinkage long sys_hide()

            {

            current->hide=1;

            return 0;

            }

            asmlinkage long sys_unhide()

            {

            current->hide=0;

            return 0;

            }

            修改arch/x86/asm/include/unistd_32.h

            #define __NR_inotify_init1 332
            #define __NR_hide 333
            #define __NR_unhide 334

            #ifdef __KERNEL__

            修改arch/x86/kernel/syscall_table_32.s

            .long sys_dup3   /* 330 */
             .long sys_pipe2
             .long sys_inotify_init1
             .long sys_hide
             .long sys_unhide

             

            重新編譯內(nèi)核...OK....

            實(shí)驗(yàn)驗(yàn)證:

            1 test_hide.c

            #include <stdio.h>

            int main(){
             int pid=getpid();
             char command[80];
             sprintf(command,"ps aux|grep %d\n",pid);
             printf("-------------------------------\n");
             system(command);
             printf("-------------------------------\n");
             asm volatile(\
                "int $0x80"\
                ::"a"(333)); // 執(zhí)行333號(hào)系統(tǒng)調(diào)用即sys_hide

             system(command);
             asm volatile(\
                "int $0x80"\
                ::"a"(334));
             printf("-------------------------------\n");
             system(command);
             printf("-------------------------------\n");
             return 0;
            }

            2 運(yùn)行,查看實(shí)驗(yàn)結(jié)果



            posted on 2010-12-14 15:21 lstar 閱讀(3191) 評(píng)論(0)  編輯 收藏 引用


            只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


            導(dǎo)航

            <2025年5月>
            27282930123
            45678910
            11121314151617
            18192021222324
            25262728293031
            1234567

            統(tǒng)計(jì)

            常用鏈接

            留言簿

            文章檔案

            搜索

            最新評(píng)論

            欧美牲交A欧牲交aⅴ久久| 久久国产免费观看精品3| 亚洲国产精品无码久久久不卡| 精品一区二区久久久久久久网站| 伊人情人综合成人久久网小说| 国产精品久久一区二区三区| 久久精品国产亚洲av麻豆蜜芽| 国产亚洲成人久久| 国产69精品久久久久777| 久久久www免费人成精品| 久久久久免费视频| 中文字幕亚洲综合久久| 久久国产精品成人影院| 国产亚洲美女精品久久久2020| 老司机午夜网站国内精品久久久久久久久 | 国内精品久久久久| 亚洲AV日韩精品久久久久| 伊人 久久 精品| 久久一区二区免费播放| 国产高潮国产高潮久久久91| 97久久久精品综合88久久| 少妇人妻88久久中文字幕| 欧美伊人久久大香线蕉综合| 欧美粉嫩小泬久久久久久久| 国产毛片久久久久久国产毛片 | 国产福利电影一区二区三区久久久久成人精品综合 | 99久久综合国产精品二区| 精品国产VA久久久久久久冰 | 理论片午午伦夜理片久久| 国产午夜精品理论片久久| 99热精品久久只有精品| 久久青青草原综合伊人| 欧美一区二区精品久久| 久久亚洲国产午夜精品理论片| 99久久久国产精品免费无卡顿| 国产午夜免费高清久久影院| 久久成人国产精品| 99久久精品国产麻豆| 色综合久久综合网观看| 国产—久久香蕉国产线看观看| 久久99精品久久久久久齐齐|