맥커널을 공부하기에 앞서 겸사겸사 리눅스 커널부터 공부를 시작한다.
Linux ubuntu 4.15.0-66-generic #75~16.04.1-Ubuntu SMP Tue Oct 1 14:01:08 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux
환경에서 테스트를 진행하였다.
모든 것의 시작은 hello_world
이다라고 생각하니 이러한 기능을 하는 모듈을 하나 만들어보도록 하자!
static int __init hello_init(void) {
printk("hello_init() hello world!\n");
return 0;
}
static void __exit hello_exit(void) {
printk("hello_exit() bye wolrd..\n");
}
module_init(hello_init);
module_exit(hello_exit);
자, 일단 코드부터 보고 익혀가보자.
hello_init
은 모듈이 커널에 삽입되었을 때 실행되는 함수이다.
hello_exit
는 모듈이 커널에서 제거되었을 대 실행되는 함수이다.
이는 module_init
, module_exit
로 함수를 지정해주었고, __init
, __exit
키워드를 이용하였기 때문이다.
이 키워드들을 사용하지 않고 다음과 같이 표현할 수도 있다.
static int init_module(void)
static void cleanup_module(void)
init_module
과 cleanup_module
은 지정되어 있는 함수 명이다.
어쨋든, 코드를 살펴봤을 때 적재시 hello world!
, 삭제시 bye world..
가 출력될 것이다.
이를 확인해보기 위해 모듈을 컴파일해보자.
컴파일은 아래의 Makefile
을 작성하여 진행하였다.
obj-m+= hello.o
hello:
make -C /lib/modules/$(shell uname -r)/build M=$(pwd) modules
clean:
make -C /lib/modules/$(shell uname -r)/build M=$(pwd) clean
여기서, /lib/modules/$(shell uname -r)/build
는 현재 커널이 빌드되어 있는 디렉토리이다.
이렇게 make hello
를 진행하면 hello.ko
파일이 보일텐데 이것이 컴파일된 모듈 파일이다.
modinfo
로 모듈의 정보를 확인할 수 있다.
이제 insmod
와 rmmod
를 이용하여 테스트해보자!
커널 로그는 dmesg
명령어로 확인할 수 있다.
ubuntu@ubuntu:~/kernel_ex$ sudo insmod hello.ko
ubuntu@ubuntu:~/kernel_ex$ sudo rmmod hello.ko
ubuntu@ubuntu:~/kernel_ex$ dmesg
또한, lsmod | grep hello
'system > material' 카테고리의 다른 글
kernel debugging with vmware (0) | 2019.11.17 |
---|---|
peda special instruction (0) | 2019.11.11 |
return-to-dynamic-linker (0) | 2019.11.07 |
unsortedbinbin_attck died.. (0) | 2019.11.05 |
linux file structure attack (0) | 2019.10.28 |