기초 악성 코드 분석 4

1. Win32 API

1.1 Win 32 API 란?

  • 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 작동 원리

  1. Win32 API를 이용해 키보드 입력 가로채기
  2. 후킹(Hook) 기법 또는 GetAsyncKeyState() 같은 API 활용
  3. 입력된 키 값들을 파일 또는 서버로 전송

3.3 키로거 구현 방식

방식설명
훅 기반 키로거SetWindowsHookEx(WH_KEYBOARD_LL) 사용, 모든 키 입력을 감시
폴링 기반 키로거GetAsyncKeyState() 또는 GetForegroundWindow()를 반복 호출하여 키 입력 감지
커널 기반 키로거드라이버 수준에서 키보드 이벤트 가로채기 (탐지 어렵고 분석 난이도 ↑)
💡

보안상 위협

  • 비밀번호, 메신저 내용, 신용카드 정보 등 민감한 정보 유출
  • 탐지 어려움 → 백신이나 행동 기반 탐지 필요

3.4 키로거 탐지 및 방어

방법설명
행동 기반 탐지비정상적인 API 호출, 입력 감시 루틴 탐지
훅 모니터링후킹된 API 확인 (Hook Explorer, GMER, Process Hacker)
백신 프로그램시그니처 기반 또는 행위 기반 탐지
키 입력 무작위화 (보안 키보드)실제 입력값을 우회/난독화하여 대응

3.5 키로거 동작 분석 절차

3.5.1 정적 분석 (Static Analysis)

  • 바이너리를 실행하지 않고 분석하여 키로거 징후를 탐지

    분석 포인트

    항목설명
    사용 APISetWindowsHookEx, 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 분석

notion image
인자의미
idHook2키보드 후킹
lpfnfnKeyboardProc
hModg_hInstanceDllMain에서 저장한 DLL 핸들
dwThreadId0전역 후킹 (모든 프로세스 대상)

HookStart에서 push offset fn; lpfn 을 더블클릭

→ KeyboardProc

notion image
//디컴파일된 로직 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")) { return 1; // notepad.exe에선 키 이벤트 차단 } } } // 그 외의 경우에는 훅을 다음으로 넘김 return CallNextHookEx(hhk, nCode, wParam, lParam); }
  • 흐름 정리
    함수역할
    HookStartDLL이 로드될 때 후킹 시작
    KeyboardProc키 입력 발생 시 호출됨 → notepad.exe일 경우 키 입력 차단
    HookStop후킹 해제 (UnhookWindowsHookEx) 호출

4.1.2 IDA에서 SetWindowsHookEx가 호출될 때 사용되는 콜백 함수(lpfn) 주소를 찾아내기

  • ctrl E → line prefixes 켜기
notion image
항목
함수 이름fn (실제: KeyboardProc)
IDA에서의 시작 주소.text:10001020
함수의 RVA (Relative Virtual Address)0x1020
  • 10001020DLL 내부에서 이 함수가 시작되는 위치
  • 실제 프로그램 실행 시, 이 값은 KeyHook.dll이 메모리에 로드된 베이스 주소에 더해져야 함 (x64dbg와 IDA의 베이스 주소는 다름)
  • 최종 콜백 함수 주소(x64dbg용) : 베이스 주소+ 0x1020

4.1.3 정리

