windows handle 의 비밀 2
DESCRIPTION
Windows Handle 의 비밀 Windows Handle의 역할 및 커널 내부 구조에 대한 여러 실험한 내용을 공유한다.TRANSCRIPT
![Page 1: Windows handle 의 비밀 2](https://reader034.vdocuments.net/reader034/viewer/2022050805/5597a2e21a28abc9218b46dc/html5/thumbnails/1.jpg)
Windows Handle 의 비밀
미친감자 김주생
Visual C++ MS MVP
2013년 7월 13일 발표
![Page 2: Windows handle 의 비밀 2](https://reader034.vdocuments.net/reader034/viewer/2022050805/5597a2e21a28abc9218b46dc/html5/thumbnails/2.jpg)
핸들이 뭐냐?
![Page 3: Windows handle 의 비밀 2](https://reader034.vdocuments.net/reader034/viewer/2022050805/5597a2e21a28abc9218b46dc/html5/thumbnails/3.jpg)
![Page 4: Windows handle 의 비밀 2](https://reader034.vdocuments.net/reader034/viewer/2022050805/5597a2e21a28abc9218b46dc/html5/thumbnails/4.jpg)
![Page 5: Windows handle 의 비밀 2](https://reader034.vdocuments.net/reader034/viewer/2022050805/5597a2e21a28abc9218b46dc/html5/thumbnails/5.jpg)
![Page 6: Windows handle 의 비밀 2](https://reader034.vdocuments.net/reader034/viewer/2022050805/5597a2e21a28abc9218b46dc/html5/thumbnails/6.jpg)
“System” 이분이 바로 커널 서비스를 해주시는
분이십니다. 안녕하세요~”System”님 보통 “커널”이라고도 하죠~
ㅊ
![Page 7: Windows handle 의 비밀 2](https://reader034.vdocuments.net/reader034/viewer/2022050805/5597a2e21a28abc9218b46dc/html5/thumbnails/7.jpg)
![Page 8: Windows handle 의 비밀 2](https://reader034.vdocuments.net/reader034/viewer/2022050805/5597a2e21a28abc9218b46dc/html5/thumbnails/8.jpg)
아..파일이 필요하시다구요 잠시만 기다려주세요.~
저 커널님아 저 파일좀 하나 만들어주세요~
KERNEL SERVICE LAND USER LAND
![Page 9: Windows handle 의 비밀 2](https://reader034.vdocuments.net/reader034/viewer/2022050805/5597a2e21a28abc9218b46dc/html5/thumbnails/9.jpg)
고객님~ 이 핸들만 있으면
파일을 사용하 실 수 있습니다. 자~ 받으세요~!
감사합니다. 커널님아~ 그럼 저는
이 핸들만 있으면 되는 거죠^^?
KERNEL SERVICE LAND USER LAND
![Page 10: Windows handle 의 비밀 2](https://reader034.vdocuments.net/reader034/viewer/2022050805/5597a2e21a28abc9218b46dc/html5/thumbnails/10.jpg)
파일을 하나 만들었더니..핸들을 넘겨줍니다.
핸들에는 어떤 값이 있을까요? 확인해 봅시다.
![Page 11: Windows handle 의 비밀 2](https://reader034.vdocuments.net/reader034/viewer/2022050805/5597a2e21a28abc9218b46dc/html5/thumbnails/11.jpg)
7cc 칠씨씨? 뭘까요??
![Page 12: Windows handle 의 비밀 2](https://reader034.vdocuments.net/reader034/viewer/2022050805/5597a2e21a28abc9218b46dc/html5/thumbnails/12.jpg)
자 이제 칠씨씨의비밀을 알아볼까요^^!!
![Page 13: Windows handle 의 비밀 2](https://reader034.vdocuments.net/reader034/viewer/2022050805/5597a2e21a28abc9218b46dc/html5/thumbnails/13.jpg)
499 번째 엔트리라는점
![Page 14: Windows handle 의 비밀 2](https://reader034.vdocuments.net/reader034/viewer/2022050805/5597a2e21a28abc9218b46dc/html5/thumbnails/14.jpg)
프로세스가 만들어지면 이 프로세스가 사용 하는
커널 오브젝트 장부(Table)를 하나 가지고 있다.
![Page 15: Windows handle 의 비밀 2](https://reader034.vdocuments.net/reader034/viewer/2022050805/5597a2e21a28abc9218b46dc/html5/thumbnails/15.jpg)
프로세스가 생성되면 커널에서는 해당 프로세스를 관리하기 위해 _EPROCESS 에 정보를 저장합니다. 그리고, 핸들정보도 이곳에 있습니다.
![Page 16: Windows handle 의 비밀 2](https://reader034.vdocuments.net/reader034/viewer/2022050805/5597a2e21a28abc9218b46dc/html5/thumbnails/16.jpg)
_EPROCESS 안에 핸들테이블인 ObjectTable 필드가 있죠^^!?
![Page 17: Windows handle 의 비밀 2](https://reader034.vdocuments.net/reader034/viewer/2022050805/5597a2e21a28abc9218b46dc/html5/thumbnails/17.jpg)
ObjectTable의 이 값이 의미하는 것은 무엇일까? 음..
구조체 _HANDLE_TABLE의 주소라는 것~!
![Page 18: Windows handle 의 비밀 2](https://reader034.vdocuments.net/reader034/viewer/2022050805/5597a2e21a28abc9218b46dc/html5/thumbnails/18.jpg)
구조체 _HANDLE_TABLE에는 각종 핸들테이블 정보가 들어 있습
니다.
![Page 19: Windows handle 의 비밀 2](https://reader034.vdocuments.net/reader034/viewer/2022050805/5597a2e21a28abc9218b46dc/html5/thumbnails/19.jpg)
바로 이 값이 핸들엔트리가 저장되어 있는 시작 위치 입니다.
![Page 20: Windows handle 의 비밀 2](https://reader034.vdocuments.net/reader034/viewer/2022050805/5597a2e21a28abc9218b46dc/html5/thumbnails/20.jpg)
Table Code
Handle/4
엔트리 크기(8)
Table Entry 주소
0xe10b9000 + 0x7cc/4 * 8 = 0xe10b9f98
![Page 21: Windows handle 의 비밀 2](https://reader034.vdocuments.net/reader034/viewer/2022050805/5597a2e21a28abc9218b46dc/html5/thumbnails/21.jpg)
4byte
Handle Entry 모양~(총 8bytes)
닫 힘 보 호
상속가능여부
닫힘감시여부
Object Header 포인터
Access Mask
32bit(4byte)
![Page 22: Windows handle 의 비밀 2](https://reader034.vdocuments.net/reader034/viewer/2022050805/5597a2e21a28abc9218b46dc/html5/thumbnails/22.jpg)
닫 힘 보 호
상속가능여부
닫힘감시여부
Object Header 포인터
Access Mask
![Page 23: Windows handle 의 비밀 2](https://reader034.vdocuments.net/reader034/viewer/2022050805/5597a2e21a28abc9218b46dc/html5/thumbnails/23.jpg)
_OBJECT_TYPE 을 통해앻 개체의 종류를 알 수 있습니다.
![Page 24: Windows handle 의 비밀 2](https://reader034.vdocuments.net/reader034/viewer/2022050805/5597a2e21a28abc9218b46dc/html5/thumbnails/24.jpg)
File 개체임을 알 수 있군요! 자 이제 제가 만들었던
Myfile.txt 파일인지를 알아보면 되겠군요…
![Page 25: Windows handle 의 비밀 2](https://reader034.vdocuments.net/reader034/viewer/2022050805/5597a2e21a28abc9218b46dc/html5/thumbnails/25.jpg)
개체 Header
개체 Body
그런데 Object는 머리와 몸통으로 되어 있습니다. 2등신~
![Page 26: Windows handle 의 비밀 2](https://reader034.vdocuments.net/reader034/viewer/2022050805/5597a2e21a28abc9218b46dc/html5/thumbnails/26.jpg)
개체 Header
개체 Body Header 대가리는 어떻게 생겼을까요?
![Page 27: Windows handle 의 비밀 2](https://reader034.vdocuments.net/reader034/viewer/2022050805/5597a2e21a28abc9218b46dc/html5/thumbnails/27.jpg)
개체 Header
개체 Body 헤더에 + 0X18를 해주면오브젝트 몸통!!!
![Page 28: Windows handle 의 비밀 2](https://reader034.vdocuments.net/reader034/viewer/2022050805/5597a2e21a28abc9218b46dc/html5/thumbnails/28.jpg)
오~~ 제가 만든 파일 맞네요~!!
+18 해주면..개체몸통이 되고요~ 몸톰을 확인해 보니~!!
![Page 29: Windows handle 의 비밀 2](https://reader034.vdocuments.net/reader034/viewer/2022050805/5597a2e21a28abc9218b46dc/html5/thumbnails/29.jpg)
윈디비지에서 !handle 하면 아주 친절하게 나온다!!!!
![Page 30: Windows handle 의 비밀 2](https://reader034.vdocuments.net/reader034/viewer/2022050805/5597a2e21a28abc9218b46dc/html5/thumbnails/30.jpg)
![Page 31: Windows handle 의 비밀 2](https://reader034.vdocuments.net/reader034/viewer/2022050805/5597a2e21a28abc9218b46dc/html5/thumbnails/31.jpg)
핸들은 32bit 자료형입니다.
하지만 32bit 전부를 사용하지 않습니다.
![Page 32: Windows handle 의 비밀 2](https://reader034.vdocuments.net/reader034/viewer/2022050805/5597a2e21a28abc9218b46dc/html5/thumbnails/32.jpg)
핸들이란 녀석(xp) 이렇게 생겨먹었다!!!
![Page 33: Windows handle 의 비밀 2](https://reader034.vdocuments.net/reader034/viewer/2022050805/5597a2e21a28abc9218b46dc/html5/thumbnails/33.jpg)
Tag 2bit 때문에 윈도우 핸들값은 4씩 증가한다.
048C048C048C048C048C
![Page 34: Windows handle 의 비밀 2](https://reader034.vdocuments.net/reader034/viewer/2022050805/5597a2e21a28abc9218b46dc/html5/thumbnails/34.jpg)
EPROCESS
TableCode
Top Level Pointers
0
31
Middle Level Pointers
0
1023
Sub Handle Table
0
511
![Page 35: Windows handle 의 비밀 2](https://reader034.vdocuments.net/reader034/viewer/2022050805/5597a2e21a28abc9218b46dc/html5/thumbnails/35.jpg)
핸들은 총 몇 개까지 만들 수 있을까요?
32 1024 511
16,744,448
천육백칠십사만사천사백사십팔개
![Page 36: Windows handle 의 비밀 2](https://reader034.vdocuments.net/reader034/viewer/2022050805/5597a2e21a28abc9218b46dc/html5/thumbnails/36.jpg)
과연 실제로 16,744,448개까지 핸들이 생성이 될까요? 실험해 봅시다~!
16,744,436개까지 생성이 되는군요.. 12개는왜…생성이 되지 않았을까요?
![Page 37: Windows handle 의 비밀 2](https://reader034.vdocuments.net/reader034/viewer/2022050805/5597a2e21a28abc9218b46dc/html5/thumbnails/37.jpg)
Table Code의 하위2비트가 수상하다!!~~!~
Table Code의 하위2비트가 Table Layer
![Page 38: Windows handle 의 비밀 2](https://reader034.vdocuments.net/reader034/viewer/2022050805/5597a2e21a28abc9218b46dc/html5/thumbnails/38.jpg)
Table Code
Sub Handle Table
0
511
0
511개까지는 Sub Handle Table로 충분!!!
![Page 39: Windows handle 의 비밀 2](https://reader034.vdocuments.net/reader034/viewer/2022050805/5597a2e21a28abc9218b46dc/html5/thumbnails/39.jpg)
Table Code
Sub Handle Table
0
511
0
511개까지는 Sub Handle Table로 충분!!!
Sub Handle Table을 직접 확인해봅시다. 메모리 구경하러 갑시다.
![Page 40: Windows handle 의 비밀 2](https://reader034.vdocuments.net/reader034/viewer/2022050805/5597a2e21a28abc9218b46dc/html5/thumbnails/40.jpg)
511개까지 저장 되는지 확인해보죠~
![Page 41: Windows handle 의 비밀 2](https://reader034.vdocuments.net/reader034/viewer/2022050805/5597a2e21a28abc9218b46dc/html5/thumbnails/41.jpg)
EPROCESS
Middle Level Pointers
0
1023
Sub Handle Table
0
511
Table Code
1
![Page 42: Windows handle 의 비밀 2](https://reader034.vdocuments.net/reader034/viewer/2022050805/5597a2e21a28abc9218b46dc/html5/thumbnails/42.jpg)
Table Code
Sub Handle Table
0
511 1
Sub Handle Table
0
511
Middle Level Pointers
0
1023
512번째 핸들은 정말 두번째 Sub handle Table에 생길까요?
![Page 43: Windows handle 의 비밀 2](https://reader034.vdocuments.net/reader034/viewer/2022050805/5597a2e21a28abc9218b46dc/html5/thumbnails/43.jpg)
EPROCESS
TableCode
Top Level Pointers
0
31
Middle Level Pointers
0
1023
Sub Handle Table
0
511 2
![Page 44: Windows handle 의 비밀 2](https://reader034.vdocuments.net/reader034/viewer/2022050805/5597a2e21a28abc9218b46dc/html5/thumbnails/44.jpg)
EPROCESS
TableCode
Top Level Pointers
0
31
Middle Level Pointers
0
1023
Sub Handle Table
0
511 2
자 그러면 Top Level Pointers를 만들어보시다. 1024 * 511 개 + 1개 을 만들면 되겠죠~
523265개
![Page 45: Windows handle 의 비밀 2](https://reader034.vdocuments.net/reader034/viewer/2022050805/5597a2e21a28abc9218b46dc/html5/thumbnails/45.jpg)
핸들이란 녀석(2000까지) 이렇게 생겨먹었다!!!
![Page 46: Windows handle 의 비밀 2](https://reader034.vdocuments.net/reader034/viewer/2022050805/5597a2e21a28abc9218b46dc/html5/thumbnails/46.jpg)
Handle Table
Top Level Pointers
0
255
Middle Level Pointers
0
255
Sub Handle Table
0
255
![Page 47: Windows handle 의 비밀 2](https://reader034.vdocuments.net/reader034/viewer/2022050805/5597a2e21a28abc9218b46dc/html5/thumbnails/47.jpg)
또…OBJECT HEADER에서 건질게 없나 째려 봐봅시다^^
이름이 있는 위치를 알려주는 것입니다.~ 자 확인해 봅시다.
![Page 48: Windows handle 의 비밀 2](https://reader034.vdocuments.net/reader034/viewer/2022050805/5597a2e21a28abc9218b46dc/html5/thumbnails/48.jpg)
그럼 NameInofOffset의구조체를 찾아봅시다요~~
![Page 49: Windows handle 의 비밀 2](https://reader034.vdocuments.net/reader034/viewer/2022050805/5597a2e21a28abc9218b46dc/html5/thumbnails/49.jpg)
_OBJECT_HEADER 위에 개체 이름이 있었네요^^ ㅋ~
![Page 50: Windows handle 의 비밀 2](https://reader034.vdocuments.net/reader034/viewer/2022050805/5597a2e21a28abc9218b46dc/html5/thumbnails/50.jpg)
개체 Header
개체 Body
개체이름
머리에 이름을 이고 다녔니~^^?
개체의 이름을 알려주는 거였군요!!
![Page 51: Windows handle 의 비밀 2](https://reader034.vdocuments.net/reader034/viewer/2022050805/5597a2e21a28abc9218b46dc/html5/thumbnails/51.jpg)
프로세스의 핸들장부 내역을 보여 주는 프로그램이
뭐가 있을까요?
![Page 52: Windows handle 의 비밀 2](https://reader034.vdocuments.net/reader034/viewer/2022050805/5597a2e21a28abc9218b46dc/html5/thumbnails/52.jpg)
미친핸들을만들었어요
![Page 53: Windows handle 의 비밀 2](https://reader034.vdocuments.net/reader034/viewer/2022050805/5597a2e21a28abc9218b46dc/html5/thumbnails/53.jpg)
ExEnumHandleTable 함수를 호출해주면..
핸들에트리개수만큼 콜백함수를 호출해줍니다.
![Page 54: Windows handle 의 비밀 2](https://reader034.vdocuments.net/reader034/viewer/2022050805/5597a2e21a28abc9218b46dc/html5/thumbnails/54.jpg)
아니면 수동으로 핸들테이블을 스캔해도 되지요^^
![Page 55: Windows handle 의 비밀 2](https://reader034.vdocuments.net/reader034/viewer/2022050805/5597a2e21a28abc9218b46dc/html5/thumbnails/55.jpg)
테이블 level 별로 메모리를 직접 스캔하시면 되겠죠~
![Page 56: Windows handle 의 비밀 2](https://reader034.vdocuments.net/reader034/viewer/2022050805/5597a2e21a28abc9218b46dc/html5/thumbnails/56.jpg)
수고하셨습니다~~^^