windows handle 의 비밀 2

56
Windows Handle 의 비밀 미친감자 김주생 Visual C++ MS MVP 2013년 7월 13일 발표

Upload: joosaeng-kim

Post on 04-Jul-2015

3.533 views

Category:

Technology


5 download

DESCRIPTION

Windows Handle 의 비밀 Windows Handle의 역할 및 커널 내부 구조에 대한 여러 실험한 내용을 공유한다.

TRANSCRIPT

Page 1: Windows handle 의 비밀 2

Windows Handle 의 비밀

미친감자 김주생

Visual C++ MS MVP

2013년 7월 13일 발표

Page 2: Windows handle 의 비밀 2

핸들이 뭐냐?

Page 3: Windows handle 의 비밀 2
Page 4: Windows handle 의 비밀 2
Page 5: Windows handle 의 비밀 2
Page 6: Windows handle 의 비밀 2

“System” 이분이 바로 커널 서비스를 해주시는

분이십니다. 안녕하세요~”System”님 보통 “커널”이라고도 하죠~

Page 7: Windows handle 의 비밀 2
Page 8: Windows handle 의 비밀 2

아..파일이 필요하시다구요 잠시만 기다려주세요.~

저 커널님아 저 파일좀 하나 만들어주세요~

KERNEL SERVICE LAND USER LAND

Page 9: Windows handle 의 비밀 2

고객님~ 이 핸들만 있으면

파일을 사용하 실 수 있습니다. 자~ 받으세요~!

감사합니다. 커널님아~ 그럼 저는

이 핸들만 있으면 되는 거죠^^?

KERNEL SERVICE LAND USER LAND

Page 10: Windows handle 의 비밀 2

파일을 하나 만들었더니..핸들을 넘겨줍니다.

핸들에는 어떤 값이 있을까요? 확인해 봅시다.

Page 11: Windows handle 의 비밀 2

7cc 칠씨씨? 뭘까요??

Page 12: Windows handle 의 비밀 2

자 이제 칠씨씨의비밀을 알아볼까요^^!!

Page 13: Windows handle 의 비밀 2

499 번째 엔트리라는점

Page 14: Windows handle 의 비밀 2

프로세스가 만들어지면 이 프로세스가 사용 하는

커널 오브젝트 장부(Table)를 하나 가지고 있다.

Page 15: Windows handle 의 비밀 2

프로세스가 생성되면 커널에서는 해당 프로세스를 관리하기 위해 _EPROCESS 에 정보를 저장합니다. 그리고, 핸들정보도 이곳에 있습니다.

Page 16: Windows handle 의 비밀 2

_EPROCESS 안에 핸들테이블인 ObjectTable 필드가 있죠^^!?

Page 17: Windows handle 의 비밀 2

ObjectTable의 이 값이 의미하는 것은 무엇일까? 음..

구조체 _HANDLE_TABLE의 주소라는 것~!

Page 18: Windows handle 의 비밀 2

구조체 _HANDLE_TABLE에는 각종 핸들테이블 정보가 들어 있습

니다.

Page 19: Windows handle 의 비밀 2

바로 이 값이 핸들엔트리가 저장되어 있는 시작 위치 입니다.

Page 20: Windows handle 의 비밀 2

Table Code

Handle/4

엔트리 크기(8)

Table Entry 주소

0xe10b9000 + 0x7cc/4 * 8 = 0xe10b9f98

Page 21: Windows handle 의 비밀 2

4byte

Handle Entry 모양~(총 8bytes)

닫 힘 보 호

상속가능여부

닫힘감시여부

Object Header 포인터

Access Mask

32bit(4byte)

Page 22: Windows handle 의 비밀 2

닫 힘 보 호

상속가능여부

닫힘감시여부

Object Header 포인터

Access Mask

Page 23: Windows handle 의 비밀 2

_OBJECT_TYPE 을 통해앻 개체의 종류를 알 수 있습니다.

Page 24: Windows handle 의 비밀 2

File 개체임을 알 수 있군요! 자 이제 제가 만들었던

Myfile.txt 파일인지를 알아보면 되겠군요…

Page 25: Windows handle 의 비밀 2

개체 Header

개체 Body

그런데 Object는 머리와 몸통으로 되어 있습니다. 2등신~

Page 26: Windows handle 의 비밀 2

개체 Header

