http://www.winapi.co.kr/

 

 

1.소개

스파이는 비주얼 C++과 함께 배포되는 개발 보조툴로 주로 윈도우에 대한 정보를 조사하고자 할 때 사용된다. 윈도우의 클래스 이름이나 스타일 또는 포함 관계를 조사하거나 윈도우로 전달되는 메시지를 감시하는 것이 주된 용도이며 이 툴을 사용하면 다른 프로그램의 구성이나 동작 방식에 대해 많은 것을 배울 수 있다. 이름 그대로 이미 만들어져 있는 윈도우의 정보를  몰래 살짝 들여다 보는 도구이다. 그다지 실용적이지는 않지만 스레드나 프로세스에 대한 감시 기능도 제공한다.

스파이가 제공하는 정보는 Win32 API의 표기법을 그대로 사용하므로 이 정보를 제대로 해석하려면 Win32 API에 대한 기본적인 이해가 필요하다. 예를 들어 윈도우 스타일은 WS_CHILD나 WS_VSCROLL 등으로 표기되는데 이 상수들이 어떤 의미를 가지는가를 알고 있어야 하며 윈도우 클래스의 각 멤버에 대한 이해도 필요하다. 클래스 바이트(cbClsExtra)나 인스턴스 핸들, 윈도우 프로시저같은 용어에도 거부감이 없어야 한다. 이 강좌를 읽고 있는 사람이라면 이런 기본적인 용어에 대해서는 잘 알고 있을 것이다.

비주얼 스튜디오의 모든 버전에 포함되어 있기 때문에 별도로 설치할 필요가 없으며 각 버전별로 기능상의 차이점도 거의 없으므로 한가지 버전에 대해서만 사용법을 익혀두면 된다. 이 강좌는 비주얼 스튜디오 .Net의 Spy++로 작성되었다. 비주얼 C++ 6.0에도 스파이가 있고 더 최신의 닷넷 2003에도 포함되어 있는데 사용 방법은 비슷하다.

시작 버튼을 눌러 프로그램 메뉴를 열고 비주얼 스튜디오 폴더의 Visual Studio .Net Tools를 선택하면 이 안에 Spy++이 등록되어 있으며 이 항목을 선택하면 스파이가 실행된다. 한번만 실행되는 프로그램이므로 이미 실행중이라면 실행중인 스파이로 포커스만 넘어간다. 자주 사용한다면 단축 아이콘을 만들어 놓는 것이 좋을 것이다. 스파이는 다음과 같이 생겼다.

MDI 형태로 되어 있으므로 여러 개의 뷰를 동시에 열어 놓을 수 있으나 실제 중요한 정보는 개별적인 대화상자를 통해 확인하기 때문에 MDI의 이점은 별로 없는 셈이다. 대체로 관심있는 뷰 하나만 열고 최대화해 놓고 많이 쓰는 편이다.

비주얼 C++ 6.0까지는 영문으로 되어 있었으나 7.0부터는 스파이도 한글화되어 메뉴나 대화상자의 캡션이 한글로 바뀌었다. 그러나 개발자들은 실제로 영문으로 된 전문 용어에 익숙해져 있기 때문에 번역된 캡션이 더 어색하게 느껴지기도 한다. 번역이 그다지 매끄럽지는 않지만 번역된 캡션을 보면 어떤 대상을 가리키는지 직관적으로 알 수 있는 정도이다. 예를 들어 "창 바이트"라는 말은 윈도우의 여분 바이트(cbWndExtra)라는 뜻이고 "창 프로시저"라는 말은 윈도우 프로시저의 번지라는 뜻이다. 개인적으로 이런 전문적인 프로그램은 한글화 하지 않는 것이 더 좋다고 생각한다.

