핸들 테이블을 커널이 관리하니...또 난 잘 모른다. 일단 잘 아는거 부터 정리하고 FD를 풀어봐야겠다 ㅋㅋ 결국 이글은 FD 관련 글은 아니란 얘기...낚이지 마세요~아래와 같은 궁금증을 해소하기로 하였다.
1. 핸들은 커널이 관리하나 프로세스 마다 독립적으로 존재하는가?
=> 그렇다.
2. 그럼 프로세스 어디에 핸들테이블에 대한 정보가 존재한다는 것인데...어디에 있는가?
=> ??
3. 핸들테이블에 가면 실제 object 정보를 가져올 수 있는가?
=> ??
일단 제일 접근하기 쉬운 파일을 하나 열어서 확인해보았다.
int fd = open("c:\\test_hook\\1.txt, O_RDONLY); // fd = 3
HANDLE hFile = (void*)_get_osfhandle(fd); // hFile = 7e4
fd와 hFile 값은 다르다!!
windbg를 이용하여 user mode에서 hFile의 정보를 찾아보자
!handle commnad를 이용하여 정보를 보았으나...음 포인터가 있어보이진 않는다.
kernel mode로 가보자. 커널이 궁금하다 ㅎ
.attach -k로 커널로 change!!
!process 0 0 커멘드로 프로세스 리스트에서 testc.exe를 찾았다.
EPROCESS 주소가 89C42188임을 알수 있다. EPROCESS를 뒤져보자
^^어라 핸들테이블 역시 eprocess 프로세스의 모든것이 들어있다 ㅋ
내가 생각한 핸들테이블이 맞는지 고고
_HANDLE_TABLE은 이렇게 생겼군요... 실제 포인터는 어디에 있는걸까요?
TableCode가 실제 핸들테이블 주소라고 하네요
실제 핸들테이블 메모리와 !handle을 이용한 값을 비교해볼까요~?
핸들값이 순차적으로 올라가는게 비슷해보이네요 근데 왜 다 free handle이고 앞에 값들이 다 0네요..이렇게 아까 열었던 1.txt파일 핸들 7e4를 찾아서 비교해보면
핸들이 4씩 커지고 있으므로 계산해보니 !handle에서 가리키는 Entry 값과 같은 위치에 정보가 존재하네요. GrantedAccess 값이 뒤 8바이트로 나타내지고 있는걸 볼수 있구요
앞에 있는 정보는 그럼 실제 object pointer인지 비교해보면 그건 약간의 차이가 있네요...음...왜죠?? 실제 해더와 메모리에 있는 값과는 3?? 차이가 나네요...앗 fd값? ㅋㅋ 낚이면 안되요 아니겠죠 ㅎㅎ 여튼 핸들테이블에서는 관련정보가 잇다는걸 확인하고 실제 _FILE_OBJECT는 !handle 에 있는 Object값으로 확인해보겠습니다.
FileName이 제대로 들어가 있는거 보니 확실하네요.
댓글 없음:
댓글 쓰기