#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
int main()
{
int fd;
char buf[1024];
int ret;
fd = open("test.c", O_RDONLY, 0666);
if ( fd < 0 ) {
perror("open");
exit(0);
}
while(1) {
ret = read(fd, buf, 1024);
if ( ret < 0 ) {
perror("read");
break;
}
else if (ret == 0 ) {
//perror("EOF !");
break;
}
else {
// write(1, buf, ret); // TODO : return value. check.
}
}
close(fd);
return 0;
}
프로그램이 하는일
일단, 위 프로그램은 현재 디렉터리에서 test.c 파일을 open()해서, open() 성공시에는 열심히, 읽어서 읽은 내용을 화면에 출력하지 않는다(주석처리했음). 라는 로직을 가지는 프로그램입니다.
테스트
1) LD_PRELOAD만 테스트
[몰라@거기 openHook]$ ls
Makefile libmy.so.1 myopen.c myopen.o test test.c test.o
[몰라@거기 openHook]$ export LD_PRELOAD=./libmy.so.1
[몰라@거기 openHook]$ ls >>2007-11-02 18:09:06 uid = 511 getcwd= /home/사용자명/Test/dlopen/openHook open '/proc/filesystems' file
>>2007-11-02 18:09:06 uid = 511 getcwd= /home/사용자명/Test/dlopen/openHook open '/proc/self/attr/current' file
Makefile libmy.so.1 myopen.c myopen.o open.o test test.c test.o
[몰라@거기 openHook]$
2) 예제도 테스트
[몰라@거기 openHook]$ ./test
>>2007-11-02 18:12:30 uid = 511 getcwd= /home/사용자명/Test/dlopen/openHook open 'test.c' file
>>2007-11-02 18:12:30 uid = 511 getcwd= /home/사용자명/Test/dlopen/openHook open 'test.c' file
[몰라@거기 openHook]$ ls
Makefile libmy.so.1 myopen.c myopen.o test test.c test.o
첫번째 테스트에서 ls가 open한 정보를 보여줍니다.
[몰라@거기 openHook]$ ls
>>2007-11-02 18:09:06 uid = 511 getcwd= /home/사용자명/Test/dlopen/openHook open '/proc/filesystems' file
>>2007-11-02 18:09:06 uid = 511 getcwd= /home/사용자명/Test/dlopen/openHook open '/proc/self/attr/current' file
특이할 만한것은 ls 라는 프로그램은 '/proc/filesystems'과 '/proc/self/attr/current'을 열고 있군요.
(저도 처음알았습니다.)
오픈한 시간은 위에 출력되고 있고, uid도 역시,...
myopen.c 의
fprintf(stderr, ">>%s uid = %d getcwd= %s open '%s' file\n", timeStr(), getuid(), get_current_dir_name(), path);
를 출력하는 부분을 판단로직 부분을 다른조건으로 이를 테면 uid가 0이면 열지말고 리턴한다던지... 하면 재미있는 상황이 벌어지겠지요.
끝으로,
$ export LD_PRELOAD=
하여 LD_PRELOAD 환경변수를 클리어 해야 할 경우를 만나게 될 수 있다는 조언입니다.
작은 보탬이 되기를 기대합니다.
참... OpenHook은 그냥 제가 만든 디렉터리일뿐 이런 오픈소스는 아마도 없을것으로 보입니다.
어플리케이션 수준이라면...
LD_PRELOAD 로 시작해보시지요.
메카니즘으로 보면 윈도우랑 비슷하니..
몇몇 한계가 있지만, 시작으로 좋아 보입니다.
그외 gdb등 디버거 프로그램을 보면 이런 유형에 도움이 많이 됩니다.
파일시스템 모니터링에는 tripwire , aide등 hids(호스트 기반 ids)류들도 보탬이 될 수 있을것입니다.
부록을 만들어
부록을 만들어 봤습니다.
잠시 기억을 더듬고 옛글도 보고해서리 ㅎㅎ
부록....
Makefile은 아래와 같습니다.
다음은 open() 함수만을 후킹한 경우입니다. myopen.c로 저장하세요
다음은 테스트 파일입니다. test.c로 저장
프로그램이 하는일
일단, 위 프로그램은 현재 디렉터리에서 test.c 파일을 open()해서, open() 성공시에는 열심히, 읽어서 읽은 내용을 화면에 출력하지 않는다(주석처리했음). 라는 로직을 가지는 프로그램입니다.
테스트
1) LD_PRELOAD만 테스트
[몰라@거기 openHook]$ ls
Makefile libmy.so.1 myopen.c myopen.o test test.c test.o
[몰라@거기 openHook]$ export LD_PRELOAD=./libmy.so.1
[몰라@거기 openHook]$ ls
>>2007-11-02 18:09:06 uid = 511 getcwd= /home/사용자명/Test/dlopen/openHook open '/proc/filesystems' file
>>2007-11-02 18:09:06 uid = 511 getcwd= /home/사용자명/Test/dlopen/openHook open '/proc/self/attr/current' file
Makefile libmy.so.1 myopen.c myopen.o open.o test test.c test.o
[몰라@거기 openHook]$
2) 예제도 테스트
[몰라@거기 openHook]$ ./test
>>2007-11-02 18:12:30 uid = 511 getcwd= /home/사용자명/Test/dlopen/openHook open 'test.c' file
>>2007-11-02 18:12:30 uid = 511 getcwd= /home/사용자명/Test/dlopen/openHook open 'test.c' file
[몰라@거기 openHook]$ ls
Makefile libmy.so.1 myopen.c myopen.o test test.c test.o
첫번째 테스트에서 ls가 open한 정보를 보여줍니다.
[몰라@거기 openHook]$ ls
>>2007-11-02 18:09:06 uid = 511 getcwd= /home/사용자명/Test/dlopen/openHook open '/proc/filesystems' file
>>2007-11-02 18:09:06 uid = 511 getcwd= /home/사용자명/Test/dlopen/openHook open '/proc/self/attr/current' file
특이할 만한것은 ls 라는 프로그램은 '/proc/filesystems'과 '/proc/self/attr/current'을 열고 있군요.
(저도 처음알았습니다.)
오픈한 시간은 위에 출력되고 있고, uid도 역시,...
myopen.c 의
fprintf(stderr, ">>%s uid = %d getcwd= %s open '%s' file\n", timeStr(), getuid(), get_current_dir_name(), path);
를 출력하는 부분을 판단로직 부분을 다른조건으로 이를 테면 uid가 0이면 열지말고 리턴한다던지... 하면 재미있는 상황이 벌어지겠지요.
끝으로,
$ export LD_PRELOAD=
하여 LD_PRELOAD 환경변수를 클리어 해야 할 경우를 만나게 될 수 있다는 조언입니다.
작은 보탬이 되기를 기대합니다.
참... OpenHook은 그냥 제가 만든 디렉터리일뿐 이런 오픈소스는 아마도 없을것으로 보입니다.
결국은..
직접 구현하시려나 보네요... 건투를... ;;
혹시나 해서 자료를 좀 찾아 보니.. inotify 란게 있었군요...
2.6.13 kernel 부터 포함된 것 같은데.. 참고해 보세요...
http://en.wikipedia.org/wiki/Inotify
http://linux.die.net/man/7/inotify
http://www-128.ibm.com/developerworks/linux/library/l-inotify.html
http://pyinotify.sourceforge.net/
되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』
되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』
oops, anonymous!
anonymous
------------------ P.S. --------------
지식은 오픈해서 검증받아야 산지식이된다고 동네 아저씨가 그러더라.
http://stackoverflow.com/ques
http://stackoverflow.com/questions/69859/how-could-i-intercept-linux-sys-calls
이걸 보시면 도움이 좀 될겁니다.
----
Let's shut up and code.
댓글 달기