악성코드 분석을 하기 위해, 악성코드의 주요행위와 윈도우의 관련 개념을 살펴 본다.
악성코드 주요 행위 목록
악성코드는 다양한 목적과 방식으로 동작하지만, 일반적으로 다음과 같은 주요 행위들을 공통적으로 나타낸다. 따라서 악성코드 분석시, 주의깊게 살펴보게되는 대표적인 행위목록은 다음과 같다.
분류 | 주요 행위 | 설명 |
1. 권한 상승 및 은닉 | 루트킷 설치 | 시스템의 핵심 영역을 은폐하여 탐지 회피 *루트킷 : Root (최고 권한) + Kit (도구 모음) → 시스템의 루트 권한을 탈취하거나 유지, 그리고 자신 또는 다른 악성코드의 존재를 은폐하기 위한 도구 세트 |
UAC 우회 | 사용자 계정 컨트롤 우회로 관리자 권한 획득 | |
보안 솔루션 무력화 | 백신, EDR, 방화벽 등의 종료 또는 우회 | |
정상 프로세스 위장 | 예: svchost.exe, explorer.exe 등의 이름 사용 | |
2. 파일 및 레지스트리 조작 | 악성 파일 생성 | %APPDATA%, %TEMP%, ProgramData 등 은신 위치 활용 |
자동 실행 등록 | Run, RunOnce 레지스트리, 작업 스케줄러 등 | |
드롭퍼 기능 | 추가 악성 파일 다운로드 및 실행 | |
파일 암호화 | 랜섬웨어의 핵심 행위 | |
3. 네트워크 통신 | C2 서버 연결 | 명령 수신, 데이터 유출 등의 목적 *C2서버 : Command and Control Server -> 악성코드에서 거의 심장같은 역할을한다. 악성코드가 단독으로 모든 걸 결정하지 않고, C2로부터 명령을 받아 움직이는 구조. |
백도어 포트 리스닝 | 외부 제어 가능 상태 유지 | |
DDoS 공격 | 좀비 PC로 활용해 서비스 마비 유도 | |
4. 정보 수집 | 키로깅 | 키보드 입력 기록 |
클립보드 모니터링 | 암호, 지갑 주소 등 감시 | |
시스템 정보 수집 | OS, IP, 사용자 정보 등 | |
브라우저 정보 탈취 | 저장된 비밀번호, 쿠키 등 | |
5. 사용자 감시 | 화면 캡처 | 주기적 또는 이벤트 기반 스크린샷 |
웹캠/마이크 제어 | 사용자 모니터링 | |
사용자 파일 탐색 | 특정 파일 유형 수집 및 유출 | |
6. 자기 복제 및 확산 | USB 전파 | autorun.inf 등으로 이동식 디스크 감염 |
네트워크 드라이브 전파 | 공유폴더, SMB 취약점 이용 | |
이메일 전파 | 매크로 포함 문서 등으로 스팸 유포 | |
취약점 악용 | EternalBlue, Log4Shell 등 자동 감염 | |
7. 안티 분석/탐지 우회 | 가상환경 탐지 | VMware, VirtualBox 탐지 후 비활성화 |
디버거 탐지 | 분석 도구 실행 여부 감지 및 종료 | |
시간 지연 실행 | 분석 시스템 타임아웃 우회 | |
문자열 암호화/난독화 | 분석 방해 및 탐지 회피 |
주요 단어 및 개념 정리
C2서버 | 서비스 | |
윈도우API | 소켓 | |
핸들 | dll | |
레지스트리 |
📌 C2서버
Command and Control Server -> 악성코드에서 거의 심장같은 역할을한다.
악성코드가 단독으로 모든 걸 결정하지 않고, C2로부터 명령을 받아 움직이는 구조.
C2 서버와 감염된 시스템의 관계
[악성코드 감염 PC] <------> [ C2 서버 ]
↘ ↗
[ 다른 감염된 시스템들 ]
C2 통신 방식
- HTTP/HTTPS: 일반 웹 트래픽처럼 위장
- DNS 터널링: DNS 요청을 악용해 명령 전달
- 소셜 미디어: 트위터, 텔레그램, 디스코드 등으로 명령 삽입
- P2P 구조: 탈중앙화된 C2로 추적 어렵게 함
- Tor 등 다크웹: 익명성 확보
보안에서의 중요성
C2 통신을 차단하거나 분석하면 악성코드 무력화 가능
그래서 보안 솔루션이나 IR(Incident Response)에서는
- C2 도메인 차단
- 트래픽 분석 (IDS, Proxy, SIEM 등 활용)
- 메모리/네트워크 포렌식
이런 식으로 C2 통신 흔적을 추적하는 게 핵심
💀 실제 악성 사례
Emotet | HTTP | 명령어 기반 모듈 다운로드 |
TrickBot | HTTPS + 암호화 | 유연한 명령 수신 구조 |
Lazarus 계열 | 자체 프로토콜 + 다크웹 | APT에 활용됨 |
📌 윈도우 API
- 악성코드 대부분이 윈도우즈 API를 이용하여 동작함. (파일 생성, 프로세스 실행, 메모리 조작, 네트워크 통신, 레지스트리 접근 등)
* API 란 ? Application Programming Interpace : 소프트웨어간 통신을 위한 상호 규약
- 정적/동적 분석에 필수 :
(정적분석) 디컴파일된 코드에서 CreateRemoteThread, VirtualAllocEx, RegSetValueEx 와 같은 API를 보면 대략 뭘 하는 코드인지 감 잡을 수 있음.
(동적분석) API 후킹, API모니터링 툴(API Monitor, x64dbg 등)에서 어떤 API가 호출됐는지 보면 악성행위 취적 가능
📌 핸들
- 핸들(handle)은 단순한 리소스 식별자를 넘어, 권한 상승, 정보 유출, 프로세스 제어 등의 공격 벡터로 악용될 수 있기 때문에 중요하게 다뤄짐.
**"핸들"은 시스템 리소스(자원)에 접근하기 위한 **식별자(번호나 포인터)**
보통은 파일, 창, 네트워크 연결, 프로세스, 쓰레드 등에 대해 사용됨.
쉽게 말하면?
핸들 = 리소스를 간접적으로 조작할 수 있는 "열쇠" 또는 "영수증"
- 예를 들어 운영체제에 "이 파일 좀 열어줘"라고 요청하면,
- OS는 해당 파일을 메모리에 올리고,
- 당신에게 **파일 핸들(Handle)**을 줍니다.
- 그 핸들을 이용해서 파일을 읽고, 쓰고, 닫는 등의 작업을 수행.
❗ 즉, 핸드는 리소스 자체가 아니라, 그걸 조작할 수 있는 키에 해당.
💡 실제 예시
✅ Windows API
- CreateFile → 파일을 열고 HANDLE을 리턴함
- hFile 핸들을 통해 해당 파일을 계속 조작
✅ Python (비슷한 개념)
- 여기서 f도 일종의 핸들처럼 작동함
- OS 레벨에서는 내부적으로 파일 핸들을 할당받아 사용 중
핸들이 사용되는 대표 리소스
리소스 종류 | 설명 |
파일 핸들 | 파일 열기/쓰기 |
프로세스 핸들 | 다른 프로세스 제어 |
윈도우 핸들 | 윈도우 창 조작 (GUI) |
쓰레드 핸들 | 쓰레드 중지/재개 |
소켓 핸들 | 네트워크 연결 |
왜 핸들을 쓰는 걸까?
- 직접 접근 금지: 리소스는 커널이 보호 중 → 직접 접근은 위험
- 안정성 보장: 핸들로만 조작 가능 → 시스템 보호
- 추상화: 내부 구조 몰라도 사용 가능
📌 파일시스템 함수
- 악성코드가 시스템과 상호작용하는 가장 일반적인 방식이, 파일을 생성하거나, 파일명을 구별하거나, 기존파일명을 변경하는 동작.
- 파일을 생성해 그 파일에 웹브라우징 내용을 저장한다면, 해당 스파이웨어 형태일 가능성이 높음.
파일시스템 함수 예시
CreateFile : 기존의 파일, 파이프, 스트림, I/O 장치를 열고 새로운 파일을 생성
dwCreationDiposition : 이 함수가 새로운 파일을 생성하는지, 기존 파일을 오픈하는지 여부 제어
ReadFile, WriteFile : 두 함수 모두 파일을 스트림 형태로 운영, 파일에서 몇바이트를 읽고 나면 그 다음 몇 바이트를 읽는 형식
**CreateFileMapping : 파일을 디스크에서 메모리로 르드
**MapViewOfFile : 매핑된 베이스 주소포인터를 반환, 메모리 내 파일에 접근, 파일 포맷 파싱에 용이
기타 파일시스템
특수파일 :
- 드라이브 문자오 폴더명으로 접근할 수 없는 파일도 존재
공유파일 :
- \\ServerName\Share , \\?\WerverName\Share 로 시작하는 이름을 가짐.
- 네트워크 상에 저장된 공유 폴더에서 디렉터리나 파일에 접근
네임스페이스를 통해 접근 가능한 파일 :
- 운영체제 내에서 네임스페이스를 통해 접근
- 네임스페이스 : 고정된 숫자의 폴더와 각각 저장하는 다른 유형의 객체
- Win32 장치 네임스페이스는 접두사 \\.\를 이용 --> 물리적 장치에 접근하여 파일처럼 읽음
ex)
파일 시스템을 무시하여 PhysicalDisk1 , Physical Memory에 바로 접근하기 위해 \\.\PhysicalDisk1, \Device\PhysicalMemory를 사용.
--> 파일을 직접 생성
--> 비할당 영역에 악성코드 생성 (백신 우회)
ADS ( Alternate Data Streams ) : NTFS 내의 기존 파일에 데이터를 추가 하는 기능 제공
- 한 파일에 다른 파일을 추가
- 추가 데이는 디렉터리 목록에 나오지 않고, 파일 내용 출력이 안됨
- ADS데이터는 normalFile.txt:Stream:$Data 라는 규칙을 가짐
ex)ADS를 사용한 프로그램 감추기 및 실행 실습
C:\ > type C:\windows\system32\notepad.exe > c:\windows\system32\calc.exe.notepad.exe
C:\ > Start c:\windows\system32\calc.exe:notepad.exe
📌 윈도우 레지스트리
- 운영체제와 설정이나 옵션같은 프로그램 구성 정보를 저장
- 수직구조의 정보 데이터베이스에서 --> 레지스트리를 통 성능 향상 .
- 레지스트리를 활용하는 악성코드
--> 영구 데이터 , 설정 데이터 저장
--> 컴퓨터 부팅시마다 자동으로 동작할 수 있게 수정
레지스트리 구성 값
root key : 다섯가지 최상위 부분으로 나누어짐. HKEY or 하이브 라는 용어를 사용
subkey : 폴더 내의 서브폴더 역할
key : 레지스트리 내 폴더, 키 or 폴더 or 값 저장
value entry : 순차적인 이름과 값 쌍
value or data : 레지스트리 엔트리 내에 저장된 데이터
* 다섯가지 루트키 종류
1 HKEY_LOCAL_MACHIN (HKLM) : 시스템 전역 설정 저장
2 HKEY_CURRENT_USER (HKCU) : 현재 사용자에 특화된 설정 저장
---> 자동실행 메커니즘이 주로 위 두개 위주로 사용됨.
3 HKEY_CLASSES_ROOT : 정의한 유형 정보를 저장
4 HKEY_CURRENT_CONFIG : 현재 하드웨어 구성 , 히 현재 설정과 표준설정의 차이를 저장
5 HKEY_USERS : 기본 사용자, 새로운 사용자, 현재 사용자의 설정을 정의.
regedit : 레지스트리 편집기
자동실행 프로그램이 주로 자주 사용되는 디렉토리
내컴퓨터\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentBersion\Run
레지스트리 API
악성코드에서 레지스트리를 수정할 목적으로 사용하는 윈도우 API
RegOpenKeyEx : 레지스트리 오픈
RegSetValue : 레지스트리에 새로운 값 추가, 데이터 설정
RegGetValue : 레지스트리의 값 데이터반
* reg.exe 를 커맨드창에서 실행하여 사용할 수 있다.
.reg 파일을 이용한 레지스트리 스크립트
- reg. 확장자를 가진 파일은 가독성이 있는 레지스트리 데이터를 포함.
- 더블클릭하여 실행하면 담고 있는 정보를 자동으로 레지스트리로 병합해 수정
ex).reg파일 샘플
Windows Registry Editor Version 5.00
[HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run]
"MaliciousValue" = "C:\Windows\evil.exe"
📌 서비스
- 서비스에 등록되면, 자동실행모드를 제어할수 있으며, System 권한을 갖고 움직이므로 많은 영향을 갖고있어, 서비스에 등록된 악성코드들은 주의를 기울여야 한다.
- 악성코드가 새로운 코드를 실행하는 또 다른 방식으로 서비스로 설치하는 방법이 있음.
- 백그라운드 애플리케이션으로 실행하는 서비스를 사용 --> 프로세스나 스레드 없이 실행
: 코드가 스케줄링돼 사용자 입력 없이 윈도우 서비스 관리자가 실행.
*서비스 사용 장점
- system권한으로 실행 --> administrator나 사용자 계정보다 상위 권한 -
- 운영체제 시작시 자동으로 실행 --> 로그인보다 먼저 실행됨
- 작업관리자(TaskManager)에 프로세스가 보이지 않을 수 있음.
서비스 API
- OpenSCManager: 서비스 제어 관리자에 핸들 반환
- CreateService : 신규 서비스로 등록, 부팅 시 서비스의 자동/수동 시작 여부를 호출자가 지정
- StaratService : 서비스를 시작하고 서비스가 수동으로 시작하게 설정되어 있을 때만 사용
서비스 제어 SC.exe
서비스 API 대신, SC.exe를 사용할 수 있다. 윈도우에 기본적으로 세팅되어 있는 프로그램
등록 : sc create [서비스명] binpath = [서비스 파일 경로]
시작 : sc start/stop [서비스명]
삭제 : sc delete [서비스명]
조회 : sc query [서비스명]
Autoruns : sysinterals 에서 제공하는 프로그램
- 운영체제 시작시 자동으로 실행되는 코드 목록화
- IE, 다른프로그램으로 로드되는 DLL , 커널로 로드되는 드라이버 목록화
- 자동으로 코드가 실행되는 25~30군데 위치를 조사
- 전체 리스트가 아닐 수 있음. --> 다양한 툴을 사용하여 정보 파악 필요.
📌 소켓
- 네트워크 상에서 데이터를 주고받기 위한 프로그래밍 인터페이스(API)
- 대부분의 사이버 공격이 네트워크 통신을 기반으로 이루어지기 때문에 알아야함.
- 백도어, 리버스 쉘, C2 서버 등이 소켓으로 통신
- 악성코드가 어떤 IP로 데이터를 보내는지, 어떤 포트를 여는지 등을 분석하려면 소켓의 동작 원리를 이해햐야함.
버클리 호환 소켓
- 오늘날 대부분의 OS에서 거의 표준으로 사용되는 네트워크 프로그래밍 인터페이스.
- 버클리 호환 소켓 네트워크 기능은 Winsock 라이브러리에서 주로 ws2_32.dll 에 구현
- 버클리 호환 소켓 네트워크 함수
Socket : 소켓 생성
bind : 호출전, 특정 포트에 소켓 할당
listen : 소켓이 인바운드 연결을 위해 리스닝하고 있음을 나타냄
accept : 외부 소켓 연결을 오픈하고 연결을 받아들임
connect : 연결을 외부 소켓으로 오픈하고 외부 소켓은 연결을 기다림.
recv : 외부 소켓에서 데이터를 수신
send : 외부 소켓으로 데이터 발송
네트워크 동작방식
Server | Client | *Server : 요청대기 , Client : 요청하는 주체 | |
WSAStartup () | WSAStartup () | 초기화 함수, 여기서부터 네트워크 동작을 수행하기 떄문에 BP를 선언하면 유 | |
WSASocket() | WSASocket() | 소켓 생 | |
bind() | 주소 정하는 함수 (IP, 포트 등 정의) | ||
Listen() | 요청이 오는지, 안오는지 모니터링 과 | ||
WSAAccept() | <-------- | WSAConnect() | client: 연결요청 ---> server : 연결승낙 |
WSARecv() | <-------- | WSASend() | 데이터를 주고받음 |
WSASend() | --------> | WSARecv() | 데이터를 주고받음 |
close() | <-------> | close() | 연결 종 |
WSACleanup() | WSACleanup() | 소켓 종료 |
WinINet API
- Winsock API보다 상위수준의 API
- Wininet.dll 에 저장
- HTTP, FTP와 같은 프로토콜 구현
함수
internetOpen : 인터넷 연결 초기화
internetOpenUrl : URL에 연결할 때 하용 (HTTP 페이지나 FTP 리소스에 사용할 수 있음)
internetReadFile : ReadFile 함수 같이 프로그램이 인터넷에서 다운로드 한 파일에서 데이터를 읽음
📌 DLL
- Dynamic Link Library : 동적 링크 라이브러리
운영체제(주로 Windows)에서 여러 프로그램이 공통으로 사용할 수 있도록 만든 함수나 자원들의 집합.
- 확장자: .dll
- 예시: user32.dll, kernel32.dll, ntdll.dll
- 기능: 프로그램이 실행 중 필요한 함수들을 DLL로부터 "동적으로" 불러와 사용함
예: 메시지박스 출력 → user32.dll의 MessageBox() 호출
악성코드 제작자가 DLL을 이용하는법
악성코드 저장용 | exe 파일은 하나만 가지기 때문에, dll 사용하여 다른 프로세스에서 실행가능하도록 조작 |
윈도우 dll 사용 | 거의 모든 악성코드가 윈도우 dll 사용 |
외부 dll 사용 | 다른 프로그램과의 상호동작을 위해 외부 dll 사용 ex) 팀뷰어dll |
파이어폭스의 dll 이용 | 윈동 api를 활용하지 않고 간접 다운로드 |
📌 프로세스
새로운 프로세스를 생성 | --> 현재프로그램의 외부에서 코드를 실행시킴 |
기존 프로세스를 변형 |
새로운 프로세스를 생성하는 윈도우 API
CreateProcess API
📌 쓰레드 ( Thread )
- 프로세스 안에서 실제로 작업을 수행하는 실행 단위.
악성코드에서 쓰레드는?
하나의 프로세스는 여러 개의 쓰레드를 가질 수 있음
쓰레드는 같은 자원을 공유하며, 병렬 처리를 가능하게 해 줌
악성코드는 이 구조를 이용해 은밀한 백그라운드 실행이나 멀티 기능 수행을 구현함
쓰레드 사용 목적별 유형
목적 | 설명 |
지속 실행 | 백그라운드에서 계속 감시/실행되는 루틴 |
코드 주입 | 자식 프로세스에 쓰레드 만들어 코드 실행 (e.g. CreateRemoteThread) |
은폐용 | 메인 쓰레드는 정상, 백그라운드 쓰레드는 악성 행위 수행 |
멀티 페이로드 | 동시에 키로깅 + C2 통신 + 화면 캡처 등 실행 *키로깅 : 사용자가 키보드로 입력하는 모든 키 입력을 몰래 기록하는 악성 행위 |
관련 윈도우 API
CreateThread | 현재 프로세스에 쓰레드 생성 |
CreateRemoteThread | 다른 프로세스에 쓰레드 생성 (코드 주입에 사용됨) |
ExitThread | 쓰레드 종료 |
SuspendThread / ResumeThread | 일시 정지 / 재개 |
'정보보안 > 악성코드 분석가' 카테고리의 다른 글
윈11에서 VMWare vcpu-0 에러 (0) | 2025.04.28 |
---|---|
[PE파일 분석 실습] 프로세스 인젝션을 수행하는 MW 분석 (0) | 2025.04.28 |
PE 파일 분석 개요 (1) | 2025.03.30 |
악성코드 유형 (0) | 2025.03.16 |
가상머신 및 응용프로그램 설치 (0) | 2025.03.16 |