본문 바로가기

CS/악성코드분석

[ 윈도우 악성코드 분석을 위한 기초 지식 ] 1. 윈도우의 이해

먼저 간단하게 윈도우의 역사를 살펴보고 윈도우에 대한 특징을 살펴볼 것이다. 

 

[ 윈도우의 역사 ]

윈도우 1.0

• MS 1983년 11월 개발 시작

• 1985년 11월에 첫 버전 완성 (2년간 개발)

멀티테스킹 및 GUI 지원

   이전에 있던 MS DOS는 싱글 테스킹이었다.

 

윈도우 2.0

• 1987년 1.1 버전이 나온 뒤 같은 해 11월에 발표

• 윈도우 Overlapped 지원 (기존은 tiled)

    Overlapped = 창을 늘렸다가 줄였다가 할 수 있다.

• 진정한 멀티테스킹 구현 (대신 많이 느려짐)

 

윈도우 3.0

• 1990년 3월 발표 (진정한 윈도우로 알려진 버전)

• 매킨토시(화려한 GUI)를 많이 참조(거의 유사)

 

윈도우 3.1

• 1992년에 업데이트 (윈도우의 실질적인 첫 버전)

• 보호모드 및 메모리 16MB까지 지원(메모리를 크게 지원) → 도스에 비해 획기적 , 도스(640k만 지원)

 

      -윈도우 9x

      • 1994년 이후 발표된 윈도우 9x들

      • 긴 파일명(255), 메모리 4GB까지 지원 → 엄청난 확대

      

      *윈도우 98에서 안정화가 많이 되었다.

       윈도우 95는 악성코드가 나올 수 없다고 강조했지만 보자(BOZA)라는 바이러스 등장

 

     -윈도우 2000계열

      • 서서히 개인용에서 서버용으로 진화되어 감

      • 64Bit, 보안기능 추가

 

*서버용과 개인용(한 사람만 사용)의 차이는 멀티유저를 지원하는지 여부이다.

리눅스는 여러 사람이 접근한다. 그래서 폴더의 접근 권한을 준다.

하지만 개인용은 계정이 달라도 파일을 지울 수 있다. 그래서 좋은 운영체제가 아니었다고 할 수 있다.

서버용은 보안이 강화되었다고 볼 수 있다 → 서버용은 윈도우 NT 계열이라고 할 수 있다.

 

윈도우 NT

80년대부터 개발하기 시작
커널 레벨과 응용 레벨을 나누어 메시지를 전달 방식으로 처리하자고 커틀러가 말함 → 하지만 빌게이츠는 API를 바로 다이렉트로 호출하여 쓸 수 있게끔해라 라고 했다.
이렇게 될 경우 운영체제에서 문제가 생길 경우 커널도 전체적으로 위험해질 수 있다. 그래서 안에서는 메시지를 주고 받으면서 독립적인 방향을 선택했다.
이전에 윈도우 1.0 ~ me까지는 응용 레벨과 커널 레벨이 거의 비슷하여 오류가 나타나면 바로 블루 스크린이 뜨게 했다.
하지만 NT부터는 블루스크린이 사라졌다. 
현재는 메세지에 기반한 형태로 되었기 때문에 안전해졌다.

 

-NTFS 파일 시스템 지원

 

- 윈도우 변천사를 보면 지금 우리가 사용하고 있는 윈도우 10까지는 NT에서 출발하고 있다는 것을 알 수 있다.

CE는 모바일용이다.

 

[ 윈도우 프로그래밍 이해 ] 

(1) 그래픽 기반(GUI)의 운영체제이다.

 

(2) 멀티태스킹이 가능하다.

 

(3) 메시지 구동 시스템이다.(서로 메시지를 주고 받는 시스템)

 

