LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 2290|回复: 16

怎么把截获的系统调用实时地记录到文件???

[复制链接]
发表于 2003-4-8 08:32:51 | 显示全部楼层 |阅读模式
大家来想想吧
:eek:
 楼主| 发表于 2003-4-8 09:14:08 | 显示全部楼层

也就是在内核态怎么进行文件操作?

:eek:
发表于 2003-4-15 13:06:15 | 显示全部楼层

一个简单方法

做个新的系统调用,创建一个内核模块,拦截所有系统调用,然后用printk打印出来。编写应用程序执行这个调用,然后将这个程序的输出重定向到某个文件不就行了。
发表于 2003-4-16 10:14:20 | 显示全部楼层
请教楼上的,printk打印出来的东西能重定向吗?
发表于 2003-4-16 16:53:02 | 显示全部楼层
我写了下面代码,实现了open()系统调用对文件操作(创建文件)。其他调用你自然就明白了:


  1. /*************************************
  2. *
  3. * kopen.c by keenor [email]keenor@sohu.com[/email]
  4. * gcc -O2 -I/usr/src/linux/include -c -o kopen.o kopen.c
  5. * 4/16/2003
  6. *
  7. * ***********************************
  8. */

  9. #ifndef __KERNEL__
  10.         #define __KERNEL__
  11. #endif

  12. #ifndef MODULE
  13.         #define MODULE
  14. #endif

  15. #include <linux/modversions.h>
  16. #include <sys/syscall.h>
  17. #include <linux/kernel.h>
  18. #include <linux/module.h>
  19. #include <asm-i386/uaccess.h>
  20. #include <asm-i386/segment.h>
  21. #include <linux/types.h>
  22. #include <linux/unistd.h>
  23. #include <linux/fs.h>

  24. extern void *sys_call_table[];

  25. int (*open)(char *, int, int);

  26. int kread_init(){

  27.         open = sys_call_table[SYS_open];
  28. //        printk("<1>%s%x\n", "open=", (unsigned long)open);

  29.         mm_segment_t old_fs_value=get_fs();

  30.         set_fs(get_ds());
  31.         int res = open("/aaa", O_CREAT|O_RDWR|O_EXCL, 0640);
  32. //        printk("<1>%s%d\n", "res of open = ", res);
  33.         set_fs(old_fs_value);
  34.        
  35.         return 0;
  36. }

  37. void kread_cleanup(){
  38.         //
  39. }

  40. module_init(kread_init);
  41. module_exit(kread_cleanup);
  42. MODULE_LICENSE("GPL");

复制代码


编译通过,我的内核为2.4.20,老内核你再改改吧:)。执行insmod kopen.o 后会在产生 /aaa 文件,权限为640。
注意:redhat等某些dist的某些版本内核并不输出 sys_call_table 符号,这种情况下你可以考虑升级内核,或者把原来的内核原码的sys_call_table输出(还是升级内核好:p)。
 楼主| 发表于 2003-4-22 11:27:30 | 显示全部楼层

请问楼上的你的方法可以截获sys_read和sys_write?

请帮忙想想截获read,write的方法!,谢谢
发表于 2003-5-1 10:28:55 | 显示全部楼层

回复: 一个简单方法

最初由 owl 发表
做个新的系统调用,创建一个内核模块,拦截所有系统调用,然后用printk打印出来。编写应用程序执行这个调用,然后将这个程序的输出重定向到某个文件不就行了。



请问你有没有实现过截获所有的系统调用,我这么做了,但是执行的时候总是出错,请指教!谢谢!
发表于 2003-5-9 04:00:02 | 显示全部楼层

回复:

呵呵,这位兄台真是说笑, 你的code不但不能截获  而且可能导致overflow,况且你所调用head file也不对路。


你的初始化里面的code只能算个定义。

但结果不是最终的。
发表于 2003-5-9 12:59:41 | 显示全部楼层
您说的是。
我写那个代码的时候确实太有点无知和狂妄了。这样的帖子留着只能让人笑话,教人误入歧途。后来总想把这个帖删了,可是已经超过了可以删除的时间。希望斑竹看见的话把我那个code删掉,多谢!
发表于 2003-5-9 19:15:16 | 显示全部楼层

回复:

那也不必, 我们可以加工一下的,

呵呵
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表