커널 심볼테이블 질문
커널 심볼테이블에 대해서 공부하면서 아래와같은 실험을 해봤습니다(우분투 10.04에서)
먼저 kmalloc 을 char* 타입으로 캐스팅해서
그 주소를 찍고, 거기서부터 200바이트를 덤프를 떠봤습니다.(kmalloc 의 바이너리코드를 확인해보려고)
그리고 kallsyms 에서 kmalloc 을 grep 해봤습니다.
그랬더니 모듈상에서 찍힌 kmalloc 의 가상주소가
심볼테이블상에 없습니다
1. 왜 실제로 kmalloc 함수포인터의 주소를 찍은값이 커널심볼테이블상에 없을까요? 제가뭔가 착각하는걸까요?
2. kmalloc 의 덤프를 olly 로 분석해봤더니
시작하자마자 스택프레임잡고 어떤 다른 주소를 CALL 하는거같더군요(E8 A3 58 69 DE 이부분 -> CALL 0xde...)
(올리가 해석못한 명령도 있긴했는데) 저 call 되는 주소를 다시 덤프찍어보고싶은데
상대 offset 이 사용될것이므로 쉽게 따라가기가 어렵더군요...
혹시 kmalloc 과정이 수행되는 전체 어셈블리를 얻기 쉬운 방법 없을까요??
[ 4916.313882] module loaded
[ 4922.251146] kmalloc : e1b6a0f0
[ 4922.251152] 55 89 E5 0F 1F 44 00 00 E8 A3 58 69 DE 5D C3 90 04 00 00 00 14 00 00 00 03 00 00 00 47 4E 55 00 4F 61 76 C3 6C 02 A9 4C 7B 24 0D 6D F0 A6 A8 49 8C 5E 71 ED 6D 6F 64 75 6C 65 20 75 6E 6C 6F 61 64 65 64 0A 20 00 6D 6F 64 75 6C 65 20 6C 6F 61 64 65 64 0A 20 00 6B 6D 61 6C 6C 6F 63 20 3A 20 25 78 0A 00 25 30 32 58 20 00 0A 00 54 68 69 73 20 69 73 20 6D 79 5F 66 75 6E 63 28 29 0A 20 00 74 65 73 74 5F 76 61 6C 20 3D 20 25 64 00 45 6E 64 20 6F 66 20 6D 79 5F 66 75 6E 63 28 29 0A 20 00 00 00 00 B0 A0 B6 E1 A0 A1 B6 E1 7E 7A 05 EA 6D 79 5F 66 75 6E 63 00 07 A0 B6 E1 28 A0 B6 E1 B7 A0 B6 E1 F4 A0 B6 E1
root@declspec-desktop:/home/declspec/module_test# cat /proc/kallsyms | grep kmalloc
c01016e0 t trace_kmalloc
c0118a00 t trace_kmalloc
c0119d10 t trace_kmalloc
c0133f10 t trace_kmalloc
c017dd80 t trace_kmalloc
... 생략.
arm-objdump -o
arm-objdump -o kmalloc_related.o 하면 어셈블리를 볼 수 있습니다.
1. (kprobe_opcode_t *) 캐스팅한
1. (kprobe_opcode_t *) 캐스팅한 뒤에 확인해보시기 바랍니다.
2. kmalloc 함수에 브레이크 포인트를 걸어서 디버깅 해보시기 바랍니다.
RET ;My life :P
댓글 달기