윈도우 버전과 커널 변화

윈도우 버전과 커널 변화

“요즘 같이 바쁜 시대에 개발할 시간도 없는데 윈도우 구조를 이해하라고? 웃기고 있네~”

이렇게 콧웃음을 칠 수도 있습니다.

여러분, 그럼 여러분이 빨리 하고 싶다고 애기하는 개발에 대해서 애기해 봅시다.

개발이라면 무엇일까요?

사전적의미는 “무엇인가를 보다 쓸모있거나 향상된 상태로 변화시키는 행위”라고 합니다. 그렇다면 IT에서 개발이란 위에서 “만들어~” 라고 지시한 특정한 프로그램이지요.

그렇게 시작된 개발은 수많은 오류를 거쳐서 완성이 되어집니다.

대부분의 시간이 코딩보다 잘못된 오류를 찾는데 개발시간을 허비하게 됩니다. 그리고 개발하는 언어가 바뀔 수도 있겠죠.

이 오류들을 찾거나 새로운 길을 걸어갈 때 필요한 것이 바로 윈도우입니다.

개발되는 운영체제가 프로그램이라면, 여러분의 개발 코드는 단지 윈도우에게 요청을 하는 것입니다.

문제점에 직면하거나 프로그램 코드를 개선하고자 한다면 요청되는 구조를 이해해야 답을 찾을 수 있겠죠.

여러분이 윈도우 구조를 이해한다는 것은 여러분이 개발을 10-20년을 할 수 있게 만들고, 다른 분야에도 쉽게 접근할 수 있는 통찰을 줄 것입니다.

여기서는 윈도우의 많은 부분에서 개발에 필요한 부분을 진행할 것입니다.

개발의 경력이 쌓일수록 점점 중요해지는 문제 해결과 효율 개선을 위해서는 프로그램 아래에서 실제 동작하는 윈도우에 대해 이해할 필요가 있습니다. 이때 바로 필요한 부분들이 운영체제의 구조, 정확히는 커널의 이해라 할 수 있습니다. 그리고 여기에서는 프로그램을 하면서 알아야 하는 부분만을 다룰 것입니다.

그럼 애기를 시작하기 전에 우리가 배울 윈도우가 어떻게 발전되어 왔는지 알아보도록 하죠.

