进程实时监控

发布于 2022-10-15 07:36:45 字数 59 浏览 21 评论 0

有没有什么方法对linux进程进行实时监控,包括进程的新建和删除。
不用重新编译内核的。
谢谢

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(9

幸福还没到 2022-10-22 07:36:45

回复 1# umdd0210
将进程创建和删除的函数重写,在重写的函数中对进程的创建和删除进行实施监控;然后再写一个内核模块,将内核原来的函数替换为“jmp 新函数”

箜明 2022-10-22 07:36:45

回复 2# 瀚海书香

    将进程创建和删除的函数重写,不用重新编译内核吗?
   是用系统调用的方法吗?
   能不能说的再详细一点,我不是很清楚,谢谢。

紫轩蝶泪 2022-10-22 07:36:45

回复 3# umdd0210
看看这个链接应该就懂了
http://www.ibm.com/developerworks/cn/linux/l-knldebug/

梦行七里 2022-10-22 07:36:45

回复 3# umdd0210
看看这个链接应该就懂了
http://www.ibm.com/developerworks/cn/linux/l-knldebug/

岁月流歌 2022-10-22 07:36:45

回复 5# 瀚海书香

    嗯,明白了。
  那请问,如果我替换do_fork()函数,如何获取将要创建的进程的进程名和进程ID呢?

人海汹涌 2022-10-22 07:36:45

回复 4# 瀚海书香

    这种方法真不错。。。

江南月 2022-10-22 07:36:45

回复 4# 瀚海书香

    我用你说的方法,替换了创建进程时要使用的set_task_comm函数,但是insmod之后系统就死机了。。。。。

知道原因么。。。。。

谢谢

神爱温柔 2022-10-22 07:36:45

本帖最后由 瀚海书香 于 2011-05-10 16:16 编辑

回复 8# umdd0210
应该是你替换代码的问题吧。如果完全按照方法进行替换的话,是没有问题的。之前曾经用过这个方法,确定这个方法是可用的。
假设要替换函数的地址 A,新函数的地址为B,一个全局变量数组C[5]。那么代码大体上如下:
static void replacefunc(char *A,char *B)
{
       char p[5];
       memcpy(C,A,5);
       p[0]=‘\xe9’;//jmp code
       *(long*)&p[1]=(long)(B-A-5);
       lock_kernel();
       memcpy(A,P,5);
       unlock_kernel();
}

最笨的告白 2022-10-22 07:36:45

回复 9# 瀚海书香

    我这个就是照着那个例程写的:

  1. #ifndef __KERNEL__
  2. #define __KERNEL__
  3. #endif
  4. #ifndef MODULE
  5. #define MODULE
  6. #endif
  7. #include <linux/kernel.h>
  8. #include <linux/config.h>
  9. #include <linux/module.h>
  10. #include <asm/string.h>
  11. #include <asm/unistd.h>
  12. #include <linux/fs.h>
  13. #include <linux/sched.h>
  14. #include <linux/smp_lock.h>
  15. #include <linux/sched.h>
  16. #define MY_FILE "/home/procmon.txt"
  17. struct file *file = NULL;
  18. char buf[128];
  19. //c046ab6f T set_task_comm
  20. void (*orig_setcomm)(struct task_struct *tsk, char *buf) =        (void (*)(struct task_struct
  21. *tsk, char *buf))0xc046ab6f;
  22. #define CODESIZE 7
  23. static char orig_setcomm_code[7];
  24. static char setcomm_code[7] =
  25.             "\xb8\x00\x00\x00\x00""\xff\xe0";
  26. void* _memcpy (void *dest, const void *src, int size)
  27. {
  28.   const char *p = src;
  29.   char *q = dest;
  30.   int i;
  31.   for (i=0; i<size; i++) *q++ = *p++;
  32.   return dest;
  33. }
  34. void trigger(struct task_struct *tsk, char *comm)
  35. {
  36.         if(file == NULL)
  37.                 file = filp_open(MY_FILE,O_RDWR | O_CREAT,0644);
  38.         if(IS_ERR(file))
  39.         {
  40.                 printk("open %s error.\n",MY_FILE);
  41.         }
  42.         sprintf(buf,"new process %s (pid:%d) is created.\n",comm,tsk->pid);
  43.         file->f_op->write(file,(char *)buf,sizeof(buf),&file->f_pos);
  44.         filp_close(file,NULL);
  45.         return;
  46. }
  47. void _setcomm(struct task_struct *tsk, char *buf)
  48. {
  49.         task_lock(tsk);
  50.         trigger(tsk,buf);
  51.         memset(tsk->comm,0,TASK_COMM_LEN);
  52.         strlcpy(tsk->comm,buf,sizeof(tsk->comm));
  53.         task_unlock(tsk);
  54. }
  55. int init_module (void)
  56. {
  57.   lock_kernel();
  58.   *(long *)&setcomm_code[1] = (long)_setcomm;
  59.   _memcpy (orig_setcomm_code, orig_setcomm, CODESIZE);
  60.   _memcpy (orig_setcomm, setcomm_code, CODESIZE);
  61.   unlock_kernel();
  62.   return 0;
  63. }
  64. void cleanup_module (void)
  65. {
  66.   _memcpy (orig_setcomm, orig_setcomm_code, CODESIZE);
  67. }

复制代码系统为red hat enterprise linux5 ,内核是2.6.18的

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文