타이틀 바 아래에 메뉴가 있고 그 아래에 툴바가 있으며 작업영역 아래에는 상태란이 배치되어 있어 전체적인 모양은 지극히 평범하다. 메뉴에는 스파이의 모든 명령들이 정리되어 있겠지만 대부분의 명령들이 툴바에 있으므로 이 버튼들에 대해서만 알아 두면 스파이의 모든 기능을 다 활용할 수 있다.

메뉴에 있는 명령 중 유일하게 실용성이 있는 명령은 메인 윈도우의 글꼴을 변경할 수 있는 보기/글꼴 명령밖에 없다. 디폴트 글꼴은 9포인트의 Sans Serif인데 굴림이나 바탕으로 변경할 수 있으며 글꼴의 크기도 크게 만들 수 있다. 다음은 툴 버튼에 대한 간략한 설명이다.

 

버튼

설명

 뷰를 보여준다.

프로세스 뷰를 보여준다.

스레드 뷰를 보여준다.

메시지 옵션 대화상자를 보여준다.

 찾기 대화상자를 띄운다.

메시지 기록을 시작하거나 잠시 중지한다.

메시지 옵션 대화상자를 보여준다.

지금까지 조사된 메시지 기록을 삭제한다.

조건에 맞는 프로세스스레드메시지를 검색한다.

다음 찾기

이전 찾기

 속성 대화상자를 보여준다.

새로 고침.

 

상태란은 선택된 메뉴나 툴바에 대한 간단한 도움말을 보여주는 정도의 기능밖에 없다. 겉으로 보이는 이런 것들 외에 화면 각 부분을 누르면 나타나는 팝업 메뉴가 있는데 이에 대해서는 관련 부분에서 따로 설명하기로 한다.

 


 

6.메시지 뷰

메시지 뷰는 윈도우로 전달되는 모든 메시지를 감시하여 어떤 메시지가 어떤 인수와 함께 전달되었는지를 보여준다. 프로세스나 스레드로 전달되는 메시지를 감시할 수도 있지만 주로 윈도우의 메시지를 감시하는 경우가 많다. 전달되는 모든 메시지를 순서대로 살펴볼 수 있기 때문에 디버깅과 분석시에 아주 큰 도움이 된다.

메시지 뷰를 열 때는 각 뷰의 팝업 메뉴에서 메시지 항목을 선택하면 된다. 예를 들어 메모장의 에디트 컨트롤로 전달되는 메시지를 보고 싶다면 창 뷰에서 에디트 컨트롤을 선택하고 팝업 메뉴에서 메시지 항목을 선택하면 된다. 또는 창 찾기 대화상자에서 찾기 도구를 메모장의 에디트에 떨어뜨린 후 대화상자 아래의 표시 항목을 메시지로 선택해도 된다.

 

메시지 기록이 시작되면 메시지 뷰가 열리며 여기에 해당 윈도우로 전달되는 메시지들이 순서대로 출력된다. 스파이는 메시지 감시를 위해 후킹을 사용하기 때문에 메시지를 감시하는동안에는 시스템의 전반적인 속도가 눈에 띄게 느려지는데 속도만 느려질 뿐 기능상의 문제는 없다. 윈도우로 전달되는 메시지를 일일이 감시하고 문자열로 바꾸어 출력하고 있으니 느려질 수밖에 없다. 다음은 메모장으로 전달되는 메시지들이다.

제일 왼쪽의 번호는 메시지의 일련 번호이며 두번째 칸의 16진수는 메시지를 받은 윈도우의 핸들이다. 세번째 P,R,S,s는 메시지가 전달된 방식을 나타내는 메시지 코드가 출력된다. 메시지 코드는 다음과 같다.

 

코드

설명

P

PostMessage 함수로 메시지 큐에 붙여진 메시지이다.

S

SendMessage 함수에 의해 윈도우 프로시저로 직접 전달된 메시지이다.

R

S 보내진 메시지를 처리한 결과이다메시지 처리 중에 다른 메시지를  보낼  있기 때문에 S R 중첩될  있다.

s

