2015년 11월 9일 월요일

windows programming공부하면서..(7)

헛.. 요즘 취업 때문에 밀린 공부가 너무 많다..근데 이력서 쓰고 면접 보면서, 느낀거지만, 내가 부족한 점을 많이 알 수 있었다. 특히 악성코드분석 과제로 받은 'mfc프로그램'은 완전 멘붕을 오게 했다. mfc 공부도 중요하지만 우선 시작한거 끝내고 하나하나 하도록 하자! 말이 길었다. 다시 windows programming공부를 시작해보자.

커널 오브젝트와 오브젝트 핸들


커널(Kernel) : 컴퓨터와 운영하는 데 있어서 중심이 되는 운영체제 핵심 부분

커널 오브젝트(Kernel Object)
- 커널에서 관리하는 중요한 정보를 담아둔 데이터 블록을 가리키는 말
- 프로세스가 생성될 때마다 '프로세스 관리 구조체'변수가 하나씩 생성되고, 새롭게 생성된 프로세스 정보들로 초기화되는데, 이것을 커널 오브젝트(Kernel Object)라고 한다.
- 프로세스가 생성될 때에만 생성되는 것이 아니라, 프로세스 내에서 프로그램 흐름을 구성하는 쓰레드(thread)를 생성할 때에도, IPC(Inter Process Communication)을 위해 사용되는 파이프나 메일슬록을 생성할 때에도 생성된다.
- 정리 : Windows 운영체제는 프로세스, 쓰레드 혹은 파일과 같은 리소스(Resource)들을 원할히 관리하기 위해 필요한 정보를 저장해야한다. 이때 데이터를 저장하는 메모리 블록을 가리켜 커널 오브젝트라고 한다.

*프로세스 관리 구조체 : 프로세스를 관리하기 위해 필요한 구조체


- 커널 오브젝트는 직접적인 조작은 불가능하지만, MS에서 제공하는 시스템 함수를 사용하면 간접적으로 조작이 가능하다.

프로세스 우선순위(Priority) 변경

우선순위 관련된 내용은 추우에 thread에 대해 공부할 때 자세히 공부하고, 여기선 간단하게 맛만 보도록하겠다.



SetPriorityClass함수를 정리하면 "hProcess가 가리키는 프로세스의 우선순위를 dwPriorityClass로 변경시킨다"라고 정리할 수 있다.

*핸들 : 커널 오브젝트(Kernel Object)에 할당되는 숫자

커널 오브젝트에 할당되는 숫자! 핸들(Handle)


위 그림을 보면 SetPriorityClass함수에 첫번째 인자에 어떤값을 넣어야 하는지 알 수 있으며, 프로세스(우선 순위를 변경하고자 하는)의 커널 오브젝트를 가리키는 핸들을 전달하는 것을 확인할 수 있다.

지금까지 계속 말한 '커널 오브젝트 핸들'은 줄여서 '오브젝트 핸들'이라고도 부른다.


핸들 정보는 어디서?




위 프로그램에 대한 설명은 주석으로 처리하였다. 위 프로그램을 실행하면 "Operation1.exe"라는 문자열을 계속 출력하게 된다.

다음은 Operation1.exe에서 실행하는 Operation2.exe의 소스코드이다.




GetCurrentProcess 함수는 현재 실행되고 있는 프로세스의 핸들을 얻을 때 사용하는 함수다. 반환값을 통해 핸들을 얻게 된다.




*HIGH_PRIORITY_CLASS : 값의 높고 낮음은 중요하지 않으며, 이 상수값을 통해 프로세스 우선순위가 일반적인 프로세스에 비해 높아진다.



*avast와 같은 anti virus 도구를 끄고 실행하도록 하자. (강제종료는 'ctrl + c'를 누르면 가능하다.) 또한, 싱글코어가 아닌 멀티코어를 사용하는 경우는 위와 같은 결과를 보게 되며, 만약 싱글코어를 사용하게 되면 Operation2.exe가 가장 많은 비중을 차지하게 된다.

확실한 실습을 위해 vmware를 이용하여 'WindowsXP 싱글코어' 환경에서 다시 컴파일 하여 실습을 진행하였다. 아래 이미지는 'Windowsxp 싱글코어'환경에서 실행한 화면이다.



위 이미지를 보면 'Operation1.exe' 문자열이 한개 존재하는 것을 볼 수 있다. 그러한 이유는 Operation2.cpp에서 "HIGH_PRIORITY_CLASS"상수를 통하여 일반적인 프로세스들보다 우선순위를 더 높여 주었기 때문이다. 좀 더 확실한 실습을 위해서 Operation1.exe을 실행한 후, 다른 프로그램들을 실행해보면, 다른 프로그램들에게 어떠한 영향을 미치는지 확인할 수 있다.

보인은 다른 프로그램 실행 조차 하지 못했다. 간혹 문자열이 엉망으로 출력되는 경우도 볼 수 있다. 예를 들어 'Otion1.eperation2.exe"와 같은 문자열인데, 이는 함수 호출이 완료되기도 전에 다른 프로세스에서 CPU 할당 시간을 넘겨주기 때문에 발생하게 된다. 더 풀어서 말하면 Operation1.cpp의 '_fputts'함수 호출이 완료되기도 전에 다른 프로세스에서 CPU할당 시간을 넘겨주기 때문에 발생하게 되는 것이다. 여기서 우리는 이러한 오해를 풀 수 있게 된다.

" 함수가 호출되어 실행되는 중간에는 절대로! CPU의 할당 시간을 다른 프로세스에게 넘겨주지 않아!!"

하지만 아직도 많은 의문을 가질 수 있다. 그러한 의문점은 계속 Windows Programming 공부를 통하여 설명하도록 하겠다.


댓글 없음:

댓글 쓰기