免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12345下一页
最近访问板块 发新帖
查看: 10999 | 回复: 46
打印 上一主题 下一主题

又遇到问题了,拦截sys_creat,为什么拦不到?创建文件的系统调用难道不是creat吗? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-07-21 15:50 |只看该作者 |倒序浏览
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
2 [报告]
发表于 2010-07-21 17:13 |只看该作者
也许直接算到open去了

SYSCALL_DEFINE2(creat, const char __user *, pathname, int, mode)
{
        return sys_open(pathname, O_CREAT | O_WRONLY | O_TRUNC, mode);
}

论坛徽章:
0
3 [报告]
发表于 2010-07-21 17:41 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
4 [报告]
发表于 2010-07-21 18:30 |只看该作者
改了源代码?哪个open的?

论坛徽章:
0
5 [报告]
发表于 2010-07-21 18:45 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
6 [报告]
发表于 2010-07-21 19:16 |只看该作者
不行啊,我不做任何判断直接在OPEN里return -1,然后输入touch命令依然会有文件被创建出来。
zonelight 发表于 2010-07-21 17:41

  1. # strace touch /tmp/test
  2. execve("/usr/bin/touch", ["touch", "/tmp/test"], [/* 52 vars */]) = 0
  3. brk(0)                                  = 0x60d000
  4. mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f57db8b5000
  5. access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
  6. open("/etc/ld.so.cache", O_RDONLY)      = 3
  7. fstat(3, {st_mode=S_IFREG|0644, st_size=154039, ...}) = 0
  8. mmap(NULL, 154039, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f57db88f000
  9. close(3)                                = 0
  10. open("/lib/librt.so.1", O_RDONLY)       = 3
  11. read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\340\"\0\0\0\0\0\0"..., 832) = 832
  12. fstat(3, {st_mode=S_IFREG|0755, st_size=35656, ...}) = 0
  13. mmap(NULL, 2132976, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f57db490000
  14. mprotect(0x7f57db498000, 2093056, PROT_NONE) = 0
  15. mmap(0x7f57db697000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x7000) = 0x7f57db697000
  16. close(3)                                = 0
  17. open("/lib/libc.so.6", O_RDONLY)        = 3
  18. read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\320\354\1\0\0\0\0\0"..., 832) = 832
  19. fstat(3, {st_mode=S_IFREG|0755, st_size=1399984, ...}) = 0
  20. mmap(NULL, 3508264, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f57db137000
  21. mprotect(0x7f57db287000, 2093056, PROT_NONE) = 0
  22. mmap(0x7f57db486000, 20480, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x14f000) = 0x7f57db486000
  23. mmap(0x7f57db48b000, 18472, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7f57db48b000
  24. close(3)                                = 0
  25. open("/lib/libpthread.so.0", O_RDONLY)  = 3
  26. read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\300Y\0\0\0\0\0\0"..., 832) = 832
  27. fstat(3, {st_mode=S_IFREG|0755, st_size=131038, ...}) = 0
  28. mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f57db88e000
  29. mmap(NULL, 2208640, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f57daf1b000
  30. mprotect(0x7f57daf32000, 2093056, PROT_NONE) = 0
  31. mmap(0x7f57db131000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x16000) = 0x7f57db131000
  32. mmap(0x7f57db133000, 13184, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7f57db133000
  33. close(3)                                = 0
  34. mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f57db88d000
  35. mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f57db88c000
  36. arch_prctl(ARCH_SET_FS, 0x7f57db88d700) = 0
  37. mprotect(0x7f57db131000, 4096, PROT_READ) = 0
  38. mprotect(0x7f57db486000, 16384, PROT_READ) = 0
  39. mprotect(0x7f57db697000, 4096, PROT_READ) = 0
  40. mprotect(0x60b000, 4096, PROT_READ)     = 0
  41. mprotect(0x7f57db8b6000, 4096, PROT_READ) = 0
  42. munmap(0x7f57db88f000, 154039)          = 0
  43. set_tid_address(0x7f57db88d9d0)         = 313
  44. set_robust_list(0x7f57db88d9e0, 0x18)   = 0
  45. futex(0x7fff1ce8263c, FUTEX_WAKE_PRIVATE, 1) = 0
  46. futex(0x7fff1ce8263c, FUTEX_WAIT_BITSET_PRIVATE|FUTEX_CLOCK_REALTIME, 1, NULL, 7f57db88d700) = -1 EAGAIN (Resource temporarily unavailable)
  47. rt_sigaction(SIGRTMIN, {0x7f57daf20840, [], SA_RESTORER|SA_SIGINFO, 0x7f57daf2a010}, NULL, 8) = 0
  48. rt_sigaction(SIGRT_1, {0x7f57daf208d0, [], SA_RESTORER|SA_RESTART|SA_SIGINFO, 0x7f57daf2a010}, NULL, 8) = 0
  49. rt_sigprocmask(SIG_UNBLOCK, [RTMIN RT_1], NULL, 8) = 0
  50. getrlimit(RLIMIT_STACK, {rlim_cur=8192*1024, rlim_max=RLIM_INFINITY}) = 0
  51. brk(0)                                  = 0x60d000
  52. brk(0x62e000)                           = 0x62e000
  53. open("/usr/lib64/locale/locale-archive", O_RDONLY) = 3
  54. fstat(3, {st_mode=S_IFREG|0644, st_size=1740208, ...}) = 0
  55. mmap(NULL, 1740208, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f57db6e3000
  56. close(3)                                = 0
  57. open("/tmp/test", O_WRONLY|O_CREAT|O_NOCTTY|O_NONBLOCK, 0666) = 3
  58. dup2(3, 0)                              = 0
  59. close(3)                                = 0
  60. utimensat(0, NULL, NULL, 0)             = 0
  61. close(0)                                = 0
  62. close(1)                                = 0
  63. close(2)                                = 0
  64. exit_group(0)                           = ?
  65. root@platinum:~
  66. #
复制代码
就是调用的 open

再来看 touch 源码

  1. static bool                                                                           
  2. touch (const char *file)                                                              
  3. {                                                                                    
  4.   bool ok;                                                                           
  5.   int fd = -1;                                                                        
  6.   int open_errno = 0;                                                                 
  7.   struct timespec const *t = newtime;                                                
  8.                                                                                       
  9.   if (STREQ (file, "-"))                                                              
  10.     fd = STDOUT_FILENO;                                                               
  11.   else if (! (no_create || no_dereference))                                          
  12.     {                                                                                 
  13.       /* Try to open FILE, creating it if necessary.  */                              
  14.       fd = fd_reopen (STDIN_FILENO, file,                                             
  15.                       O_WRONLY | O_CREAT | O_NONBLOCK | O_NOCTTY,                     
  16.                       S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH);     
  17.                                                                                       
  18.       /* Don't save a copy of errno if it's EISDIR, since that would lead            
  19.          touch to give a bogus diagnostic for e.g., `touch /' (assuming               
  20.          we don't own / or have write access to it).  On Solaris 5.6,                 
  21.          and probably other systems, it is EINVAL.  On SunOS4, it's EPERM.  */        
  22.       if (fd == -1 && errno != EISDIR && errno != EINVAL && errno != EPERM)           
  23.         open_errno = errno;                                                           
  24.     }                                                                                 
复制代码
再来看 fd_reopen 的代码

  1. /* Open a file to a particular file descriptor.  This is like standard
  2.    `open', except it always returns DESIRED_FD if successful.  */     
  3.                                                                      
  4. int                                                                  
  5. fd_reopen (int desired_fd, char const *file, int flags, mode_t mode)  
  6. {                                                                     
  7.   int fd = open (file, flags, mode);                                 
  8.                                                                      
  9.   if (fd == desired_fd || fd < 0)                                    
  10.     return fd;                                                        
  11.   else                                                               
  12.     {                                                                 
  13.       int fd2 = dup2 (fd, desired_fd);                                
  14.       int saved_errno = errno;                                       
  15.       close (fd);                                                     
  16.       errno = saved_errno;                                            
  17.       return fd2;                                                     
  18.     }                                                                 
  19. }                                                                     
复制代码
也证实了的确是使用的 open 函数,但是否对应内核态的 sys_open 系统调用就不清楚了

论坛徽章:
0
7 [报告]
发表于 2010-07-21 19:34 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
8 [报告]
发表于 2010-07-21 19:41 |只看该作者
很奇怪,如果改了sys_open直接返回-1,整个文件系统都废了,估计系统都没法启动。

论坛徽章:
0
9 [报告]
发表于 2010-07-21 19:42 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
10 [报告]
发表于 2010-07-21 22:18 |只看该作者
当然不是,这个我都做好了,我规定我指定的文件夹里的东西。
zonelight 发表于 2010-07-21 19:42

我怀疑是你拦截错误造成的
你确定你判断路径的方法正确吗?是相对路径还是绝对路径?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP