'Visual Studio'에 해당되는 글 2건

  1. 2010.03.15 MASM - DLL 만들기 (3)
  2. 2010.03.07 Visual Studio 2008 에서 MASM 개발하기 (6)

Introduction


지난 시간에 약속한대로 이번 시간에는 MASM 을 이용하여 DLL을 만들고, DLL을 이용하는 방법에 대해서 설명하도록 하겠습니다. 물론 Visual Studio 2008 환경에서 설명하도록 하겠습니다.


DLL 만들기

이 예제에서는 DllTest.dll 을 생성하고, 이를 사용하도록 하겠습니다. DllTest.dll 안에는 MsgBoxFunction 이라는 Funcion 하나가 들어 있습니다. 소스 파일명은 Test.asm 입니다. DLL을 생성하기 위해서는 Def 파일을 추가로 작성해 주셔야 합니다.

Test.asm 코드


Test.Def 코드


Test.Def 안에 LIBRARY는 *.asm 파일명을 적어 주시면 됩니다. 그리고 Exports 에는 말 그대로 Export 시킬 함수이름을 적으면 되죠. 매우 간단하죠? 자, 이제 빌드를 하면 아무 문제없이 DLL 파일이 만들어 집니다. Test.DLL 이면 좋으련만, 아무 생각없이 DllTest.dll 로 만들어 버렸습니다 =_=; 물론 마음에 들지 않으시는 분은 프로젝트 속성에서 output 을 새로 설정해 주시면 됩니다. 전 그냥 rename 하지 않고, 쭉~ 설명 하겠습니다.

빌드 설정

빌드에 앞서 설정해 주어야 할 것들이 있습니다. 그냥 빌드한다면 exe 파일이 만들어지겠죠. C++ 프로젝트에 익숙하신 분들은 별 무리없이 setting 하실 수 있을거라고 생각합니다.
자, 프로젝트 속성에서 Configuration Properties -> General 에 들어가시면 상단 화면처럼 'Configuration Type' 이라는 메뉴가 있습니다. 이곳의 타입을 화면처럼 "Dynamic Library(.dll)"로 변경해 줍니다. 우린 dll을 만들 것이기 때문이죠.


그리고 이어서 Configuration Properties -> Linker -> Input 에 "Module Definition File" 에 앞서 작성한 Def 파일명을 입력합니다. 화면 하단에 설명되어 있는 것처럼 Linker 에 /DEF: 옵션을 주기 위한 것이죠.

마지막으로 Configuration Properties -> Linker -> System 에서 SubSystem 을 "Windows (/SUBSYSTEM:WINDOWS)" 로 선택합니다.

이제 build 를 위한 모든 준비가 끝났습니다. Ctrl + Alt + B 를 눌러서 프로젝트를 Build 하면 별 무리없이 수행 되는 것을 보실 수 있습니다. 그리고 폴더로 이동하면 .dll 파일이 만들어져 있을 것입니다. ^-^

 

DLL 사용하기

앞에서 만든 DLL을 사용하는 방법에 대해서 설명하도록 하겠습니다. 사실 이것은 MASM 에 대한 이야기라기보다는 Win32에 더 가까울 것입니다. 어려운 부분이 없기 때문에, 따로 설명 드리지 않도록 하겠습니다.

DLL 사용



마무리

개인적으로 저는 Assembly 를 매우 좋아합니다. 그 어떤 언어보다도 군더더기 없이 깔끔한 바이너리 파일을 만들어 주기 때문이죠. 저는 찝찝한 것을 매우 싫어합니다. 내가 만든 파일인데 실제로 binary 가 어떻게 되어 있는지 확신할 수 없죠. 하지만 assembly 는 그런 면에서 결코 프로그래머를 배신하지 않습니다. ^-^
앞으로는 MASM 프로그래밍에 대해서 포스팅을 하려고 합니다. 물론 Language 에 대해서 포스팅 한다는게 우스운 일이긴 합니다만, Assembly 프로그래밍에 대한 자료를 찾기 어려운 것이 사실입니다. 인터넷 서점을 뒤져봐도 대부분이 2000년 이전의 책들이지요. 이런 현실이 안타까운 1인으로서 assembly 를 조금이나마 알리고자 노력할 생각입니다. :) 아, Assembly 로만 완전한 프로그램을 만든다는것은 어리석은 이야기라는데 동의합니다. 하지만 많은 연산이 필요한 부분에 대해서는 assembly 만큼 좋은 언어는 없겠죠. 그리고 결정적으로 Reverse Engineering 을 위해서는 반드시 알아야 하는 언어랍니다. :)

