Kprobes를 사용한 Linux Kernel Hooking (1) :: 2008/03/06 12:48



Kprobes는 Linux 커널을 hooking하여, 동적으로 프로브(Probe)를 심을 수 있게 해 주는 기술입니다. Solaris 진영에서는 이와 유사한 기술로 Dtrace라는 것을 제공하고 있습니다만, 아직까지는 리눅스에는 그에 필적할 정도의 커널 hooking/probing 메커니즘은 없습니다. Dtrace는 D라는 프로그래밍 언어까지 제공하고 있죠. 최근 Dprobes와 같이 좀 더 동적인 probing 기술을 개발하고 있는 것 같습니다만, 거기까지는 공부해 보지 못했습니다.

커널 후킹을 하기 위해서는 커널 모듈(kernel module)이라는 것을 만들어야 합니다. 커널 모듈을 만드는 것은 그다지 어려운 일이 아닙니다. 레드햇이라면 우선 kernel-devel 이라는 RPM이 설치되어 있어야 합니다. 그 RPM이 설치되어 있다고 치고, 다음과 같은 Makefilie을 만듭니다.

# Makefile
#
#
# make -C path/to/kernel/src M=`pwd` modules

obj-m := kprobebio.o

위의 Makefile은 kprobebio.c라는 커널 모듈 소스 코드를 컴파일하기 위한 것입니다. 이 소스 코드와 이 Makefile이 있을 때, 다음과 같이 make를 때리게 되면 이제 모듈 코드가 컴파일됩니다.

%> make  -C /lib/modules/`uname -r`/build M=`pwd` modules

모듈 코드를 만드는 것도 크게 어려운 일은 아닙니다. 다음과 같은 기본 골격을 가지면 됩니다.

#include <linux/module.h>
...
int init_module(void)
{
...
}

void cleanup_module(void)
{
...
}

MODULE_LICENSE("GPL");

init_module()은 커널 모듈을 초기화하는 작업을 정의하는 함수입니다. cleanup_module()은 반대로 커널 모듈을 메모리에서 내릴 때 필요한 정리 작업을 정의하는 함수입니다. 이 함수들을 입맛에 맞게 고쳐서, 나름대로의 커널 모듈을 정의할 수 있습니다. 컴파일이 끝난 모듈을 커널에 붙이려면 다음과 같이 하면 됩니다.

%> /sbin/insmod kprobebio.ko

이렇게 하면 커널 모듈을 커널에 붙여 돌릴 수 있습니다.

자. 이제 커널 모듈을 만드는 방법을 알았으니, 실제로 커널 모듈과 KProbes를 사용해 Linux 커널을 후킹하는 방법을 살펴보겠습니다. 그런데, 커널을 후킹하려면, 커널에 어떤 함수들이 존재하는지를 알 필요가 있습니다. 그런데, 커널에 존재하는 함수의 종류와 이름은 커널 버전마다 조금씩 차이가 나는데다 굉장히 많기 때문에, 꼼꼼히 살펴보려고 작정하고 달려들더라도 분석 자체가 힘겹습니다. 커널 소스를 받아서 설치한다고 해도, 그 코드를 vi로 일일이 브라우징하다 보면 곧 포기하게 되죠. ctags같은것을 활용하려고 해도, 코드 자체가 너무 방대해서 무리일 때가 많아요.

그러므로, 커널 소스가 올라오는 웹 사이트를 참고하는 것이 좋습니다. http://lxr.linux.no/ 같은 사이트가 그 중 가장 쓸만한 사이트입니다. 이 사이트에 접속하면 첫 화면에 Browse the code라는 섹션이 있습니다. 이 사이트에서 Linux 2.6.11 and Later 링크를 클릭하면 버전에 맞는 소스 코드를 브라우징 할 수 있습니다. 이 사이트에는 이것 말고도 다양한 버전의 OS 소스 코드가 있습니다. 이 사이트의 좋은 점은, 함수 이름에 대해 인덱스가 걸려 있어서, 링크를 따라 브라우징이 가능하다는 점입니다. 가령 어떤 함수의 실제 코드를 보고 싶으면, 그 함수가 사용된 곳에서 함수 이름을 클릭하면 됩니다. 그러면 그 함수가 정의된 곳으로 데려다 주죠. 같은 이름의 함수가 많을 경우에는 그 함수들의 목록을 보여줍니다. 그 중에서 하나를 고르면 됩니다.

각설하고, 다음은 Kprobes 관련된 자료 중 쓸만한 것들입니다.

1. kprobes를 사용한 커널 디버깅
2. Linux Technology Center: Kernel Probes
3. Kprobes를 사용한 커널 디버깅
4. Gaining insight into the Linux® kernel with Kprobes
5. Linux Kernel Documentation :: kprobes.txt

기타 커널 관련 자료들 중에 봐두면 좋을 것들
1. Linux Kernel : The linkely/unlikely macros

Kprobes 로 심을 수 있는 커널 프로브로는 Kprobe, Jprobe, Kretprobe 등이 있습니다. 이들 각각은 그 용도가 조금씩 다릅니다. Kprobe는 가장 일반적인 프로브로, 특정한 커널 함수가 호출되기 전에 호출됩니다. Jprobe는 같은 용도이긴 한데, 함수에 전달되는 인사들 까지 검사할 수 있습니다. Kretprobe는 함수의 반환값을 알아보기 위한 프로브입니다. 저는 주로 Jprobe를 사용하여 커널을 후킹하고, 함수 인자값을 검사하는 작업을 했습니다. Jprobe를 잘 활용하면, 커널에 대한 디버깅도 OS 중단 없이 해나갈 수 있습니다. prink같은 것을 코드 안에 일일이 삽입해야 할 필요도 줄어들기 때문에 더 편합니다.

다음 글에서는, 실제로 이들 프로브들을 사용해 커널을 후킹하는 방법과 그 사례를 살펴보겠습니다.









 

트랙백 주소 :: http://www.buggymind.com/trackback/113
성함
비밀번호
홈페이지 비밀글로
< PREV |  1  |  ...  64  |  65  |  66  |  67  |  68  |  69  |  70  |  71  |  72  |  ...  155  |  NEXT >