어셈블리 – MASM32 사용법

어셈블리 – MASM32 사용법

Masm32는 64비트 운영체제를 제대로 지원하지 못하므로, 가상 머신을 이용하여 32비트 운영체제에 설치하기 바란다(여기서는 일반적으로 리버스 엔지니어들이 많이 사용하는 Masm32를 통해 설명하고자 한다. 만약 32/64비트 환경에서 이용하고자 한다면, 비주얼 스튜디오에서 제공하는 파일인 VC\bin의 Ml64.exe(64비트) 혹은 Ml.exe(32비트)를 이용할 수 있지만, 어셈블리 코드 작성 방법이 Masm32와 다소 차이가 있다).

어셈블리 – MASM32 사용법

어셈블리 – MASM32 사용법

[그림] Masm32 SDK 설치 화면

그럼 Masm32를 설치하자. 필자는 C:\masm32에 설치하였다. 설치가 완료될 쯤 Masm32 에디터에 대한 단축 아이콘을 생성할 것인지 묻는데, 어셈블리 코드 작성에 큰 장점을 제공하지는 않으니 별도의 에디터를 사용하는 것이 좋다.

기본으로 제공하는 편집기나 메모장을 사용해도 되지만, Notepad++, Notepad2와 같은 무료 공개용 메모장을 사용하는 것도 괜찮다. 메모장보다 기능도 확장되어 있으며, 프로그램 코드 작성시 해당 확장자를 인식하여, 프로그램 코드를 구분해주므로 편리하다.

[그림] 무료 공개 메모장 Notepad2, 코드에 알맞게 색상을 구분해주어 편리하다

그럼 예제를 만들어 분석을 시도해보자.

여기서는 먼저 예제 프로그램을 만들어 분석해 본 후, 각 어셈블리 명령어에 대해서 알아볼 것이다. 예제 프로그램이 어렵지 않고 간단하여 큰 어려움은 없을 것이다.

그럼 이제 Masm32를 이용하여 프로그래밍 시작을 알리는 Hello World를 만들어 보자.

hellomasm.asm
; 586 PC에서 동작하는 프로그램이라는 것을 알림

.586

; model은 메모리 타입에 대한 선언으로 flat은 가상메모리를 사용하겠다는 것이다. 그리고 함수 호출 규약을 stdcall로 정한다. 함수 호출 규약은 10장 스택에서 나온다.

.model flat, stdcall

; 옵션을 지정하는데 casemap은 대소문자 구분하여 인식하라는 뜻이다.

option casemap:none

; 윈도우 함수를 호출할 수 있는 라이브러리를 포함한다.

include \masm32\include\windows.inc

include \masm32\include\kernel32.inc

include \masm32\include\user32.inc

includelib \masm32\lib\kernel32.lib

includelib \masm32\lib\user32.lib

; 여기서부터 데이터 영역으로, 데이터 세그먼트에 할당된다(스택과 다른 영역).

; .data를 쓰면 제일 먼저 변수명, 그리고 사이즈, 초기값을 적어야 한다.

.data

messagetitle db “Message”, 0

message db “Hello World! MASM32”, 0

; 여기서부터 코드 영역임을 알리고, 코드 세그먼트에 할당된다.

.code

; 코드 시작을 알린다.

start:

; MessageBoxA 함수를 호출한다.

invoke MessageBoxA, NULL, addr message, addr messagetitle, MB_OK

; 프로세스를 종료한다.

invoke ExitProcess, 0

; 코드 끝을 알린다.

end start

[예제] MASM로 작성한 Hello world

이제 설치한 Masm32를 이용하여 컴파일을 진행하도록 하자. 아래와 같은 명령을 이용하여 컴파일을 진행할 수 있다.

// 먼저 오브젝트를 생성하자. 오브젝트를 효과적으로 생성하기 위해서 몇가지 옵션을 함께 이용하면 좋다, 다음과 같이 /c 와 /coff 옵션을 이용해 컴파일만 진행하여 오프젝트 파일을 생성하고, /Zi 옵션을 통해 디버그 정보를 포함하도록 한다.

C:\masm32\masm>c:\masm32\bin\ml.exe /c /coff /Zi hellomasm.asm

Microsoft (R) Macro Assembler Version 6.14.8444

Copyright (C) Microsoft Corp 1981-1997. All rights reserved.

Assembling: hellomasm.asm

// 그리고 생성한 오프젝트 파일이 생성되면 링크를 걸어서 /subsystem 옵션으로 윈도우 서브시스템을 이용하도록 실행파일을 만들게 된다.

C:\masm32\masm>c:\masm32\bin\link.exe /subsystem:windows hellomasm.obj

Microsoft (R) Incremental Linker Version 5.12.8078

Copyright (C) Microsoft Corp 1992-1998. All rights reserved.

C:\masm32\masm>dir

C 드라이브의 볼륨에는 이름이 없습니다.

볼륨 일련 번호: EC3B-66CB

C:\masm32\masm 디렉터리

2012-03-09 오후 11:26 <DIR> .

2012-03-09 오후 11:26 <DIR> ..

2012-03-09 오후 11:22 711 hellomasm.asm

2012-03-09 오후 11:26 1,536 hellomasm.exe

2012-03-09 오후 11:26 904 hellomasm.obj

3개 파일 3,151 바이트

2개 디렉터리 2,958,901,248 바이트 남음

[실습] 어셈블리 컴파일 진행

[실습]에서 사용한 옵션들 이외에 보다 자세한 정보는 ml.exe /? 명령이나 함께 설치되는
C:\masm32\help\masm32.chm를 통해 확인해 보기 바란다.

프로그램을 컴파일이 완료되면 실행해 보자. 다음과 같은 메시지 창이 나타난다.

[그림] 예제 실행 결과

이제 우리가 알고자 하는 운영체제에서 이 Hellomasm를 어떻게 처리하는지 확인하기 위하여, 이 실행 파일을 분석하여야 한다. 실행파일은 운영체제가 실행할 수 있도록 기계어로 구성된 파일로써, 이를 분석하기 위해서는 컴퓨터가 이용하는 Opcode(기계어)에 대한 이해가 필요하다. 우리가 기계어를 바로 본다는 것은 참 어려운 일이다. 그래서 인간이 보다 쉽게 이해할 수 있도록 만든 어셈블리를 이용하여 분석을 진행하게 한다. 이 내용이 조금은 어려울 수 도 있지만 간단한 Hellomasm을 분석하다 보면 운영체제 내부에서 처리되는 기계어는 물론 어셈블리와 스택, 그리고 레지스터에 대해서도 조금은 쉽게 이해할 수 있을 것이다.

Facebook Comments

Leave A Reply

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