신고

Introduction

어셈블리(Assembly)라고 하면 보통 '너무 오래된 언어', '구닥다리 언어', '배우기 어려운 언어', '외계문자' 등의 생각을 하는 분들이 많이 있습니다. =_= 하지만 어셈블리는 알고보면 정말 재미있고, 흥미로운 언어임에 틀림 없습니다. 그리고 어셈블리는 절대 사라지지 않을 멋진 녀석입니다. O/S를 만들때도, C언어로 만들긴 하지만 kernel 은 아직도 어셈블리로 만든다고 합니다. 그만큼 강력하고 무엇이든 할 수 있는 강한놈이죠. 하지만 처음 언어가 나온지 오랜 시간이 지난만큼, 다른 언어에 비해 정보를 얻기 힘이 듭니다. 오늘은 어셈블러에는 어떤 종류가 있고, Visual Studio 에서 어떻게 개발할 수 있는 지에 대해서 알아보도록 하겠습니다.



어셈블러(Assembler)의 종류

MASM(Microsoft Macro Assembler), NASM(Netwide Assembler), FASM(Flat Assembler), GAS(GNU Assembler), YASM 등 정말 다양한 종류가 있습니다. 그럼 여기서 잠시 질문하나 드리겠습니다. 어셈블리(Assembly)는 무엇이고 어셈블러(Assembler)는 무엇일까요? 그렇습니다. 어셈블리는 언어를 말하는 것이고, 어셈블러는 compiler 를 의미하는 것입니다. 물론 어셈에서는 C언어처럼 컴파일 이라는 용어대신 Assemble 한다고 표현하며, 이 동작을 해 주는 녀석을 Assembler 라고 말합니다.

 자, 그럼 위에서 나열한 것은 Assembler 의 종류입니다. 그런데 왜 각각에 대해서 문법이 다를까요?
Assembler 마다 지원하는 platform 이 다르고, syntax 형태도 차이가 있습니다. 당연히 platform 에 따라 종류를 나누면 상당히 많은 어셈블리가 존재하지요. 인텔(Intel)의 IA-32 Assembly 도 있고, IA-64 Assembly 도 있습니다. 그 이외에 상당히 많은 종류의 어셈블리(Assembly)가 존재하지요. syntax 에는 Intel 방식과 AT&T 방식이 있습니다. 자세한 내용은 아래에서 계속 설명 드리도록 하겠습니다.


GAS(GNU Assembler)

GAS 는 약자 속에 나와 있듯이 GNU Project 에서 사용되고 만들어진 어셈블러입니다. 당연히 GCC 안에 기본적으로 사용되는 녀석이기도 하지요. Linux 에서 인라인 어셈을 해 보신 분은 GAS가 어떤 syntax 를 사용하는지 아실겁니다. 바로 AT&T 입니다. 제가 싫어하는 문법이기도 하지요 =_=; 간단히 예를 들면 MOV EAX, 80 을 MOV $80, %EAX 로 표현합니다. 전자는 AT&T 이외에 다른 syntax 인 Intel syntax 입니다. 여튼 GAS는 Free Software 이고, Cross Platform 을 지원합니다.


MASM(Microsoft Macro Assembler)

가장 많이 들어보셨을 어셈블러(Assemler)라고 생각합니다. Microsoft 에서 만들었으며, 많은 사랑을 받아온 어셈블러입니다. 64-bit 도 지원하며, syntax 는 Intel 방식을 따릅니다. 개인적으로 저는 이 syntax 가 가독성이 좋습니다. MASM 는 초기에 유료로 제공되었으며 사용하기 위해서는 별도로 설치를 해 주어야 합니다. 하지만 이제는 뮤로로 제공되며 고맙게도 Visual Studio 2008 이상 버젼부터는 기본적으로 MASM v9.0이 기본적으로 포함되어 있기 때문에 별도 설치를 해 줄 필요가 없습니다. 더불어 MASM 은 이름에서도 알 수 있듯이, 강력한 Macro 를 지원해줌으로써 프로그래머가 좀 더 편리하게 개발 할 수 있도록 지원해 줍니다. 편리하긴 하지만 때론 Assemly 의 참 모습을 잃어가는 것 같아 조금 아쉽기도 하네요. 참, 아시다시피 cross-platform 은 지원되지 않습니다 ^-^;

