메모리 트래커 with Syscall Hooking
·
Linux
실시간으로 프로세스의 메모리를 추적하는 툴을 제작을 25년 2월부터 시작했다.처음에는 ptrace를 활용해서 추적하려했으나 생각하는대로 동작하지 않았고, 실시간성이 없었다...그렇게 지지부진한 상태로 있다가, 커널에 관심이 생겼고 공부를 시작했다. 그래서 차라리 메모리 관련 시스템콜brk, mmap, munmap이 발생하면 유저 스페이스로 전달해주도록커널 소스를 수정했다. 또, 커널 -> 유저 데이터 전달이 이뤄져야하기 때문에어떻게 하지? 생각하다가 Netlink-Socket이 있다는걸 알았고 사용했다. 커널에 netlink-socket 내부 모듈을 작성했다.https://c-pointers.com/lsp/Netlink/Netlink/Basic_example/Basic_example.html Basic ..
프로세스 생성 분석 fork (태스크 복사 및 초기화 부분) - 2
·
Linux
fork가 호출되면 결국 kernel_clone이 호출된다는 사실을 알았다.kernel_clone에서는 kernel_clone_args, pt_regs 등등 구조체를 많이 사용하는데,어떤 구조체인지 알아보자. (코드가 너무 긴건, linux 깃헙 링크로 대체한다) 일단 kernel_clone에서는 전달받은 kernel_clone_args를 다른 함수의 인자로 많이 넘긴다.pid_t kernel_clone(struct kernel_clone_args *args){ u64 clone_flags = args->flags; struct completion vfork; struct pid *pid; struct task_struct *p; int trace = 0; pid_t nr; if ((clone_flags..
프로세스 생성 분석 fork(콜 스택) - 1
·
Linux
fork ↓ call __sys_ret(sys_fork()) ↓ call sys_fork()에서 __NR_clone일때, return my_syscall5(__NR_clone, SIGCHLD, 0, 0, 0, 0); 반환(ARM64는 __NR_fork가 아니라, __NR_clone임) my_syscall5는 이렇게 정의되어있음.#define my_syscall5(num, arg1, arg2, arg3, arg4, arg5) \({ \ register long _num __asm__ ("x8") = (num); ..
커널에서 static inline 함수선언과 wrapping
·
Linux
static inline드라이버 분석중에특정 함수 호출을 추적해보니 다른 파일에서 static inline으로 선언되어있는걸 알았다. 예를 들어서,mem.c에서 register_chrdev를 호출,register_chrdev를 추적해보니 다른 include/linux/fs.파일에서 static inline으로 선언됨. inline키워드를 붙이면, 컴파일시에 코드 자체를 호출장소에 삽입.즉, register_chrdev가 호출된 장소에 register_chrdev코드 자체를 삽입.이 코드 삽입 자체가 compile time에 이뤄져야해서 .h에 선언됨. static 키워드를 붙이면, 다른 파일에서 사용이 불가능하지만, inline 키워드로 코드 자체를 삽입하기때문에문제 없다.왜?성능 최적화와 코드 안전성..
linux/drivers/char/mem.c 드라이버 분석
·
Linux
https://github.com/Jminu/linux/blob/master/drivers/char/mem.c linux/drivers/char/mem.c at master · Jminu/linuxLinux kernel source tree. Contribute to Jminu/linux development by creating an account on GitHub.github.com일단 mem.c의 코드를 보면그렇게 엄청나게 길지는 않다.그리고 구현이 가장 쉬운 문자 디바이스 드라이버라 분석이 그렇게 까다롭지 않을 것 같다. 일단 마지막 부분에 보이는 코드를 보자fs_initcall은 모듈을 시작하는 함수이다.fs_initcall을 좀 더 들어가보자. grep으로 긁었더니,이렇게 나오고, fs_ini..
objdump활용 vmlinux 분석시 start address의미
·
Linux
objdump로 vmlinux를 분석했을 때,start address가 0xffffffc080000000이다. 즉, 처음 vmlinux가 실행될 메모리 주소가 이미 정해진 것이나 마찬가지인데이게 어떻게 가능할까라는 생각이 들었다. 만약 이미 이 주소를 다른 프로세스가 사용중일 수 있지 않을까?라는 생각이 들었다.간단하게 말하면, 다른 프로세스가 사용중일리가 없다.objdump로 vmlinux를 분석할 때 보이는 start address는 물리 메모리 주소를 의미한다.Kernel은 부팅될 때 부트로더에 의해 약속된 위치에 로드되기 때문이다. 반면, 일반 응용 프로그램의 경우 start address는 가상 메모리 주소를 의미한다.미리 고정된 가상주소를 할당하고, 실제 실행시에 MMU에 의해 실제 메모리의 ..