라이브러리(Library)
자주 사용되는 표준적인 함수(개발에 자주 쓰고 기초적인 함수)를 시간적 소모를 줄이고 신뢰성을 높이기 위해 표준화할 수 있는 함수를 미리 만들어서 모아 놓은 것
언제 메인 프로그램에 연결하느냐에 따라서 정적 링크 라이브러리(Static Link Library)와 동적 링크 라이브러리(Dynamic Link Library)로 나뉨
정적 링크 라이브러리(Static Link Library : LIB)
컴파일 시점에 라이브러리가 링커에 의해 연결되어 단일 실행 프로그램의 일부분이 되는 것을 뜻함
동적 링크 라이브러리(Dynamic Link Library : DLL)
실행 파일에서 해당 라이브러리의 기능을 사용시에만 라이브러리 파일을 참조 또는 다운로드 받아 기능을 호출하는 것을 뜻함 정적 링크 라이브러리와는 다르게 컴파일 시점에서 실행 파일에 함수를 복사하지 않고, 함수의 위치 정보만 가지고 그 함수를 호출할 수 있게 함
LIB | DLL | |
장점 | 1. 속도가 빠름 2. 작성이 간단함 3. 컴파일시에 해당 정적 라이브러리의 내용이 실행 프로그램의 일부분이 되기 때문에 함께 배포하지 않아도 됨 |
1. 메인 실행 파일의 크기가 작아짐 2. DLL에 있는 함수들을 다른 곳에서도 호출하여 쓸 수 있으므로 재사용성이 증대됨 |
단점 | 1. 실행 파일의 크기가 커짐 2. 함수의 재사용성이 코드 레벨에서만 가능함 |
1. 사용이 복잡함 2. 속도가 LIB에 비해 느릴 수 있음 3. 컴파일시에 해당 DLL의 내용이 실행 파일 안에 포함되지 않기 때문에 반드시 실행 파일 배포 시에는 라이브러리 역시 함께 배포해야만 함 |
DLL – 실습
CreateDLL 프로젝트 생성
3개의 파일 생성
dllmain.cpp 코드
DllMain의 인자
hmodule | 프로그램 메모리에 실제로 올라온 DLL의 가상 메모리 주소 값 |
ul_reason_for_call | DLL_PROCESS_ATTACH, DLL_THREAD_ATTACH, DLL_THREAD_DETACH, DLL_PROCESS_DETACH 중 하나의 값을 가짐 - DLL_THREAD_ATTACH는 DLL을 사용하는 클라이언트 프로세스에서 THREAD를 생성할 때마다 이값과 함께 DLLMain() 함수가 호출됨 - DLL_THREAD_DETACH는 DLL을 사용하는 클라이언트 프로세스에서 THREAD가 종료될 때마다 이값과 함께 DLLMain() 함수가 호출됨 |
lpReserved | - ul_reason_for_call이 DLL_PROCESS_ATTACH인 경우, DLL이 명시적 연결 방식으로 로드되면 NULL, DLL이 암시적 연결 방식으로 로드되면 not NULL의 값을 가진다. - ul_reason_for_call이 DLL_PROCESS_DETACH인 경우, FreeLibrary가 호출되었거나 DLL 로드가 실패한 경우라면 NULL, 프로세스가 종료 중이라면 not NULL의 값을 가진다. |
MyMath.cpp의 계산기 함수
MyMath.h의 계산기 함수를 명시해 주는 코드
MyMath.h에서 사용된 함수들
#ifdef CREATEDLL_EXPORTS | - CREATEDLL_EXPORTS라는 전처리기가 정의 되어 있는지 확인하는 조건문임 - 헤더파일을 DLL 생성 프로젝트와 DLL 호출 프로젝트을 따로 관리 하지 않고 같이 관리 하기 위함임 |
__declspec(dllexport) | DLL을 사용하여 함수를 호출할 수 있다고 명시 해주는 함수 |
__declspec(dllimport) | DLL을 사용하여 함수를 호출하는 함수 |
extern “C” | 네임맹글링을 수행하지 않겠다고 정의하는 것 ※네임맹글링이란 컴파일러가 함수의 이름을 일정한 규칙을 가지고 변형하는 것 |
CreateDLL을 빌드 한 후
'Reverse engineering' 카테고리의 다른 글
DLL injection (0) | 2022.02.13 |
---|---|
DLL - 2 (0) | 2022.02.13 |
메모리 구조 (0) | 2022.02.12 |
PE 구조 - 3 (0) | 2022.02.12 |
PE 구조 - 2 (0) | 2022.02.12 |