[Malware] 악성코드 기본 정적 분석: 해시, 문자열, PE 구조와 Imports

실행 파일을 실행하지 않고 해시, Reputation, 문자열, PE 구조와 Imports를 조사해 악성코드의 행위 가설을 세우는 기본 정적 분석 과정을 정리합니다.

출처를 모르는 실행 파일을 받았을 때는 파일을 실행하기 전에 식별 정보와 내부 구조부터 살펴봅니다. 해시로 기존 분석 기록을 찾고 문자열과 Windows API를 조사하면 어떤 기능이 들어 있을지 가설을 세울 수 있습니다. 이렇게 모은 정보는 악성코드의 특성을 정리하고 Threat Intelligence와 연결하는 출발점으로 활용합니다.

알 수 없는 파일에서 시작하기

PAYMENT FOR INV.exe라는 의심스러운 Windows 실행 파일을 예로 살펴봅니다. 처음에는 악성코드 유형과 행위, 위험 수준을 모두 알 수 없는 상태입니다.

악성코드 의심 파일을 받았다고 해서 바로 VirusTotal 등으로 업로드하지 않는 것이 좋습니다. 파일을 업로드하면 내부 자료가 외부에 공유되거나 재사용될 수 있으며 악성코드가 아닌 경우 문제가 발생할 수 있습니다.

따라서 파일 전체를 보내기 전에 해시로 등록된 분석 결과가 있는지 찾는 것이 좋습니다.

기본 정적 분석은 다음 순서로 진행합니다.

  1. 악성코드 샘플 확보 및 식별
  2. 해시 계산
  3. Reputation 확인
  4. 문자열 분석
  5. PE 구조 및 섹션 확인
  6. DLL과 Imports 조사
  7. 패킹과 난독화 확인
  8. 악성코드 프로파일 정리

기본 정적 분석이란

정적 분석(Static Analysis)은 프로그램을 실행하지 않고 코드와 파일 구조를 살펴 기능과 특성을 파악하는 과정입니다.

기본 정적 분석에서는 다음 항목을 확인합니다.

정적 분석에서 기능의 단서를 발견했다고 해서 반드시 기능이 실행된다고 단정할 수는 없습니다. 실행 조건과 동작 여부는 추가 분석으로 확인해야 합니다.

악성코드 샘플 수집

이메일의 실행 파일 첨부 제한 때문에 ZIP 같은 압축 파일로 전달되는 경우도 있습니다. 압축 파일이라는 이유로 안전하다고 판단해서는 안 됩니다.

악성코드 샘플을 다루는 규칙

분석 대상의 식별 정보

예시 파일의 기본 정보는 다음과 같습니다.

파일명은 바뀔 수 있으므로 이름만으로 샘플을 구분하지 않습니다. 파일 크기와 유형을 기록하고 해시를 함께 남깁니다.

해시와 Reputation

해시는 파일의 내용을 입력으로 계산한 값으로, 악성코드 샘플을 식별할 때 널리 사용합니다. 암호화한 데이터를 복호화하는 방식과는 다르며 해시값에서 원래 파일을 되찾는 용도로 쓰지 않습니다.

PowerShell에서는 Get-FileHash로 파일의 해시를 계산할 수 있습니다. 파일명에 공백이 있으므로 경로를 따옴표로 감쌉니다.

Get-FileHash -LiteralPath '.\PAYMENT FOR INV.exe' -Algorithm SHA256

MD5 값이 필요한 기존 기록과 비교할 때는 알고리즘을 지정합니다.

Get-FileHash -LiteralPath '.\PAYMENT FOR INV.exe' -Algorithm MD5

Get-FileHash는 알고리즘을 생략하면 SHA-256을 사용합니다. 명령의 옵션과 동작은 Microsoft 공식 문서에서 확인할 수 있습니다.

예시 샘플의 SHA-256은 다음과 같습니다.

9f05a25d30b22c3d4a8da65f3ef034fc24ed35b97ed418f79d3af4def9f7ccdf