참고 사이트
http://www.masm32.com
http://www.movsd.com


NASM(Netwide Assembler)

80x86 platform 용으로 개발된 어셈블러입니다. 그리고 open-source 로 시작되었지요. 왜 그랬을까요? 네, 바로 Microsoft 때문입니다 -_-; 당시 Microsoft 의 MASM은 상용으로서 돈을 지불하고 사야만 했기 때문이죠. 그렇기에 MASM과 비슷한 점이 많고, 사람들의 비교 대상도 되곤 합니다. NASM의 장점은 현재는 Cross-Platform 을 지원한다는 것과 Macro(단, x86 platform에서) 를 제공한다는 것입니다. 그렇기에 일반적으로 Kernel 과 같이 O/S를 개발할 경우에 많이 사용되는 Assembler 입니다.

참고 사이트
http://www.nasm.us



이외의 Aseembler

이밖에 어셈블러(Assembler)는 다음 주소를 참고하시기 바랍니다.
JWASM : http://www.japheth.de/JWasm.html
FASM : http://flatassembler.net/
YASM : http://www.tortall.net/projects/yasm/




Visual Studio 2008 & MASM

 MASM 을 사용하기 위해서 꼭 Visual Studio 가 필요한 것은 결코 아닙니다. MASM32 v10 을 설치하면 Quick Editor 라는 IDE 툴이 제공됩니다. 그리고 IDE 없이 console 에서 얼마든지 어셈블이 기능합니다. 하지만 C++ 프로젝트에 ASM을 사용하는 거라면 아무래도 Visual Studio 2008에서 개발하는게 편하겠죠. 저는 IDE 툴을 여러개 나눠서 쓰는것이 싫어서 Visual Studio 을 사용하는 것을 선호합니다.


[ MASM32 v10 의 Quick Editor]

MASM 설치하기

Visual Studio 2005 이하의 버젼이라면 Microsoft 홈페이지에서 별도로 MASM을 다운받아 설치하셔야 합니다. 하지만 Visual Studio 2008 이상의 버젼이라면 고민할 필요가 없습니다. 기본적으로 설치되어 있기 때문이죠. T^T

Program Files\Microsoft Visual Studio 9.0\VC\bin

다음 path 에서 ml.exe 를 실행시키면 다음과 같은 output 을 보실 수 있습니다.

Microsoft (R) Macro Assembler Version 9.00.30729.01
Copyright (C) Microsoft Corporation.  All rights reserved.

usage: ML [ options ] filelist [ /link linkoptions]
Run "ML /help" or "ML /?" for more info

하지만 여기서 끝난것이 아닙니다.
Visual Studio 2008 에 MASM 이 있긴 하지만, *.inc 와 *.lib 파일은 포함되어 있지 않습니다. 다시 말해 그냥 어셈블러만 있을 뿐 필요한 몇몇 것들이 없다는 것이죠. *.inc 는 쉽게 설명하자면 함수들(*.lib)의 프로토타입을 정리해 놓은 파일입니다. kernel32.inc 파일안에는 어떤 내용이 있을지 상상이 가시나요~? 그걸 모두 일일이 타이핑 한다는 생각을 하니 끔찍하군요.
그렇습니다. 우린 기존에 있는걸 가져다 써야 합니다. -_-; 그러기 위해서는 보통 http://kipirvine.com/asm/ 에서 irvine이라고 압축된 것을 이용하거나, 저처럼 MASM32 를 다운로드 받아 include 와 lib 를 가져다 사용합니다.(MASM32 v10 의 include 와 lib 만 따로 압축해서 게시물에 올려두었습니다)
Kip Irvine 은 아마도 사람 이름입니다. 그 사람이 압축해 놓은 걸 겝니다~. 이 파일들 경로 설정은 프로젝트 속성에서 해야 하므로 밑에 Sample 설명을 할때  말씀 드리도록 하겠습니다.

