Встроенный модуль ядра не включает ccflags -y - PullRequest
0 голосов
/ 17 июня 2020

Я использовал https://github.com/croemheld/lkm-rootkit
со следующим деревом под pwd

├── LICENSE<br>
├── Makefile<br>
├── README.md<br>
└── src<br>
    ├── core.c<br>
    ├── getdents_hook.c<br>
    ├── headers<br>
    │   ├── core.h<br>
    │   ├── getdents_hook.h<br>
    │   ├── module_hiding.h<br>
    │   ├── network_keylog.h<br>
    │   ├── packet_hiding.h<br>
    │   ├── port_knocking.h<br>
    │   ├── privilege_escalation.h<br>
    │   ├── server.h<br>
    │   └── socket_hiding.h<br>
    ├── include<br>
    │   ├── headers<br>
    │   │   └── utils.h -->this is where the error happens<br> 
    │   └── utils.c<br>
    ├── libs<br>
    │   ├── headers<br>
    │   │   └── syscalltable.h<br>
    │   └── syscalltable.c<br>
    ├── module_hiding.c<br>
    ├── network_keylog.c<br>
    ├── packet_hiding.c<br>
    ├── port_knocking.c<br>
    ├── privilege_escalation.c<br>
    ├── server.c<br>
    └── socket_hiding.c<br>

6 directories, 25 files<br>

- -------------------------------------------------- ------
со следующим Makefile

# Module name
ROOTKIT     := rootkit

# Build
MODULEDIR   := /lib/modules/$(shell uname -r)
BUILDDIR    := $(MODULEDIR)/build
KERNELDIR   := $(MODULEDIR)/kernel

# Source files
SRCS_S      := src
LIBS_S      := src/libs
INCL_S      := src/include

# Header files
SRCS_H      := $(shell pwd)/$(SRCS_S)/headers
LIBS_H      := $(shell pwd)/$(LIBS_S)/headers
INCL_H      := $(shell pwd)/$(INCL_S)/headers


# Module
obj-m       := $(ROOTKIT).o

# Core
$(ROOTKIT)-y    += src/core.o

# Source
$(ROOTKIT)-y    += src/server.o
$(ROOTKIT)-y    += src/network_keylog.o
$(ROOTKIT)-y    += src/getdents_hook.o
$(ROOTKIT)-y    += src/socket_hiding.o
$(ROOTKIT)-y    += src/packet_hiding.o
$(ROOTKIT)-y    += src/port_knocking.o
$(ROOTKIT)-y    += src/privilege_escalation.o
$(ROOTKIT)-y    += src/module_hiding.o

# Libs
$(ROOTKIT)-y    += src/libs/syscalltable.o

# Include
$(ROOTKIT)-y    += src/include/utils.o

ccflags-y   := -I$(SRCS_H) -I$(LIBS_H) -I$(INCL_H)
subdir-ccflags-y    := -I$(SRCS_H) -I$(LIBS_H) -I$(INCL_H)
# Recipes
all:    print_file_vars
    $(MAKE) -C $(BUILDDIR) M=$(shell pwd) modules

load:
    insmod $(KERNELDIR)/net/ipv4/netfilter/nf_reject_ipv4.ko
    insmod $(KERNELDIR)/net/ipv6/netfilter/nf_reject_ipv6.ko
    insmod rootkit.ko

clean:
    $(MAKE) -C $(BUILDDIR) M=$(shell pwd) clean
print_file_vars:
    $(foreach v, $(.VARIABLES), $(info $(v) = $($(v))))

Но когда я sudo make, появляется ошибка:

 make[1]: Entering directory '/usr/src/linux-headers-4.15.0-106-generic'<br>
  CC [M]  /home/eric/Code/linux/module/lkm-rootkit/src/core.o
/home/eric/Code/linux/module/lkm-rootkit/src/core.c:1:19: fatal error: utils.h: No such file or directory
compilation terminated.<br>

Однако ccflags-y был установлен, путь include был добавлен в ccflags-y, может кто-нибудь мне помочь, милосердие

1 Ответ

0 голосов
/ 17 июня 2020

В ccflags-y для ссылки на «текущий» каталог (где находится ваш Makefile) используйте конструкцию $(src):

ccflags-y   := -I$(src)/src/headers

НЕправильно ссылаться на этот каталог с помощью $(shell pwd): когда модуль построен, текущий каталог относится к дереву сборки ядра , а не к каталогу с вашим Makefile.


Помните: ваш Makefile - это проанализировано дважды :

  1. Когда вы вызываете make из исходного каталога модуля.
  2. Когда выполняется строка $(MAKE) -C $(BUILDDIR) M=$(shell pwd) modules.

В первый раз ваш Makefile обрабатывается обычным способом, при этом pwd расширяется до исходного каталога модуля . В этот раз Make выполняет all цель и любую другую цель, от которой зависит. Например, в этот раз Make выполняет вашу цель print_file_vars, которая выводит значение переменной SRCS_H, и вы обнаруживаете, что эта переменная правильная.

Второй раз ваш Makefile обрабатывается как часть большего Makefile с pwd расширен до каталога сборки ядра . Используются только временные переменные obj-m, ccflags-y и другие переменные, например *-m или *-y, поэтому вы не можете использовать pwd для этих переменных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...