资源简介

本代码已经通过实际测试,代码运行良好,无bug。在Linux内核中增加一个系统调用,并编写对应的linux应用程序。利用该系统调用能够遍历系统当前所有进程的任务描述符,并按进程父子关系将这些描述符所对应的进程id(PID)组织成树形结构显示。

资源截图

代码片段和文件信息

#include   
#include   
#include   
#include   
#include   
#include  

#define my_syscall_num 223  //系统调用号(没有被系统占用)
#define sys_call_table_address 0xc06224e0  //sys_call_table首地址通过grep sys_call_table /boot/System.map-‘uname -r‘获取

unsigned long *sys_call_table = 0; 
int orig_cr0;   
static int (*anything_saved)(void); 
static int counter = 0; 


typedef struct process  
{  
    int pid;  
    int depth;  
}process;    
process a[512];




/* 控制寄存器cr0的第16位是写保护位。
若清零了则允许超级权限往内核中写入数据
然后写完后,又将那一位复原就行了。*/
unsigned int clear_and_return_cr0(void)  
{  
    unsigned int cr0 = 0;  
    unsigned int ret;  
    asm(“movl %%cr0 %%eax“:“=a“(cr0));//读取cr0寄存器的值放入eax中,同时赋值给cr0  
    ret = cr0;  
    cr0 &= 0xfffeffff;  
    asm(“movl %%eax %%cr0“::“a“(cr0));  
    return ret;  
}  
  
void setback_cr0(unsigned int val) 
{  
    asm volatile(“movl %%eax %%cr0“::“a“(val)); //读取val的值到eax寄存器,再将eax寄存器的值放入cr0中  
}  

void processtree(struct task_struct * pint b)  
{  
    struct list_head * l;  
    a[counter].pid = p -> pid;  
    a[counter].depth = b;  
    counter ++;  
    for(l = p -> children.next; l != &(p->children); l = l->next)  
    {  
        struct task_struct *t = list_entry(lstruct task_structsibling);  
        processtree(tb+1);  
    }  
}  

asmlinkage long sys_mycall(char __user * buf)  
{  
    int b = 0;  
    struct task_struct * p;  
    printk(“**********sys_mycall************\n“);  
  
    for(p = current; p != &init_task; p = p->parent );//通过当前current进行向上查找直到p指向根进程init_task。  
    processtree(pb);  
          
    if(copy_to_user((struct process *)bufa512*sizeof(struct process)))  
        return -EFAULT;  
    else  
        return sizeof(a);  
}  

  

static int __init init_addsyscall(void)  
{  
    printk(“***********init_addsyscall*************\n“);  
    sys_call_table = (unsigned long *)sys_call_table_address;//获取sys_call_table的首地址 
    printk(“*********sys_call_table: 0x%p\n“ sys_call_table);  //
    anything_saved = (int(*)(void)) (sys_call_table[my_syscall_num]);//保存原始系统调用的地址  
    orig_cr0 = clear_and_return_cr0();//修改sys_call_table写属性
    sys_call_table[my_syscall_num]= (unsigned long)&sys_mycall;//将223号指向自己写的调用函数 
    setback_cr0(orig_cr0);//恢复页表只读属性 
    return 0;  
}  


static void __exit exit_addsyscall(void)  
{  
    //设置cr0中对sys_call_table的更改权限。  
    orig_cr0 = clear_and_return_cr0();//设置cr0可更改  
    //恢复原有的中断向量表中的函数指针的值。  
    sys_call_table[my_syscall_num]= (unsigned long)anything_saved;  
    //恢复原有的cr0的值  
    setback_cr0(orig_cr0);  
    printk(“**************call exit_addsyscall exit******************** \n“);  
}  



module_init(init_addsyscall);  
module_exit(exit_addsyscall);  
MODULE_LICENSE(“GPL“); 








 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

    ..A..H.       278  2016-12-31 23:10  ProgressTreePrint\.ProgressTreePrintKernel.ko.cmd

    ..A..H.     13700  2016-12-31 23:10  ProgressTreePrint\.ProgressTreePrintKernel.mod.o.cmd

    ..A..H.     13787  2016-12-31 23:10  ProgressTreePrint\.ProgressTreePrintKernel.o.cmd

     文件        117  2017-01-01 14:40  ProgressTreePrint\.tmp_versions\ProgressTreePrintKernel.mod

     文件        394  2016-12-31 19:46  ProgressTreePrint\Makefile

     文件        414  2016-12-31 19:45  ProgressTreePrint\Makefile~

     文件          0  2016-12-31 19:48  ProgressTreePrint\Module.markers

     文件          0  2016-12-31 19:48  ProgressTreePrint\Module.symvers

     文件       3114  2016-12-31 19:52  ProgressTreePrint\ProgressTreePrintKernel.c

     文件       3113  2016-12-31 19:47  ProgressTreePrint\ProgressTreePrintKernel.c~

     文件      79011  2016-12-31 23:10  ProgressTreePrint\ProgressTreePrintKernel.ko

     文件        722  2016-12-31 23:10  ProgressTreePrint\ProgressTreePrintKernel.mod.c

     文件      42852  2016-12-31 23:10  ProgressTreePrint\ProgressTreePrintKernel.mod.o

     文件      37396  2016-12-31 23:10  ProgressTreePrint\ProgressTreePrintKernel.o

     文件       4992  2017-01-01 14:40  ProgressTreePrint\ProgressTreePrintUser

     文件        545  2016-12-31 19:05  ProgressTreePrint\ProgressTreePrintUser.c

    ...D.H.         0  2017-02-15 11:44  ProgressTreePrint\.tmp_versions

     目录          0  2017-02-15 11:44  ProgressTreePrint

----------- ---------  ---------- -----  ----

               200435                    18


评论

共有 条评论