Windows 운영체제에서 제공하는 프로그래밍 인터페이스 (API)로, 응용 프로그램이 OS 자원(메모리, 창, 입력 장치 등)을 사용할 수 있도록 도와주는 함수 집합
1.2 예시 기능
기능
대표 API 함수
윈도우 생성
CreateWindowEx()
파일 입출력
CreateFile(), ReadFile()
키보드/마우스 입력
GetAsyncKeyState(), SetWindowsHookEx()
메모리 제어
VirtualAlloc(), WriteProcessMemory()
1.3 Win32 API 사용 이유
하드웨어 직접 접근 없이도 시스템 자원 제어 가능
악성코드 제작자들도 합법적인 API를 악용하여 은밀하게 행동 가능
2. API 후킹(API Hooking)
2.1 API 후킹이란?
정상적인 Win32 API 호출을 가로채어, 자신이 만든 코드로 동작을 바꾸는 기술
2.2 목적
시스템/사용자 동작 감시 (e.g. 키 입력 감청)
보안 소프트웨어 우회
악성 행위 은폐
2.3 주요 방식
방식
설명
IAT 후킹
Import Address Table에서 함수 주소를 다른 곳으로 변경
Inline Hook
함수 시작 부분에 JMP 명령어 삽입 (원 함수 대신 내 코드 실행)
API Proxy DLL
시스템 DLL을 흉내 낸 가짜 DLL로 API 호출 가로채기
2.4 메세지 훅 (Message Hook)
Windows에서 발생하는 메시지(예: 키 입력, 마우스 클릭)를 가로채기 위해 사용하는 후킹 기법
대표 API
SetWindowsHookEx(): 훅 설치
CallNextHookEx(): 다음 훅으로 메시지 전달
UnhookWindowsHookEx(): 훅 제거
메시지 흐름에서의 후킹
사용자 키보드 입력 → Windows 메시지 생성 → 훅으로 가로챔 → 처리 또는 저장
후킹 타입 예시
후킹 타입
설명
WH_KEYBOARD
키보드 메시지 후킹 (Win9x/고전용)
WH_KEYBOARD_LL
저수준 키보드 후킹 (모든 키 입력 감시, WinNT 계열에서 주로 사용)
WH_MOUSE_LL
마우스 입력 감시
3. 키로거(Keylogger)
3.1 키로거란?
사용자의 키보드 입력을 몰래 기록하여 저장하거나 외부로 전송하는 악성 프로그램
3.2 작동 원리
Win32 API를 이용해 키보드 입력 가로채기
후킹(Hook) 기법 또는 GetAsyncKeyState() 같은 API 활용
입력된 키 값들을 파일 또는 서버로 전송
3.3 키로거 구현 방식
방식
설명
훅 기반 키로거
SetWindowsHookEx(WH_KEYBOARD_LL) 사용, 모든 키 입력을 감시
폴링 기반 키로거
GetAsyncKeyState() 또는 GetForegroundWindow()를 반복 호출하여 키 입력 감지
커널 기반 키로거
드라이버 수준에서 키보드 이벤트 가로채기 (탐지 어렵고 분석 난이도 ↑)
💡
보안상 위협
비밀번호, 메신저 내용, 신용카드 정보 등 민감한 정보 유출
탐지 어려움 → 백신이나 행동 기반 탐지 필요
3.4 키로거 탐지 및 방어
방법
설명
행동 기반 탐지
비정상적인 API 호출, 입력 감시 루틴 탐지
훅 모니터링
후킹된 API 확인 (Hook Explorer, GMER, Process Hacker)
백신 프로그램
시그니처 기반 또는 행위 기반 탐지
키 입력 무작위화 (보안 키보드)
실제 입력값을 우회/난독화하여 대응
3.5 키로거 동작 분석 절차
3.5.1 정적 분석 (Static Analysis)
바이너리를 실행하지 않고 분석하여 키로거 징후를 탐지
분석 포인트
항목
설명
사용 API
SetWindowsHookEx, GetAsyncKeyState, GetForegroundWindow, WriteFile, fopen 등 키보드/파일 관련 API 탐색
스트링 분석
"keylog.txt", "password", "logfile" 같은 문자열 포함 여부
섹션 및 리소스
.text 외에 수상한 섹션, 리소스 안에 은닉된 페이로드 확인
IAT (Import Address Table)
어떤 Win32 API를 사용하는지 빠르게 파악 가능
암호화 여부
입력값 저장 시 암호화된 로그인지 여부 확인
도구 예시
Detect It Easy (DIE): 패킹 여부 확인
PE-bear, CFF Explorer: 구조 분석
Ghidra, IDA Free: 역공학 / 함수 분석
Strings, floss: 문자열 추출
3.5.2 동적 분석 (Dynamic Analysis)
악성 실행파일을 실제로 실행하여, 키 입력 감시 여부를 확인
분석 환경 구성
가상 머신(VM) 또는 Sandbox에서 실행 (e.g. Any.Run, Cuckoo)
인터넷 차단 + 스냅샷 복원 가능 환경
분석 포인트
항목
설명
실행 행위
실행 후 키 입력 시 파일 생성, 전송, 프로세스 생성 등 모니터링
파일 모니터링
keylog.txt, log.txt, %TEMP% 등 위치에 생성되는 로그 파일 확인
네트워크
외부로 키보드 입력을 전송하는지 확인 (C2 서버 유무)
API Hook 확인
SetWindowsHookEx가 호출되는지 모니터링
메모리 덤프
메모리에서 디코딩된 문자열이나 키값 확인 가능
도구 예시
Procmon (Sysinternals): 파일/레지스트리 감시
Process Explorer, Process Hacker: 실행 중 프로세스, DLL 모니터링
API Monitor, x64dbg: API 호출 실시간 추적
Wireshark, Fiddler: 네트워크 트래픽 감시
3.5.3 후킹 확인 및 우회 분석
후킹된 API를 찾아내고, 실제 키 입력을 가로채는 과정을 파악
확인 대상
항목
설명
후킹된 함수 주소
IAT/inline hook으로 다른 위치로 리디렉션된 함수 주소 확인
후킹 종류
WH_KEYBOARD_LL, GetMessage 가로채기 등
도구
Hook Explorer
GMER
Sysinternals API Monitor
💡
분석 시 주의 사항
키로거는 민감한 정보를 다루므로 분석 환경을 격리해야 함
로그 파일이 숨겨지거나 암호화되어 있을 수 있음 → 메모리 분석 병행 필요
권한 상승(Ring0) 키로거일 경우 커널 드라이버 분석이 필요할 수 있음
4. 실습
4.1 IDA 활용
Hookmain.exe 실행시, KeyHook.dll을 로드하고, notepad.exe에 대해 키보드 입력을 가로채는 구조
4.1.1 분석
인자
값
의미
idHook
2
키보드 후킹
lpfn
fn
KeyboardProc
hMod
g_hInstance
DllMain에서 저장한 DLL 핸들
dwThreadId
0
전역 후킹 (모든 프로세스 대상)
HookStart에서 push offset fn; lpfn 을 더블클릭
→ KeyboardProc
//디컴파일된 로직LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam){if(nCode >=0){// 키보드 이벤트 중 key down만 처리if(!(lParam &0x80000000)){char filename[260];GetModuleFileNameA(NULL, filename, MAX_PATH);char* p =strrchr(filename,'\\');if(p &&!_stricmp(p +1,"notepad.exe")){return1;// notepad.exe에선 키 이벤트 차단}}}// 그 외의 경우에는 훅을 다음으로 넘김returnCallNextHookEx(hhk, nCode, wParam, lParam);}
흐름 정리
함수
역할
HookStart
DLL이 로드될 때 후킹 시작
KeyboardProc
키 입력 발생 시 호출됨 → notepad.exe일 경우 키 입력 차단
HookStop
후킹 해제 (UnhookWindowsHookEx) 호출
4.1.2 IDA에서 SetWindowsHookEx가 호출될 때 사용되는 콜백 함수(lpfn) 주소를 찾아내기
ctrl E → line prefixes 켜기
항목
값
함수 이름
fn (실제: KeyboardProc)
IDA에서의 시작 주소
.text:10001020
함수의 RVA (Relative Virtual Address)
0x1020
10001020은 DLL 내부에서 이 함수가 시작되는 위치
실제 프로그램 실행 시, 이 값은 KeyHook.dll이 메모리에 로드된 베이스 주소에 더해져야 함 (x64dbg와 IDA의 베이스 주소는 다름)
최종 콜백 함수 주소(x64dbg용) : 베이스 주소+ 0x1020
4.1.3 정리
HHOOK SetWindowsHookExW(int idHook,// 어떤 이벤트를 후킹할지HOOKPROC lpfn,// 실제 호출될 콜백 함수HINSTANCE hMod,// DLL 핸들DWORD dwThreadId // 특정 스레드 대상 or 전체 시스템 대상);