2017-09-05 12 views
1

삽입 후 whoami 명령을 편집하는 커널 모듈을 구현 중이며 다음 내용의 Makefile로 컴파일 중입니다 :커널 모듈을 컴파일 한 후 오류가 발생했습니다. sys/syscall.h : 해당 파일이나 디렉토리가 없습니다.

obj-m+=holamundo.o 
obj-m+=acumulador.o 
obj-m+=cliente.o 
obj-m+=intercept.o 

all: 
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules 
clean: 
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean 

내 모듈 코드 :

#define MODULE 
#define __KERNEL__ 
#include <linux/module.h> 
#include <linux/kernel.h> 
#include </usr/src/kernels/linux/arch/x86/include/asm/unistd.h> 
#include <asm/unistd.h> 
#include <linux/unistd.h> 
#include <linux/syscalls.h> 
#include <sys/syscall.h> 
#include <asm/fcntl.h> 
#include <asm/errno.h> 
#include <linux/types.h> 
#include <linux/dirent.h> 
#include <linux/mman.h> 
#include <linux/string.h> 
#include <linux/fs.h> 

extern void *sys_call_table[]; 
int (*orig_geteuid)(const char *path); 

int hacked_geteuid(const char *path) { 
return 78; 
} 

int init_module(void) { 

orig_geteuid = sys_call_table[SYS_geteuid32]; 

sys_call_table[SYS_geteuid32] = hacked_geteuid; 
return 0; 

} 

void cleanup_module(void) { 
    sys_call_table[SYS_geteuid32] = orig_geteuid; 
} 

내가 직면하고 문제는 내가 make 명령을 실행할 때 오류 얻을 수 있습니다 :

내가 코드에서 #include <sys/syscall.h>를 제거한 후

레드햇 7.3 리눅스 커널 4.12.10을 사용하고, 나는 다음과 같은 오류 얻을 :

/usr/src/kernels/intercept.c:27:31: error: ‘SYS_geteuid32’ undeclared (first use in this function) 
orig_geteuid = sys_call_table[SYS_geteuid32]; 
          ^
/usr/src/kernels/intercept.c:27:31: note: each undeclared identifier is reported only once for each function it appears in 
/usr/src/kernels/intercept.c: In function ‘cleanup_module’: 
/usr/src/kernels/intercept.c:35:17: error: ‘SYS_geteuid32’ undeclared (first use in this function) 
    sys_call_table[SYS_geteuid32] = orig_geteuid; 

아무도 알고 있나요을 제가 잘못하고 있는가?

+1

모듈을 빌드 할 때 커널 소스를 사용합니다. 사용자 공간의 포함 파일을 사용하면 안됩니다. userspace에서 – stark

+0

개의 파일 ??? – rainman

+1

커널에'sys /'헤더가 없습니다. 당신이 거기에서 무엇을 찾고 싶은지 확실하지 않습니다. 또한'#define MODULE'과'#define __KERNEL__'은 잘못되었습니다 :이 매크로들은 필요하다면 커널 빌드 시스템 (KBuild)에 의해 정의됩니다. ** 절대 경로 **를 사용하는'/ usr/src/kernels/linux/arch/x86/include/asm/unistd.h'를 포함하면 의심스러워 보입니다. 'asm/unistd.h'만으로 충분하지 않습니까? – Tsyvarev

답변

0

찾고있는 상수는 __NR_geteuid이며 asm/unistd.h으로 정의됩니다.

+0

프로그램이 오류없이 컴파일되지만,'insmod intercept.ko'와 함께 모듈을 삽입하려고하면 전체 OS가 차단되고 컴퓨터를 다시 시작해야합니다. : – rainman

+0

init 함수에서 sys_call_table의 주소를 출력하고 System.map과 비교하고 module_init 및 module_exit 호출을 표시하지 않습니다. – stark

+0

어떻게하면됩니까? – rainman