Introduction


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


DLL 만들기

이 예제에서는 DllTest.dll 을 생성하고, 이를 사용하도록 하겠습니다. DllTest.dll 안에는 MsgBoxFunction 이라는 Funcion 하나가 들어 있습니다. 소스 파일명은 Test.asm 입니다.
Extern 함수를 추가시키려면 Def 파일을 추가로 작성해 주셔야 합니다.
다시말해 Def 파일이 없으면 dll 은 생성되지만, 외부에서 사용할 수 있는 Export 함수가 만들어지지 않습니다.

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 을 위해서는 반드시 알아야 하는 언어랍니다. :)