문제를 풀 때 사용했던 코드를 분석해보자

#include "stdio.h"
#include "windows.h"
#include "conio.h"
- stdio.h: 표준 입출력 함수들 (예: printf) 사용
- windows.h: Windows API (예: LoadLibrary, FreeLibrary) 사용
- conio.h: 콘솔 입출력 관련 함수 (_getch 등)
void main() {
HMODULE hDll = NULL;
- HMODULE: Windows에서 모듈(DLL)의 핸들을 저장하는 타입
- hDll = NULL;: 처음에는 아무 DLL도 로드하지 않은 상태
hDll = LoadLibraryA("prob_rev.dll");
- "prob_rev.dll" 파일을 현재 경로 또는 시스템 경로에서 찾아 메모리에 로드
- ANSI 버전 함수 사용 (LoadLibraryA), 유니코드는 LoadLibrary
if (hDll == NULL) {
printf("Failed to load dll");
return;
}
- 로드에 실패했다면 (예: 파일이 없거나 오류 발생 시),
- 에러 메시지를 출력하고 프로그램 종료
printf("Success to load library");
while (_getch() != 'q');
- DLL을 성공적으로 로드한 경우 메시지 출력
- q 키를 누를 때까지 대기 (콘솔 유지)
FreeLibrary(hDll);
}
- 사용이 끝난 DLL을 메모리에서 해제
- 리소스 누수 방지
-> 위와 비슷한 코드가 DLL 후킹 테스트, 리버스 엔지니어링, 디버깅 등의 목적으로 주로 사용된다.
dll 파일이란?
DLL(Dynamic Link Library) 파일은 동적 연결 라이브러리 파일로, Windows 운영 체제에서 사용하는 실행 파일 형식 중 하나
DLL 파일은 .exe 파일과 유사한 구조를 가지지만, 단독으로 실행되지는 않는다. 대신, 다른 실행 파일이나 DLL 파일에 의해 호출되어 기능을 제공한다. DLL 파일은 다음과 같은 구조적 요소로 구성된다:
- 헤더(Header): 파일의 시작 부분에 위치하며, 파일 형식과 구조에 대한 정보를 포함한다.
- 데이터 디렉터리(Data Directory): 데이터 및 코드 세그먼트의 위치를 나타내는 테이블이다.
- 코드 세그먼트(Code Segment): 실행 가능한 코드가 포함된 부분이다.
- 데이터 세그먼트(Data Segment): 전역 변수와 상수 데이터가 저장된 부분이다.
- 수정할 수 있는 데이터(Mutable Data): 런타임에 변경 가능한 데이터이다.
DLL 파일이 로드되면, 운영 체제는 해당 DLL 파일의 함수를 호출할 수 있도록 메모리에 매핑한다. 이 과정은 보통 **로드 타임 로딩(load-time loading)**과 **런타임 로딩(run-time loading)**으로 나뉜다. 로드 타임 로딩은 응용 프로그램이 시작될 때 DLL 파일을 메모리에 로드하는 방식이고, 런타임 로딩은 응용 프로그램이 실행 중일 때 필요에 따라 DLL 파일을 로드하는 방식이다.
'swuforce' 카테고리의 다른 글
| [워게임] baby-union (0) | 2025.09.23 |
|---|---|
| [기술스터디] Story of H2 2023: A Deep Dive into Data Leakage and Commerce in Chinese Telegram Channels (1) | 2025.09.23 |
| [워게임]Inject me!!! (0) | 2025.05.20 |
| [Medium]Detailed Analysis of DocSwap Malware Disguised as Security Document Viewer (0) | 2025.05.17 |
| [워게임_스터디]Carve Party (0) | 2025.05.13 |