악성코드와 백신/악성코드 개발일지

[악성코드 개발](4)[DLL]

황올뱀 2026. 2. 27. 13:58

DLL

여러 응용 프로그램에서 동시에 사용할 수 있는 실행가능한 함수 or 데이터의 공유 라이브러리
-> exe와 달리 자체적으로 코드를 실행할 수는 없다

  • 장점
    코드 모듈화
    코드 재사용
    효율적인 메모리 사용

핵심 dll들은 거의 모든 윈도우 프로세스에서 사용된다.
-> 따라서 한 물리공간에 매핑하고 가상주소에서 여기를 가리키도록 한다
-> 즉, 하나의 프로세스에서 dll의 특정 함수 주소를 알아내면 모든 프로세스에서도 그 주소는 동일하다
예) kernel32.dll, ntdll.dll, user32.dll 등

 

DLL 만들기 & 실행


visual studio에서 cpp파일 만드는 것처럼 새 프로젝트에서 dll을 선택하면 템플릿이 생성된다.

DLL 진입점

  • DLL_PROCESS_ATTACH: 프로세스가 DLL을 로드
  • DLL_THREAD_ATTACH: 프로세스가 새 스레드를 생성
  • DLL_THRAED_DETACH: 스레드가 정상 종료됨
  • DLL_PROCESS_DETACH: 프로세스가 DLL 언로드

함수 내보내기
호출하는 프로그램에서 사용할 수 있는 함수를 정의할 수 있음

// dllmain.cpp : DLL 애플리케이션의 진입점을 정의합니다.
#include "pch.h"
#include <Windows.h>

// extern __declspec(dllexport): export directory에 등록시킴
extern __declspec(dllexport) void Helloworld() {
    MessageBoxA(NULL, "hello, world!", "my dll message", MB_ICONINFORMATION);
}

// dll entry point
BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;
}

 

exe에서 dll 불러오기
이건 c프로젝트에서 수행하자

#include <Windows.h>
#include <stdio.h>

typedef void (WINAPI* HelloworldFunctionPointer) ();

int main() {
    // dll 불러오기
    HMODULE hModule = GetModuleHandleA("Dll1.dll");
    if (hModule == NULL) {
        hModule = LoadLibraryA("Dll1.dll");
    }

    // dll 함수 가져오기
    PVOID pHelloWorld = GetProcAddress(hModule, "Helloworld");
    HelloworldFunctionPointer Helloworld = (HelloworldFunctionPointer)pHelloWorld; // 함수 형변환도 해줘야 함!

    // dll 함수 호출
    Helloworld();

    return 0;
}

번외

따로 exe파일을 만들지 않고도 rundll32.exe를 사용해 dll을 실행할 수 있다

extern "C" __declspec(dllexport) 
void CALLBACK 함수이름(HWND hwnd, HINSTANCE hinst, LPSTR lpszCmdLine, int nCmdShow) 
{
    // 실행할 코드
}

이런 형식을 사용하면 rundll32.exe로 dll을 실행할 수 있다.

rundll32.exe Dll1.dll,Helloworld

 

반응형