핸들 테이블의 상속


BOOL CreateProcess(

LPCTSTR lpApplicationName , 

LPTSTR lpCommandLine ,                                                                                    

LPSECURITY_ATTRIBUTES lpProcessAttributes ,

LPSECURITY_ATTRIBUTES lpTreadAttributes ,

BOOL binheritHandles , // 핸들테이블의 상속여부

DWORD dwCreationFlags ,

LPVOID lpEnvironment ,

LPCTSTR lpCurrentDirectory ,

LPSTARTUPINFO lpstrartupInfo ,

LPPROCESS_INFORMATION lpProcessInformation

);


핸들테이블은 5장 과 6장에서 각 리소스에 독립적이라 하였는데 핸들테이블은 조건에 따라 상속도 가능하다. 

상속될때 핸들같이 동일하게 상속된다.

핸들테이블에 핸들 정보에 상속가능여부가 있는데 이 값이 가능상태여야 상속이가능하다.

ex)


 핸들

주소 

상속여부 

127 

0x1200 

168 

0x1680 

 ......

 ......

 ......

이런 식으로 상속 가능여부가 핸들값마다 저장이 되어진다.



CreateProcess함수를 살펴보면 5번째 인자에 BOOL binheritHandles 가있는데 이 인자값을 true 을 주면 부모프로세스의 핸들테이블에 상속가능한 핸들들이 상속된다.



그러하다면 어떻게하면 핸들값의 상속여부를 가능하게 할 수 있을 것인가.

 

ex)


SECURITY_ATTRIBUTES sa;

sa.nLength=sizeof(sa);

sa.lpSecurityDescriptor=NULL;

sa.bInheritHandle=TRUE;  // 이런식으로 하면 상속가능하게 할 수 있다.


.................


CreateMailslot(......... &sa); //4번째 전달인자이다.


대부분의 리소스 생성과정에서 보면 SECURITY_ATTRIBUTES 즉 보안관리자 설정을 위한 구조체가 사용된다.

이보안설정을 하는과정에서 앞의 강의에서 NULL 설정을 하였다.

보안 설정을 하지 않을 경우 상속가능여부는 가능하지 않게 된다.


메일 슬롯 뿐아리라 대부분 다른 리소스를 생성할 경우에도 보안관리구조체의 포인터를 전달하면 동일하게 설정 할 수 있다.



핸들의 상속과 UC




핸들 값을 상속하게 되면 당연하게도 UC값이 증가한다.








Pseudo 핸들과 핸들의 중복


6장에 나왓듯이 프로세스가 자기자신의 핸들값은 핸들테이블에 저장시켜서 사용하는것이 아니라 GetCurrentProcess함수를 이용하여 특정 상수를 이용한다라고 하였는데 이를 Pseudo 핸들 이라한다.즉 가짜핸들이다.


하지만 이런 일이 일어난다고 해보자.


A프로세스가 B라는 자식프로세스에게 A프로세스의 핸들을 상속하고싶다.

하지만 A프로세스의 핸들테이블에는 A의 핸들정보가 존재하지않는다.

그래서 A프로세스의 핸들테이블에 자기자신의 핸들정보를 저장하여야 한다.



DuplicateHandle 함수가 있다


대략 하는일은 DulpicateHandle(A 핸들, 256,B핸들,&val,.......)  

                                                                        HANDLE val=364

이런식으로 함수를 호출하면 밑에 처럼 A프로세스의 핸들테이블에 있는 256 핸들이    B프로세스의 핸들테이블에 364 값으로 복사가 된다. 

여기서 다시한번 핸들테이블은 각 리소스에 독립적이라는 것을 인식하자.


프로세스 A     

 프로세스B

 

핸들 

주소 

 

핸들 

주소 

... 

... 

 

..0

... 

256 

0x2400 

 ------------>

364 

0x2400 

 ...

... 

 복사

... 

 ...


이것으로 이제 Pseudo 핸들을 핸들테이블에 저장해보자.



DuplicateHandle(

프로세스A핸들,

256,

프로세스A핸들,

&val,

.....

);


 핸들 

주소 

 

 

... 

...   

 256

0x2400 

 ---------------->

 Usage count : 2

 ...

 ...  

 284

  0x2400  ----------------> 

 ...

...   


한테이블에서 핸들을 복사 할 수도 있다.

이러면 같은 주소를 가리키는 핸들이 하나 더 생긴다. 

※물론  UC도 늘어남으로 나중에 핸들을 닫을때 두번 닫아야 한다.


이제 자신의 핸들값을 상속 할 수있게 Pseudo 핸들을 핸들테이블에 저장해보자.


DuplicateHandle(

GetCurrentProcess(),

GetCurrentProcess(),

GetCurrentProcess(),

&hProcess,

0,

TRUE,

DUPLICATE_SAME_ACCESS

);


앞에 3인자에 모두 GetCurrentProcess함수를 넣으면 함수를 호출한 프로세스의 핸들이 반환되니까 호출한 프로세스의 핸들테이블에 호출한프로세스의 핸들값이 저장이 되는것이다. 





+ Recent posts