최신목록

2016년 4월 8일 금요일

[WinDbg]PROCESS와 HANDLE과 OBJECT

testc.exe에서 open 함수로 파일을 열었다. 윈도우 개발자인 나는 c코딩에 익숙하지 않다 win32 api에 익숙하다. fd를 리턴해준다. file descriptor...음...security descriptor는 많이 사용하나..fd는 왠지 아는거 같으면서도 핸들도 아니고 뭐지?? 의문이 꼬리를 물어 찾아봤더니 윈도우의 핸들과 비슷한 거라하여 테스트 해보니 핸들값과는 또 달랐다...음..뭔가 명확하지 않다. 일단 핸들부터는 내가 익숙하고 잘 안다 생각했는데...잘 생각해보니...핸들은...
핸들 테이블을 커널이 관리하니...또 난 잘 모른다. 일단 잘 아는거 부터 정리하고 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이 제대로 들어가 있는거 보니 확실하네요.

댓글 없음:

댓글 쓰기