계산한 SHA-256을 VirusTotal 같은 Reputation Database에서 검색합니다. VirusTotal은 해시로 기존 파일 보고서를 검색할 수 있습니다.

VirusTotal의 결과는 판단에 참고할 정보입니다. 탐지 결과만으로 파일의 모든 기능과 행위를 확인했다고 볼 수는 없습니다.

Strings: 파일 안의 문자열

문자열 분석은 실행 파일 내부의 읽을 수 있는 문자들을 조사하는 작업입니다. Reputation 정보에 더해 파일 자체에서 단서를 찾습니다.

패킹이나 난독화가 적용되면 문자열을 그대로 읽기 어려울 수 있습니다. 코드 보호를 위해 문자열을 암호화하는 경우도 있으니 패킹, 난독화 여부로 악성을 판단할 순 없습니다.

예시 샘플에 대한 YARA 결과에는 XorStringsNET 문자열 암호화를 탐지하는 규칙이 표시되어 있습니다. 규칙의 일치는 난독화 가능성을 조사할 단서로 사용하고 문자열이 어떻게 복원되는지는 별도로 확인해야 합니다.

PE 구조와 섹션

PE(Portable Executable)는 Windows의 EXE와 DLL 등에 쓰이는 실행 파일 형식입니다. Object 파일은 관련 형식인 COFF로 구분합니다. PE에는 Windows Loader가 파일을 메모리에 올리고 실행하는 데 필요한 정보가 담겨 있습니다.

PEView 같은 도구로 헤더와 섹션을 살펴볼 수 있습니다.

섹션 일반적인 용도
.text / .code 실행 코드
.data 읽고 쓸 수 있는 초기화된 데이터
.rdata 읽기 전용 데이터
.rsrc 리소스
.reloc 재배치 정보

문자열은 데이터 영역 등에서 발견할 수 있지만 섹션 이름만으로 내용이나 행위를 단정하지 않습니다. 헤더와 섹션의 상세 구조는 Microsoft PE Format 문서를 참고할 수 있습니다.

DLL과 Imports

Windows Loader는 Import Table을 보고 필요한 DLL을 로드하고 함수 주소를 연결합니다. 프로그램이 어떤 DLL과 함수를 사용하는지 조사하면 기능을 추정할 수 있습니다.

라이브러리 연결 방식

Runtime Linking에서는 LoadLibrary, GetProcAddress 등을 사용합니다. 분석 중에는 LdrLoadDll 같은 Native API도 확인 대상이 됩니다. Microsoft의 Runtime Linking 설명에서는 DLL을 로드한 뒤 함수 주소를 구해 호출하는 흐름을 볼 수 있습니다.

Imports에서 행위 가설 세우기

Dependency Walker 등으로 DLL과 Import Function을 조사합니다. 모르는 Windows API가 나오면 문서에서 기능을 먼저 확인합니다.

API가 있다는 것만으로 다운로드와 실행이 이어진다고 단정할 수는 없습니다. 코드의 호출 관계를 살피고 동적 분석에서 파일 생성과 새 프로세스 실행 여부를 확인해야 합니다.

분석은 Static Evidence → Behavioral Hypothesis → Dynamic Verification으로 이어집니다.

주요 Windows DLL

DLL 주요 기능
Kernel32.dll 프로세스, 메모리, 파일 등 기본 시스템 기능
Advapi32.dll 레지스트리와 서비스 관리
User32.dll GUI와 사용자 인터페이스
Gdi32.dll 그래픽
Ntdll.dll Windows Native API
Ws2_32.dll 네트워크 소켓
Wininet.dll HTTP·FTP 등 인터넷 기능

패킹과 난독화

패킹과 난독화는 코드나 문자열을 읽기 어렵게 만들 수 있습니다. 문자열이 잘 보이지 않거나 Imports만으로 기능을 설명하기 어렵다면 적용 여부를 살펴봅니다.

패킹이나 난독화가 있다는 사실만으로 악성코드라고 결론 내리지는 않습니다. 확인한 식별 정보, Reputation, 문자열, PE 구조, Imports와 남은 의문을 모아 악성코드 프로파일을 정리합니다.

참고 자료