본문 바로가기

Development

Win32 API 정리

API Hooking쪽을 공부하다가 C++ 코드를 읽는데 Win32 API 부분이 어려워서 공부 겸 정리하려고 글을 씁니다.

API?

  • API(Application Programming Interface)
  • 운영체제가 응용프로그램을 위해 제공하는 함수의 집합
  • 운영체제가 정한 규칙에 따라 하드웨어에 엑세스하거나 응용 프로그램끼리의 상호작용 가능
  • 따라서 이를 위해 API를 제공.

변수 명명법

  • C에선 i,j와 같이 짧은 변수명을 사용했지만, 윈도우즈에선 많은 변수가 사용되므로 이해하기 쉽게 길게 표현한다.
  • 관습적으로 정해진 접두어를 이용하기도 한다.
  • cb(Count of Bytes) : 바이트 수
  • dw(double word) : 부호없는 long형 정수
  • h(handle) : 윈도우, 비트맵, 파일 등의 핸들
  • sz(Null Terminated) : Null 종료 문자열
  • w(Word) : 부호없는 정수형
  • i(Integer) : 정수형
  • b(Bool) : 논리형

DLL Injection 코드에서도 dwPID 같은 변수명이 이러한 이유로 선언됨.

 

데이터형

  • windows.h 헤더파일에 typedef로 새로운 데이터형이 선언되어 있음.
  • BYTE: unsinged char 형
  • WORD: unsigned short 형
  • DWORD : unsigned long 형
  • LONG : long 형
  • LPSTR : char * 형
  • BOOL : 정수형 (TURE or FALSE)

Handle?

  • 핸들(handle)은 구체적인 어떤 대상에 붙여진 번호를 의미.
  • 메모리 할당에서도 주소보다 메모리에 번호를 붙인 핸들을 사용.
  • 사용이유: 대상끼리의 구분에서 핸들을 이용하여 처리 속도 증가
  • 대부분 32bit 정수값
  • 핸들은 운영체제가 발급해주므로, 사용하는 쓰기만 하면됨.
  • 중복된 값을 갖지 않으며 값과 상관없이 단순히 표식임.

윈도우즈 구조 파악

윈도우즈 프로그래밍의 시작점은 WinMain( )이다. 함수의 원형은 다음과 같다.

int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance ,LPSTR lpszCmdParam,int nCmdShow)

  • hInstance: 프로그램의 인스턴스 핸들
  • hPrevInstance: 바로 앞에 실행된 현재 프로그램의 인스턴스 핸들
  • lpCmdLine: 프로그램의 인수, argv와 동일
  • nCmdShow: 프로그램이 실행될 형태

윈도우즈는 기본적으로 두 개의 함수로 이루어져 있다. WinMain, WinProc이다. WinMain에서는 윈도우를 만들고 출력하기만 하고(MVC 모델의 View라고 생각됨) WinProc에서 실질적인 처리가 진행된다.(Controller)

윈도우즈와 도스에 뚜렷한 차이는 바로 실행방식이다. C는 절차지향식으로 위에서부터 순서대로 실행되는 반면, 윈도우즈는 키보드, 마우스 이벤트 등 어떤 메세지가 전달되냐에 따라 실행 순서가 달라진다. 이러한 메세지를 처리하는 부분을 메세지 루프라고 한다.

이 글은 윈도우즈 프로그래밍이 주가 아닌, 리버싱에 필요한 기초 상식에 대해 정리하기 위해 쓰여진 글입니다.

 

참고문헌

  • http://soen.kr (Win32 API 입문 강좌)