(4) 장치 독립적이다.

     MS 도스를 사용할 때는 프린터와 컴퓨터를 연결할 때 프린터 드라이브라는 것을 별도로 설치했었어야 했다.

    그리고 프린터 제조 회사 마다(ex 삼성 프린터, hp프린터 .. ) 코드들이 달라서 번거로웠다.

    이러한 방식은 응용 프로그래머들이 하나 하나 다 신경쓰기는 어렵다는  단점이 있다. 이를 문제 삼아 프린터를 독립시        켰다. 장치가 독립적으로 된다면 응용 개발자들은 윈도우에서 제공하는 특정 API만 사용하면 된다. 즉, 응용 프로그램들      은 모든 장치에 대해서 신경쓰지 않아도 된다는 장점이 있다. 

    이에 대한 과정은 다음과 같다. 

     “API를 통해  → (메시지 통신을 통해)커널을 거쳐서 → 삼성 혹은 각종 드라이버에게 가고 → 실제 디바이스에게 간다.”

 

(5) 일관성이 있다.

 

(6) 리소스가 분리되어 있다.

이전에는 실행 파일 자에 data, 기계어 등이 혼재되어 있었다. 지금은 실행파일이 기계어, data, 리소스 영역을 구분해준다 이 실행 파일을 PE 파일이라고 한다.

 

[ 윈도우 프로그램 개발 방법 ]

 

SDK (Software Development Kit)

 = kit을 이용하여 개발하는 방법이다.

*이전에는 MS DOS에서 c언어를 작성하고 컴파일하여 exe파일을 만든다. 그리고 이를 바로 실행할 수 없어서 윈도우로 가기 위해 “cd win” → “win.com”으로 가서 윈도우에서 실행해야 한다. 이러한 작업이 번거롭기 때문에 이를 간편하게 할 수 있는 SDK를 이용하여 개발했다.

 

(1) 가장 원론적인 개발방법론

 

(2) 운영체제가 제공하는 기능을 직접 제어함으로써(메모리 조절) 섬세한 처리를 할 수 있음

 

(3) 방대한 API를 알아야 한다는 단점이 존재함(대략 수만개)

 

(4) 저 수준의 프로그램(백신, (하드웨어에 가까운 프로그램)), 소규모 프로그램(악성코드)에서 주로 많이 사용함

 

클래스 라이브러리

(1) 방대한 API를 클래스화 해서(캡슐화) 사용하기 쉽게 함

(2)  객체를 조립하면서 프로그래밍 해 나감

(3)  MFC, OWL이 대표적(클래스 라이브러리) 

(4) 생산성 및 성능이 좋아 가장 많이 사용

(5)  API에 대한 기본 지식이 필요

 

비주얼 툴

(1) API, OOP (객체 지향)몰라도 프로그래밍 가능 

(2) 마우스로 그림을 그리듯 화면 디자인

(3) 필요한 곳에만 최소의 코딩

(4) 비주얼 베이직, 델파이가 대표적

 

난이도 개발 난이도

     • SDK < MFC < 비주얼 툴(쉬움)

분석 난이도(분석가 입장)

    • SDK(분석 쉬움) > MFC > 비주얼 툴(어려움)

 

[ 윈도우 API 프로그래밍 ]

SDK로 만든 프로그래밍을 한 번 봐보자 (윈도우 창 띄우는)

-가장 간단한 소수

-visual C/C++ 로 만들어진 것이고 컴파일하여

-디버거로 분석

이에 대해서 어느 정도 알아야 윈도우 악성코드 분석을 할 수 있다.

윈도우 API 프로그램 소스코드를 알아야 하는 이유 :

  • 윈도우 API 프로그래밍에서는 main()함수로 시작하는 것이 아니라 WinMain()함수로 시작한다.

나중에는 무한루프 도는 것으로 빠진다. 그래서 언제 어떻게 어떤 프로그램을 실행하는지 모른다.

하지만 무한 루프를 돌고 있지만 커널단에서 응용 프로그램에게 메시지로 전달해줄 것이다.

메시지를 받고 처리하는 구조이기 때문에 윈도우 API의 소스 코드를 알아야 분석이 가능하다.