【问题标题】:How to solve this compiler error如何解决此编译器错误
【发布时间】:2014-06-11 14:59:44
【问题描述】:

在尝试一些 FreeBSD 内核黑客攻击时,我在一个简单的钩子示例中遇到了错误。代码如下

*注意 - 我已按照许多人的建议添加了 #include <sys/stat.h>,但仍然出现相同的错误。

#include <sys/types.h>
#include <sys/param.h>
#include <sys/proc.h>
#include <sys/module.h>
#include <sys/sysent.h>
#include <sys/kernel.h>
#include <sys/systm.h>
#include <sys/syscall.h>
#include <sys/sysproto.h>
#include <sys/stat.h>

static int mkdir_hook(struct thread *td, void *syscall_args) {

  struct mkdir_args *uap;
  uap = (struct mkdir_args *)syscall_args;
  char path[255];
  size_t done;
  int error;
  error = copyinstr(uap->path, path, 255, &done);
  if(error != 0)
    return (error);

  uprintf("hooked it\n");
  return (mkdir(td, syscall_args));
}

static int load(struct module *module, int cmd, void *arg) {
  int error = 0;
  switch(cmd){
  case MOD_LOAD:
    sysent[SYS_mkdir].sy_call = (sy_call_t *)mkdir_hook;
    break;
  case MOD_UNLOAD:
    sysent[SYS_mkdir].sy_call = (sy_call_t *)mkdir;
    break;
  default:
    error = EOPNOTSUPP;
    break;
  }
  return(error);
}

static moduledata_t mkdir_hook_mod = {
  "mkdir_hook",
  load,
  NULL
};

DECLARE_MODULE(mkdir_hook, mkdir_hook_mod, SI_SUB_DRIVERS, SI_ORDER_MIDDLE);

编译错误是

    mkdirhook.c:23:11: error: implicit declaration of function 'mkdir' is invalid in C99 [-Werror,-Wimplicit-function-declaration]
  return (mkdir(td, syscall_args));
          ^
1 error generated.
*** Error code 1

我猜这是一个简单的问题,我使用的代码示例已经过时了。

【问题讨论】:

  • 包括sys/stat.h.
  • 认为您正在尝试破解操作系统内核是很可怕的。
  • @RSahu - 我不是恶意什么的;这只是一种有趣的学习方式。
  • @Roge 很高兴知道 :) :)
  • @Roge 内核编程与用户空间编程非常不同。对于初学者,没有libc(请参阅下面的答案)。您应该从阅读 intro(9) 手册页开始。

标签: c kernel freebsd kernel-module


【解决方案1】:

您需要包含 sys/stat.h 才能使用 mkdir 功能。

#include &lt;sys/stat.h&gt;

【讨论】:

    【解决方案2】:

    implicit declaration of function 'mkdir' 是赠品...您正在尝试使用尚未原型化的函数 (mkdir())。 原型:#include &lt;sys/stat.h&gt;

    【讨论】:

      【解决方案3】:

      mkdir() 在 FreeBSD 上的 sys/stat.h 中定义。代码需要:

        #include <sys/stat.h>
      

      【讨论】:

        【解决方案4】:

        您不能在内核模块中使用mkdir

        mkdir 函数是标准 C 库 (libc) 的一部分,它只能用于用户空间程序,不能用于内核或模块代码!

        所以sys/stat.hmkdir 的定义位于#ifndef _KERNEL/#endif 块中,如果您正在编译内核模块,则不会“看到”。

        在 2011 年,所有系统调用都被赋予了 sys_ 前缀。 (另见this question的答案)所以你应该改用sys_mkdir

        【讨论】:

        • 过去是否可以在 FreeBSD 内核模块中使用 libc?我本来打算跟着 Joseph King 的书“设计 BSD Rootkits - 内核黑客入门”,但他的所有示例代码都在内核模块中使用 libc 函数。
        • 据我所知,这是不可能的。但有时在内核模式下可以使用类似名称的函数。例如。 malloc(9)。你提到的那本书现在已经七年了。我认为它有些过时了。例如。他正在使用的mkdir 现在可能被命名为sys_mkdir
        • @Roge 系统调用于 2011 年重命名以防止混淆。查看更新的答案。
        • 是的,情况确实如此——让它有点棘手,但我现在可能知道问题所在了。感谢您提供详尽的信息
        猜你喜欢
        • 1970-01-01
        • 2013-04-24
        • 2021-04-24
        • 2021-12-10
        • 2017-07-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-17
        相关资源
        最近更新 更多