삽질의 현장/- 윈도우 커널

윈도우커널_#008_삽질은 끝나지 않는다! NtDuplicateObject ! (2)

shovelman 2015. 6. 9. 23:23

 

 

[이전 이야기]

001. 커널은 뭐다? 서버다! : http://sapzape.tistory.com/4

002. 커널은 서버라고? 직접 보여줘! : http://sapzape.tistory.com/6

003. 커널은 서버라고? 더욱 생생하게 보여줘봐! : http://sapzape.tistory.com/7

004. Handle 서비스하는거 보러갈사람! : http://sapzape.tistory.com/9

005. Handle 서비스하는거 보러갈사람! : http://sapzape.tistory.com/10

006. 삽질의 시작! NtQuerySystmInformation 정복기 : http://sapzape.tistory.com/11

007. 삽질은 끝나지 않는다! NtDuplicateObject ! (1) : http://sapzape.tistory.com/12

 

 

안녕하세요 추운 주말에

카페에 쭈그려 블로깅을 하고 있는 여러분의 친구 삽잡이입니다.

 

집에만 있으면 게으를까봐 나왔더니...

초딩들의 카페 점령으로 인해 정신적인 수행을 하고 있습니다 ...

 


자... 지난 시간에는 NtDuplicateObject를 왜 사용해야되는지에 대해서 알아봤었습니다.

하지만 해당 함수에 대해서 뜯어보지 못했었군요...

 

오늘은 NtDuplicateObject 안의 인자들을 알아보고,

이를 사용하기 위해 우리는 어떤 Action을 취해야할까...? 하는

고민의 시간을 가져보도록 하겠습니다.

 


 

짜잔!

 

혹시 이전 글을 읽지 않으신 분들 중에 NtDuplicateObject를 씹어먹는다더니

왜 ZwDuplicateObject 를 보는지 하는... 

의심의 눈초리로 쳐다보시는 날카로운 분들이 계시다면...

NtDuplicateObject와 ZwDuplicateObject 두 가지의 버전을

Window Native System Service에서 제공한다고 말씀드리고 싶습니다... 

(이전 이야기(클릭가능) 참고하실분은 해 주thㅔ요!)

 

 

 

자.. Duplicate!! 복사할 핸들의 주인! 프로세스를 선택해야합니다.

 

복제하기 위한 핸들...에 관한거 같고요..

자... "나도 핸들 줘~~~!!" 징징 되던 프로세스를 지정해 줘야합니다.


 

찡찡되어 얻은 핸들 값을 리턴 받는군요...

 

 

ACCESS_MASK ... 새로 얻은 핸들 값에 대한 권한을 지정합니다... 

 

새로운 핸들의 원하는 속성을 명시합니다...


 

옵션을 봅시다...

 

아하... 이와 같은 옵션들이 있군요... 후에 실제로 구현해보며 알아가보도록 합시다...

 


자 그렇다면~~ 음식을 먹으려면 조리를 해야하듯이 (물론 생식도 있습니다.. 허허...)

이 함수들을 씹어먹기 위한 도구들을 불러봅시다!


 

자.. 여러분 여기서 잠시 질문이 있습니다.

우리는 어제 오늘에 거쳐 알아본 함수들을 사용하려면 어떻게 해야할까요?

 

"그냥 헤더파일 쓰고 선언하면 되는거 아닌가요?"

 

땡! 우리는 직접 호출을 할 수 없습니다... OTL...

그렇다면 어떻게 해야할까요?

우리가 특히, 알아본 NTDLL.DLL ... 아...

NtQuerySystemInformation이나 NtDuplicateObject는

모두 NTDLL.DLL 안에 있는 함수입니다...

 

제가 처음에 알려드리지 않았군요...

죽여주시옵소서!!!!

지금이라도 알려드렸으면 됬죠.. 그쵸?... 허허...

 

자... 말을 이어가보도록 합시다...

NTDLL.DLL의 함수를 컴파일러는 직접 호출할 수가 없습니다...

그럼 왜 배웠냐... 하하 방법이 있으니까 사람들이 쓰고 있지 않을까요?

 

우리는 해당 함수를 쓰기 위해서는 컴파일러에게 모양을 알려줘야합니다!

그리고 그 함수를 LoadLibrary라는 함수를 통해

해당 라이브러리가 로드 되어있는 있는 주소값을 알아냅니다.

그리고 또 GetProcAddress 함수를 통해

해당 라이브러리 내의 함수의 주소값을 알아낼 수 있습니다 ㅎㅎ

 

자 컴파일러에게 설명을 하는거죠 ㅎㅎㅎ

여러분!!!! 모두 컴파일러에게 사용전에 저렇게 모션을 취해야합니다!

 

 

 

푸하하... 하하.. 하.. 하.. 죄송합니다...

죄송합니다... 정신 차리고...

 

이제 실제 구현을 통해 확인해보도록 할까요?

 

허허... 우리에겐 내일이 있잖아요? 

내일 확인해봅시다! 풉 ㅋㅋㅋ

 

내일 뵈요....

이상 삽잡이였습니다!

 

 

 

[참고자료]

 

 http://msdn.microsoft.com/en-us/library/windows/hardware/ff556502(v=vs.85).aspx 

<-- NtDuplicateObject 설명

 

[구글 키워드]

 

NtDuplicateObject

LoadLibrary

GetProcAddress

MSDN

 

 

http://sapzape.tistory.com/13