Syntax Highlight 설정하기

기본적으로 Visual Studio 에서 .asm 의 확장자로 파일을 생성하면, Syntax Highlight 가 적용되지 않습니다. 상당히 불편하죠. 이를 해결하기 위한 방법은 다음과 같습니다.

1. usertype.dat 파일을 이용하는 방법
Keyword 가 들어있는 usertype.dat 파일을 생성한 뒤, \Program Files\Microsoft Visual Studio 9.0\Common7\IDE 폴더에 집어 넣습니다.(visual studio 2008 은 \Program Files\Microsoft Visual Studio 8.0\Common7\IDE)

usertype.dat 보기

이후, Visual Studio 에서 도구->옵션->텍스트편집기->파일 확장명에 asm 을 추가해 주시면 됩니다.

 


2. Addin 을 설치하는 방법

개인적으로 가장 선호하는 방법입니다. 여러가지 addin 이 있으니 본인이 마음에 드는 것을 설치하시면 됩니다. 저는 http://asmhighlighter.codeplex.com/ 를 이용합니다. MASM 뿐만 아니라 NASM 까지 지원합니다. Syntax는 x86 ASAM 을 지원합니다.


Sample Code!

이제 환경 샘플 코드를 통해서 Assemble 해 보도록 합시다.

1. 프로젝트 생성

먼저 콘솔 응용프로그램을 생성합니다. 빈 프로젝트로 말이죠.

2. 코딩~
위 그림처럼 asm 확장자를 갖는 파일을 하나 생성합니다. 그리고 아래 코드를 타이핑 해 봅시다.

더보기(HelloWitstudio.asm)



3. 빌드규칙 지정하기

코드도 타이핑하였으니, 이제 빌드를 하면 됩니다. 그냥 빌드를 하면 오류가 발생할겁니다. 왜냐면 .asm 에 대해서 빌드 방법을 지정해 주지 않았기 때문이죠. 위 그림처럼 프로젝트를 선택한 뒤, 프로젝트 -> 사용자 지정 빌드규칙 을 선택합니다. 그리고 아래처럼 ASM에 대해서 빌드 방식을 지정해 줍니다. 



5. include 파일과 lib 파일 경로 지정 / 실행

위에서 *.inc 과 *.lib 파일이 필요하다고 했던것 기억나실겁니다. 이제 이 경로를 지정해 주어야 합니다.

프로젝트 -> 속성 -> 구성속성 -> 일반 을 보면 위와 같이 '추가 라이브러리 디렉터리' 라는 곳이 있습니다. 이곳에 lib의 상위 path 를 적어주시면 됩니다. 그림의 경우 D:\masm32\lib 에 라이브러리 파일들이 있으므로 D:\masm32 라고 적어주었습니다.

그리고 Microsoft Macro Assembly -> General 에서 Include path 를 적어줍니다. 이 부분의 본인의 편의에 따라 맞게 적어주시면 됩니다.
저의 경우 D:\masm32\include 안에 *.inc 파일이 있습니다. 만약 위에 그림처럼 D:\masm32 라고 적는다면 코드에서는 "INCLUDE include\windows.inc" 라고 적어주어야 합니다. 같은 이치로 코드에서 include masm32\include\windows.inc 형태로 작성하고 싶다면, 위에 화면에서 D:\ 라고만 적어주시면 됩니다.


이후 F5를 눌러 실행하면 성공적으로 MessageBox를 보실 수 있습니다.



정리

오늘의 포스팅 주제는 사실 'ASM으로 DLL 을 만들어 활용하기' 로 기획했습니다. 하지만 이것저것 주저리 주저리 적다보니 내용이 너무 길어졌군요. ㅠ.ㅜ 항상 이런 식인것 같습니다. 왜 항상 글을 쓰기 시작하면 삼천포로 빠지든가, 쓸모 없는 내용이 길어지나 모르겠습니다. 여튼 각설하고 다음에는 정말 처음 기획한 주제에 대해서 포스팅하도록 하겠습니다. ^-^;



신고