S 유사하되 보안상의 이유로  메시지의 처리 결과를 조사할  없다.

 

메시지 코드 다음에는 실제 전달된 메시지와 메시지의 인수들이 표시되는데 각 메시지별로 의미가 해석되어 있다. 예를 들어 WM_KEYDOWN이면 어떤 키가 눌러졌고 반복 회수는 얼마이며 스캔코드와 확장키의 상태 등이 표시되며 WM_CHAR이면 입력된 문자를 보여준다. wParam, lParam을 보여주는 것이 아니라 인수로 전달된 메시지의 논리적인 실제값을 보여주기 때문에 메시지의 의미를 파악하기가 쉽도록 되어 있다.

윈도우로 아주 많은 메시지가 전달될 뿐만 아니라 전달되는 속도가 대단히 빠르기 때문에 순식간에 수백개의 메시지가 전달된다. 그러다 보니 정작 관심있는 메시지가 너무 빨리 위로 스크롤되어 버리는 불편함이 있는데 스파이는 원하는 메시지를 자세히 살펴 볼 수 있도록 몇가지 장치를 제공한다.

우선 툴바의  버튼을 누르면 기록을 잠시 중지/재개할 수 있다. 살펴보고 싶은 메시지가 전달되었으면 메시지 기록을 일단 중지하고 목록을 살펴볼 수 있다.  버튼은 지금까지 작성한 모든 기록을 삭제하고 다시 기록을 시작하도록 한다.  버튼은 메시지 기록에 대한 몇가지 옵션을 지정하는 다음 대화상자를 보여 준다.

세 개의 페이지로 구성되어 있는데 이 대화상자에도 찾기 도구가 있으므로 대상 윈도우를 직접 변경할 수 있다. 뿐만 아니라 추가 창을 선택하면 관련있는 주변 윈도우로 전달되는 메시지도 같이 감시할 수 있다. 메시지 페이지에서는 기록 대상 메시지를 선택한다.

디폴트로 모든 메시지를 다 기록하도록 되어 있는데 여기서 관심있는 메시지만 선택하거나 불필요한 메시지는 선택 취소할 수 있다. 예를 들어 다른 메시지는 관심이 없고 키보드 관련 메시지만 보고 싶다면 Keyboard만 선택하면 된다. 또한 WM_MOUSEMOVE, WM_NCHITTEST 같은 메시지는 너무 자주 발생하므로 제외시킬 수도 있다. 출력 페이지는 메시지의 출력 형식을 지정한다.

파일에도 로그 옵션을 선택하고 파일명을 주면 메시지 기록을 텍스트 파일에도 작성해 주므로 조사가 끝난 후 파일을 열어서 볼 수 있다. 메시지 전달 속도가 너무 빠르기 때문에 화면으로 확인하기 힘든 메시지는 파일에서 정밀 검색하면 된다.

메시지 뷰가 보여 주는 정보는 아주 다양하게 활용된다. 우선 디버깅에 활용되는데 메시지가 전달되는 순서와 처리되는 과정을 자세하게 살펴 볼 수 있어 프로그램의 동작을 세밀하게 감시할 수 있다. 프로그램이 이상 동작을 한다면 그 시점이 언제인지를 스파이로 조사할 수 있으며 일단 시점이 파악되면 디버거로 해당 메시지를 집중 디버깅해 보면 된다. 또한 원치않은 메시지가 발생한다면 어떤 메시지에 의해 추가로 발생한 메시지인지, 그 순서는 어떻게 되는지를 알 수 있으며 SendMessage로 보낸 메시지를 확실히 수신했는지 확인할 수도 있다.

Win32 API를 처음 공부하는 사람에게 스파이는 또한 학습용으로도 아주 가치가 있는데 예를 들어 IME같이 메시지의 순서나 파생 관계가 복잡할 때 스파이를 활용하면 메시지의 발생 시기와 순서을 정확하게 알 수 있다.

 

반응형

+ Recent posts