Introduction
지난 시간에 약속한대로 이번 시간에는 MASM 을 이용하여 DLL을 만들고, DLL을 이용하는 방법에 대해서 설명하도록 하겠습니다. 물론 Visual Studio 2008 환경에서 설명하도록 하겠습니다.
DLL 만들기
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을 사용하는 방법에 대해서 설명하도록 하겠습니다. 사실 이것은 MASM 에 대한 이야기라기보다는 Win32에 더 가까울 것입니다. 어려운 부분이 없기 때문에, 따로 설명 드리지 않도록 하겠습니다.
DLL 사용
Test.Def 안에 LIBRARY는 *.asm 파일명을 적어 주시면 됩니다. 그리고 Exports 에는 말 그대로 Export 시킬 함수이름을 적으면 되죠. 매우 간단하죠? 자, 이제 빌드를 하면 아무 문제없이 DLL 파일이 만들어 집니다. Test.DLL 이면 좋으련만, 아무 생각없이 DllTest.dll 로 만들어 버렸습니다 =_=; 물론 마음에 들지 않으시는 분은 프로젝트 속성에서 output 을 새로 설정해 주시면 됩니다. 전 그냥 rename 하지 않고, 쭉~ 설명 하겠습니다.
빌드 설정
자, 프로젝트 속성에서 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 사용
마무리
개인적으로 저는 Assembly 를 매우 좋아합니다. 그 어떤 언어보다도 군더더기 없이 깔끔한 바이너리 파일을 만들어 주기 때문이죠. 저는 찝찝한 것을 매우 싫어합니다. 내가 만든 파일인데 실제로 binary 가 어떻게 되어 있는지 확신할 수 없죠. 하지만 assembly 는 그런 면에서 결코 프로그래머를 배신하지 않습니다. ^-^
앞으로는 MASM 프로그래밍에 대해서 포스팅을 하려고 합니다. 물론 Language 에 대해서 포스팅 한다는게 우스운 일이긴 합니다만, Assembly 프로그래밍에 대한 자료를 찾기 어려운 것이 사실입니다. 인터넷 서점을 뒤져봐도 대부분이 2000년 이전의 책들이지요. 이런 현실이 안타까운 1인으로서 assembly 를 조금이나마 알리고자 노력할 생각입니다. :) 아, Assembly 로만 완전한 프로그램을 만든다는것은 어리석은 이야기라는데 동의합니다. 하지만 많은 연산이 필요한 부분에 대해서는 assembly 만큼 좋은 언어는 없겠죠. 그리고 결정적으로 Reverse Engineering 을 위해서는 반드시 알아야 하는 언어랍니다. :)