개체 Body Header 대가리는 어떻게 생겼을까요?

Page 27: Windows handle 의 비밀 2

개체 Header

개체 Body 헤더에 + 0X18를 해주면오브젝트 몸통!!!

Page 28: Windows handle 의 비밀 2

오~~ 제가 만든 파일 맞네요~!!

+18 해주면..개체몸통이 되고요~ 몸톰을 확인해 보니~!!

Page 29: Windows handle 의 비밀 2

윈디비지에서 !handle 하면 아주 친절하게 나온다!!!!

Page 30: Windows handle 의 비밀 2
Page 31: Windows handle 의 비밀 2

핸들은 32bit 자료형입니다.

하지만 32bit 전부를 사용하지 않습니다.

Page 32: Windows handle 의 비밀 2

핸들이란 녀석(xp) 이렇게 생겨먹었다!!!

Page 33: Windows handle 의 비밀 2

Tag 2bit 때문에 윈도우 핸들값은 4씩 증가한다.

048C048C048C048C048C

Page 34: Windows handle 의 비밀 2

EPROCESS

TableCode

Top Level Pointers

0

31

Middle Level Pointers

0

1023

Sub Handle Table

0

511

Page 35: Windows handle 의 비밀 2

핸들은 총 몇 개까지 만들 수 있을까요?

32 1024 511

16,744,448

천육백칠십사만사천사백사십팔개

Page 36: Windows handle 의 비밀 2

과연 실제로 16,744,448개까지 핸들이 생성이 될까요? 실험해 봅시다~!

16,744,436개까지 생성이 되는군요.. 12개는왜…생성이 되지 않았을까요?

Page 37: Windows handle 의 비밀 2

Table Code의 하위2비트가 수상하다!!~~!~

Table Code의 하위2비트가 Table Layer

Page 38: Windows handle 의 비밀 2

Table Code

Sub Handle Table

0

511

0

511개까지는 Sub Handle Table로 충분!!!

Page 39: Windows handle 의 비밀 2

Table Code

Sub Handle Table

0

511

0

511개까지는 Sub Handle Table로 충분!!!

Sub Handle Table을 직접 확인해봅시다. 메모리 구경하러 갑시다.

Page 40: Windows handle 의 비밀 2

511개까지 저장 되는지 확인해보죠~

Page 41: Windows handle 의 비밀 2

EPROCESS

Middle Level Pointers

0

1023

Sub Handle Table

0

511

Table Code

1

Page 42: Windows handle 의 비밀 2

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

EPROCESS

TableCode

Top Level Pointers

0

31

Middle Level Pointers

0

1023

Sub Handle Table

0

511 2

Page 44: Windows handle 의 비밀 2

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

핸들이란 녀석(2000까지) 이렇게 생겨먹었다!!!

Page 46: Windows handle 의 비밀 2

Handle Table

Top Level Pointers

0

255

Middle Level Pointers

0

255

Sub Handle Table

0

255

Page 47: Windows handle 의 비밀 2

또…OBJECT HEADER에서 건질게 없나 째려 봐봅시다^^

이름이 있는 위치를 알려주는 것입니다.~ 자 확인해 봅시다.

Page 48: Windows handle 의 비밀 2

그럼 NameInofOffset의구조체를 찾아봅시다요~~

Page 49: Windows handle 의 비밀 2

_OBJECT_HEADER 위에 개체 이름이 있었네요^^ ㅋ~

Page 50: Windows handle 의 비밀 2

개체 Header

개체 Body

개체이름

머리에 이름을 이고 다녔니~^^?

개체의 이름을 알려주는 거였군요!!

Page 51: Windows handle 의 비밀 2

프로세스의 핸들장부 내역을 보여 주는 프로그램이

뭐가 있을까요?

Page 52: Windows handle 의 비밀 2

미친핸들을만들었어요

Page 53: Windows handle 의 비밀 2

ExEnumHandleTable 함수를 호출해주면..

핸들에트리개수만큼 콜백함수를 호출해줍니다.

Page 54: Windows handle 의 비밀 2

아니면 수동으로 핸들테이블을 스캔해도 되지요^^

Page 55: Windows handle 의 비밀 2

테이블 level 별로 메모리를 직접 스캔하시면 되겠죠~

Page 56: Windows handle 의 비밀 2

수고하셨습니다~~^^