큰 변화가 있는 부분에 구분선을 넣었습니다.

  1. (1993 년) 윈도우 NT 3.1
  2. (1994 년) 윈도우 NT 3.5
  3. (1995 년) 윈도우 NT 3.51
  4. ===============
  5. (1996 년) 윈도우 NT 4.0 & 95
  6. (1998 년) 윈도우 98 (NT 4.1)
  7. ===============
  8. (1999 년) 윈도우 2000 (NT 5.0)
  9. (2001 년) 윈도우 XP (NT 5.1)
  10. (2003 년) 윈도우 서버 2003 (NT 5.2)
  11. ===============
  12. (2007 년) 윈도우 비스타 (NT 6.0)
  13. (2008 년) 윈도우 서버 2008 (NT 6.0)
  14. (2009 년) 윈도우 7 & 2008 R2 (NT 6.1)
  15. (2012 년) 윈도우 8 & 윈도우 서버 2012 (NT 6.2)
  16. (2013 년) 윈도우 8.1 (NT 6.3)

    처음 도스 위에 부팅해서 사용되는 시절 사용된 윈도우 3.1~3.5는 정말 쓰는 사람만 썼던 윈도우라고 할 수 있습니다.

    윈도우 버전과 커널 변화

    [그림 0-1] 도스 환경에서 실행되던 윈도우 3.1

    사용할 수 있는 프로그램도 얼마 없고, 메모리 관리도 제대로 할 수 없는 시절로, 단순히 마우스로 작업을 할 수 있는 정도로만 인식되고, 대부분의 이용자 들이 MDir이라는 도스 유틸리티를 통해서 사용하던 시절이라 할 수 있습니다.

    이는 윈도우 NT 4.0(윈도우 95, 98, ME)부터 더 이상 도스에 의존하지 않고, 응용프로그램들 많이 개발 되면서 아이콘 사용 환경에 대해 사용자들의 호응을 얻었다. 이때부터 어떻게 보면 윈도우의 부흥이 시작되었다고 해도 과언이 아니였습니다.

    [그림 0-2] 더 이상 도스 환경을 사용하지 않는 윈도우 95

    하지만 윈도우 95 계열은 기존 환경 지원을 위해 16비트 응용프로그램을 계속 지원하다 보니 버전이 올라가도 기존 운영 환경보다 성능도 더 낮아 지기도 했으며, 잦은 블루 스크린(시스템 동작 불가 상태)으로 이용자들에게 큰 불평을 얻었습니다. 빌게이츠가 CNN 뉴스에서 윈도우를 시연하다가 블루 스크린이 발생하였는데, 이 역시 윈도우 95 후속작인 98입니다. 이는 어떻게 보면 16비트라는 비좁은 메모리 구조에서 발생하는 문제로 마이크로소프트는 이때 큰 결정을 하게 된것 같습니다. 바로 32비트를 기본으로 하는 운영체제를 만든것이지요.  바로 이 획기적으로 바뀌게 된 것이 윈도우 2000의 전신인 윈도우 NT 4.0인데 이때부터 16비트 지원을 하지 않고 32비트 구조를 가진 윈도우 머신으로 탈 바꿈 하게 되고, 마이크로소프트 역시 윈도우 9X 이라는 이름을 버리고, NT 4.0 기술을 발전 시킨 윈도우 2000을 기본으로 하여 이후 버전을 개발히게 되었지요. 이와 함께 개선된 부분이 사용자와 하드웨어의 처리하는 구조인데, 지금까지 NT 4.0이 기본 구조이 되어 이를 바탕으로 개선이 되었다고 할 수 있습니다. 그래서 마이크로소프트는 1996년까지 사용하던 윈도우 코드네임 NT을 사용하지 않고, 다른 이름을 사용하기 시작했는데 이 약자는 바로 New Technology의 영어 머리 글자로써, 내부 구조의 기술이 크게 변화 하였음을 의미합니다. 현재 윈도우 8.1 역시 코드 네임은 NT를 가지고 있으며, NT 코드네임의 앞자리가 바뀌면 내부적인 구조적 변경이 크다고 생각하면 될 것 같습니다. 현재의 윈도우 8.1 아키텍쳐 역시 대부분은 윈도우 NT 4.0의 구조에서 큰 그림은 바뀌지 않았을 정도로 윈도우 NT 4.0의 내부 구조가 그 당시 얼마나 획기적이었는지 알 수 있습니다.

    보다 자세한 내용은 다음 링크를 참고하기 바란다.

    http://technet.microsoft.com/en-us/library/cc749980.aspx

    [그림 0-3] 현재 윈도우 구조의 초기 버전이라고 할 수 있는 윈도우 4.0

    윈도우 NT 4.0의 외형은 윈도우 95지만 내부 모습은 많이 달랐습니다.

     

     

    [그림 0-4] 윈도우 NT 4.0의 내부 구조 (참조: MSDN)

     

     

    윈도우 2000 이후부터는 대부분이 많이 사용한 국민 운영체제인 윈도우 XP가 있다. 이는 윈도우 2000을 일반 사용자 버전으로 개량한 것으로, eXPerience중 XP를 따서 붙인 이름이다. 윈도우 XP는 제일 많이 팔리고 제일 많이 사용되었으며, 가장 오래 기간 사랑을 받은 운영체제로 윈도우 XP 내에서도 버전 종류도 8가지나 된다.

    [그림 0-5] 가장 많은 사랑을 받은 윈도우 Xp

    윈도우 XP 기반으로 한 서버 윈도우 2003 역시 많은 NT계열 서버 활성화에 큰 힘을 실어 주었고, 이 후부터는 큰 변화보다는 보안적인 부분들과 성능 개선에 중심적으로 변화가 생겼다.

    그리고 XP의 힘입어 출시간 비스타는 보안 부분과 외형에 너무 신경 쓴 나머지, 출시 당시에 너무나 무겁고, 호환성이 떨어진다는 이유로 사용자들에게 외면을 받았으며, 비스타 이후 동일 기술을 보다 최적화한 윈도우 7이 다시 큰 호응을 얻으며 윈도우 XP의 바톤을 넘겨 받게 된다.

    [그림 0-6] 윈도우 7의 시작화면

    최근에 출시한 윈도우 8도 내부적으로는 윈도우 7의 기본적인 기능에 ARM 지원을 추가한 것으로 메트로 스타일의 인터페이스 변화가 크다고 할 수 있다. 우리 이렇게 변화된 윈도우중 우리가 공부할 버전은 윈도우 7으로 리버스 엔지니어링이라는 기술을 이용해 확인해 나갈 예정이다.

    그럼 리버스 엔지니어링(줄여서 리버싱이라 한다)은 무엇일까? 저자도 이 의미를 정확히 알고자 단순이 공부하던 시절이 아닌, 내가 배운 것들의 의미를 생각해보며 사전을 찾아보았다. 사전에서는 탐색, 들여보는것, 찾아내는것인데, 여기에 “엔지니어링”이 결합된 용어로,

    저자는 다음과 같이 답하고 싶다. “IT 시스템(프로그램, 운영체제등)의 구성 요소를 탐구하여 구조와 원리를 이해하고 찾아내는것”이라는 생각이 들었다. 그럼 “뭘 찾아내지?” 라는 물음이 떠오르는데 바로 이 물음이 리버싱의 진짜 답이다. “찾아야 하는 모든 것“이 리버싱을 진행하는 목표이기 때문이다.

    다음과 같이 생각해보자.

    다음 컴퓨터에서 프로그램을 실행하였는데 Hello, World라는 실행 결과가 화면에 나타났다.

    “이 결과가 어떻게 나왔나요?” 라는 질문에, 대답하는 사람마다 다른 결과를 가지게 된다.

    컴퓨터를 단순히 사용하는 일반적인 사용자라면, 프로그램을 실행했으니깐 Hello, World라는 결과가 나왔다고 할 것이고, 프로그래머는 프로그램 코드의 프린트 출력문을 Hello, World라고 입력하였기 때문이라고 할 것이다. 그리고 이후 리버싱 엔지니어의 보는 방식에 따라 CPU처리 부분에 대한 어셈블리 부분을 대답하거나, 운영체제의 커널을 애기 할 수도 있을 것 같다.

    [그림 0-7] 보는 시각에 따라 운영체제를 이해하는 깊이가 다르다

    이렇게 시스템을 보는 시각의 차이는 자신이 알고 있는 만큼 보인다고 할 수 있다.

    그런데 리버싱은 무엇인가? 저자는 “찾아낼 수 있는 모든 것”이 리버싱이라 생각한다.

    즉, 리버싱은 특정 분야가 아닌 여러 분야에서 사용되며, IT에서 여러 문제해결 능력을 키울 수 있는 밑 바탕이 되어준다.

    그리고 미리 애기하자면 리버싱을 보안에서만 사용하는 것이 아니다.

    리버싱은 IT 다양한 분야에서 사용되는데, 그중 보안 분야가 가장 많이 사용할 뿐이다. 예로 프로그램 개발시 진행하는 디버깅 역시 리버싱 기술중 하나이다. 시스템 엔지니어가 진행하는 트러블 슈팅도 따지고 보면, 리버싱이라 할 수 있다.

    따라서 리버싱이라는 기본이 되는 지식을 잘 이해한다면 이를 확장하여 IT의 여러 분야에서 리버싱을 활용할 수 있다.

    그럼 리버싱에 보다 가까운 분야가 어떤 분야들이 있는지 한번 생각해 보자.

    크게 루트킷, 멜웨어, 포랜식, 침해사고, 디버깅, 보호 기술 정도 되는 것 같다.

    루트킷은 운영체제의 커널과 관련이 있고, 이 기술을 확장하여 바이러스 백신의 커널 드라이버와 게임 보안 엔진 제작 기술과 관련이 있다고 할 수 있으며, 해당 분야로 나아갈 수 있다. 그리고 멜웨어는 운영체제에서의 프로그램 동작을 이해하는 방식으로서 리버싱에서 가장 재미있고 리버싱에 기본이 되는 분야로 이는 악성코드 분석가와 관련이 있다. 그리고 포렌식은 침해사고 분석과 비슷하지만, 법적 근거를 바탕으로한 수집과 운영체제의 자료 저장 구조를 파악하는 방식으로 사이버 수사에 관련있으며 이 역시 코드에 의미를 부여해 무에서 유를 창조하는 흥미로운 직업이라 할 수 있으며, 침해사고는 포랜식 영역중 사용자 환경에 조금 더 집중하여 시간을 이용한 추적을 진행하는 재미있는 분야라 할 수 있다.

    그리고 디버깅은 커널 디버깅을 의미하는데, 커널 전문가가 되어서 시스템에서 발생하는 알 수 없는 문제점들을 운영체제 구조를 살펴보면 문제점을 해결하는 국내 몇 안되는 고급 시스템 엔지니어들 만이 구사하는 기술 이라 할 수 있다.

    보호 기술은 리버싱에서 하이브리드한 성격을 가지는 영역으로, 백신, 안티디버깅과 같이 기존 커널의 처리 구조를 이해하고, 이를 우회나 변조하지 못하도록 막는 기술로써, 리버싱 기술중에서도 커널쪽 리버싱에 특화된 영역있다.

    이렇게 설명한 리버싱 분야들를 보면 분야별로 심화 학습을 해야하는 부분이 다른지만 대부분의 기술들이 운영체제와 관련되어 있음을 알 수 있다. 즉 서로 다른 영역이지만 운영체제의 특정 분야를 얼마나 깊고 많은 기술이 들어가 있는지를 알 수 있을 것이다.

    저자는 공부를 할 때 위와 같이 다양한 분야가 있다는건 알았지만, 이 분야들이 서로 필요로 하는 영역이 비슷하다는 것과, 기본적으로 알아야 하는 지식이 있음을 차후에 이해할 수 있었다.

    저자가 애기한 분야들에서 공통으로 들어가는 부분은 CPU의 처리와 관련된 지식들이다. CPU의 처리에 관련된 기술들을 통해서 운영체제가 최종적으로 명령을 실행하는 위치인 CPU에서 처리되는 내용을 이해하므로써 운영체제가 어떤 작업을 하는지 이해할 수 있으며, 단순히 CPU 처리 결과를 넘어서 운영체제가 진행하는 메모리/디스크/IRQL등 운영체제의 각 영역별 동작 방식등을 익히고 해당 지식을 통해 디버깅 해 봄으로써 각 여러 영역들의 처리 구조를 이해하면서 확장해 나아 갈 수 있는 것이다. 따라서 가장 기본이 되는 CPU의 처리를 우선적으로 익혀서 기본부터 차근 차근 확장하는게 리버싱에서는 중요한 부분이라 할 수 있다.

    그리고 CPU의 처리 내용을 이해하기 위해서는 먼저 레지스터와 어셈블리, 그리고 스택에 대해서 이해하여야 한다. 이 3가지는 리버싱을 위한 기초 지식으로써, 리버싱의 다양한 분야에서 유용하게 사용되며, 가장 많은 도움을 줄 것이다.

Facebook Comments

Leave A Reply

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다.