티스토리 뷰

 

 

[이전 이야기]

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

008. 삽질은 끝나지 않는다! NtDuplicateObject ! (2) : http://sapzape.tistory.com/13 

009. 삽질은 언제 끝나나.. LoadLibrary와 GetProcAddress! : http://sapzape.tistory.com/14

010. 넌 뭐하는 녀석이냐! NTSTATUS! : http://sapzape.tistory.com/15 

 

 

안녕하세요ㅎㅎ

근래 대박 삽질중인 삽잡이입니다!

 


 

Window Kernel에 대해서 쓴지 벌써 10주년 10번째 글이네요!

아직 10개밖에 올리지 못했는데, 하루에 하나씩 올리리라하던 다짐은 조금씩 멀어져가군요,,,

뭐,,, 느슨해질때다 싶으면 잠시 느슨해지다가 다시 조이면 되죠!

 

while(1)

{
작심삼일();

}

 

무한으로 돌리면 뭐 적절한 휴식 보장과 함께 무한 포스팅 아니겠습니까? 푸하하...

죄송합니다. (-_-)(_ _)(-_-)

 

자~ 오늘은 핸들 타입과 이름을 추출하기 위해 필요한 API의 마지막(?)

(뭐 크게 마지막... 물론 이외에도 수없이 많죠...)

NtQeuryObject 함수에 대해서 알아보도록 하죠!

 

 

 

NtQueryObject 함수는

NtDuplicateObject 함수에 의해 복사된 객체 정보에 대해서 알려준답니다. 

 

짜잔. 이렇게 생겨먹었답니다 ㅎㅎ

 


인자를 보시자면요~

 

객체에 대한 핸들을 인자로 넣어주는데요..

즉, Duplicate 해서 저장된 HANDLE 변수를 넣어주면 됩니다. 

 

 

이곳에서는 객체 Type에 대해 열거되있는 class를 인자로 넣어주면 되는데요, PUBLIC_OBJECT_BASIC_INFORMATION과 _PUPLIC_OBJECT_TYPE_INFORMATION이 있네요 ㅎㅎㅎ

일일이 저 Class를 전부 선언할 필요 없이 필요한 class만 빼와서 #define 하는것도

나쁘지 않는 방법 같습니다!

저같은 경우에는 핸들 타입과 이름을 추출하는 삽질을 하고 있기때문에

#define objectNameInformation 1

#define objectTypeInformation 2

를 선언해두고 시작한답니다~

 


 

이곳에는 요구한 정보를 받고 리턴할 버퍼를 입력합니다.

즉, 바로 위 objectinformationclass에서 입력한 type에 따라서

 버퍼로 입력할 변수 타입이 정해지겠군요!

 

예를 들어서

type을 입력했다면

POBJECT_TYPE_FORMATION 변수명;

이렇게요!

 

 


자~ 다음은 해당 버퍼로 받은 변수의 크기를 나타내고 있습니다.

 

 


마지막으로 실제 요청한 객체의 크기를 나타내고 있습니다.

만약 ObjectInformationLength로 받은 변수가 요청한 객체의 크기에 맞지 않는다면, NTSTATUS (지난 시간에 배운) error code실제 사이즈반환해줍니다.

 

여기서 중요한 것은

API 설계를 할때는 대부분

Size를 작게 부터 조금씩 늘려나간다는데요,

실제 구현을 할 때는 우선 임의의 SizeObjectInformationLength 인자값으로 넣고

ReturnLength 인자사이즈를 저장할 수 있는 변수 하나를 집어 넣는거죠!

그러고 사이즈가 안받다면,

다시 NtQueryObject 함수를 호출해서

ReturnLength에 저장된 실제 Size 값 ObjectInformationLength 인자값으로

넣어주면 되겠네요!

 

 

 

자 여기까지 알아보도록 하겠습니다.

구현(복사)를 해봤는데요, 큰 벽이 저를 가로막고있더군요...

NtQuerySystemInformation, NtDuplicateObject, NtQueryObject

이 삼총사가 있으면 뭐합니까...

정작 PID = 4 인 System에 있는 값들을 건들수가 없었습니다...

하지만 우리들의 친구 ProcessHacker에 이를 타파하기 위한

드라이버를 구현해놓으셨더라구요...

(대단하십니다... Wen Jia Liu (<-- Process Hacker 만드신)님...)

조만간 빨리 씹어먹어 정복해보도록 하겠습니다.

Stage 2 끝판왕인 PID 4 system handles타파하기위해!!

 

 

Handle 추출하는데 겸손한 ... 아니... 부족한 코딩 실력에 1주일을 잡아먹었습니다...

어찌 하나하나 할때마다 기본기가 부족함에 탄식이 나오더군요...

하지만 아직 초보인 저에게는 얼렁 교정할 수있지 않겠습니까 ㅎㅎㅎ

반듯한 모습 기대해주세요 푸하하

 

주절주절 말이 많았네요 ㅎㅎㅎ

다음 시간에 뵙겠습니다.

 

이상 삽잡이였습니다!

 

 

 

 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함