HHOOK SetWindowsHookExW( int idHook, // 어떤 이벤트를 후킹할지 HOOKPROC lpfn, // 실제 호출될 콜백 함수 HINSTANCE hMod, // DLL 핸들 DWORD dwThreadId // 특정 스레드 대상 or 전체 시스템 대상 );
인자명값 예시의미
idHookWH_KEYBOARD(2)키보드 입력 전체 감시
WH_MOUSE(7)마우스 이벤트 감시
WH_CBT(5)창 열기/닫기 등 시스템 이벤트 감시
WH_GETMESSAGE(3)메시지 루프 감시 (후킹 탐지에 자주 쓰임)
잘못된 값후킹 실패 또는 의심 행위
lpfn주소가 다른 함수다른 기능을 수행 (예: 키 저장, 전송 등)
쉘코드 또는 인젝션 주소메모리 후킹, 악성행위 가능성 ↑
hModNULL→ 전역 후킹이 불가능함 (DLL 필요)
유효한 DLL 핸들전역 후킹 가능 (SetWindowsHookEx 요구사항)
가짜 핸들→ 후킹 실패 또는 우회 시도
dwThreadId0시스템 전체 대상 후킹 (전역 후킹)
특정 스레드 ID해당 스레드에서만 후킹 적용 (보통 자기 자신)
잘못된 ID후킹 실패 가능
💡

예시 시나리오

목적인자 설정
모든 프로세스의 키보드 입력 감시idHook=2, dwThreadId=0, hMod=DLL 핸들
자기 프로세스 내 마우스 이벤트 감시idHook=7, dwThreadId=GetCurrentThreadId(), hMod=NULL
악성코드 인젝션 후 콜백 실행lpfn에 코드 인젝션된 주소 사용

4.2 x64dbg

  • 실습 실행 파일이 32bit 이므로 x32dbg 사용
  • 예상 시나리오 : IDA에서 구한 콜백 함수 주소에 중단점 설정, 메모장(cmd?)에 키보드 입력, 함수 동작 과정 관찰??

5. 예방/방지책

5.1 전역 후킹 방지 (특히 WH_KEYBOARD, WH_MOUSE)

방법설명
✅ 관리자 권한 제한후킹은 전역 대상이면 관리자 권한이 필요할 수 있음 (UAC 설정 유지)
hMod가 없는 후킹 차단hMod == NULL인데 전역 후킹이면 실패하도록 설계 (OS 기본 동작)
✅ 보안 소프트웨어(EDR, AV) 사용SetWindowsHookEx, GetAsyncKeyState 등 위험 API 호출 모니터링 가능

5.2 DLL 인젝션 및 후킹 감지

방법설명
✅ 모듈 리스트 점검EnumProcessModules, GetModuleHandle 등으로 의심 DLL 탐지 가능
✅ 코드 섹션 무결성 검사.text 섹션 체크섬 → 패치/인젝션 여부 확인
✅ API Hook 탐지IAT, EAT 검사로 함수 테이블 위변조 확인 가능

5.3 후킹 여부 탐지하는 코드 기법

기법설명
✅ API 주소 비교GetProcAddress("SetWindowsHookEx")의 실제 주소가 DLL 내 주소인지 비교
✅ 함수 원형 해시 비교PE에서 정식 API의 시작 바이트와 현재 메모리의 바이트 비교
✅ 타사 DLL 존재 여부 검사예: KeyHook.dll 같은 낯선 DLL이 user32.dll 이전에 로드됨

5.4 OS 차원 보호 기법

방법설명
✅ Windows Defender Exploit Guard후킹, 메모리 보호 우회, dll 인젝션 차단
✅ AppLocker / WDAC승인되지 않은 DLL 로딩 자체를 차단
✅ GUI App Isolation민감 GUI 앱 (키보드 입력, 금융 앱 등)에 별도 정책 적용

5.5 개발자 입장에서의 보호 방법

대상방법
내 앱 보호SetWindowsHookEx 호출 감지, UnhookWindowsHookEx로 강제 해제
외부 후킹 탐지IsDebuggerPresent, GetWindowLongPtr로 후킹 여부 감지
키보드 보안 적용금융권 앱처럼 자체 입력창 or 가상 키보드 구현

5.6 의심 동작 실시간 탐지 (EDR 방식)

탐지 항목예시
SetWindowsHookEx 사용후킹 가능성
WriteFile + 키 입력 추적키로거 가능성
DLL 동적 로딩LoadLibrary, GetProcAddress 추적
커널 후킹 시도SSDT, Inline Hook 탐지 (고급)

  • 요약
    사용 환경추천 방어 방법
    일반 사용자윈도우 보안 업데이트 + 안티바이러스 유지 + 관리자 실행 최소화
    보안 민감 앱 개발자후킹 감지/차단 로직 포함 + DLL 정합성 검증
    기업/조직EDR, WDAC, AppLocker 통한 실행 제한 및 탐지 자동화
    분석자HookChain, HookExplorer, PE-sieve 같은 도구 활용