본문 바로가기
일반IT/IT보안

[실습] "너, 행동이 좀 수상한데?" 🤨 정상 파일 vs 악성 파일, API 호출 비교로 잡아내기! (AI 활용법)

by gasbugs 2025. 12. 12.

안녕하세요, 보안 연구원 여러분! 🕵️‍♂️

우리가 사람을 판단할 때, 그 사람의 '외모'만 보고 판단하지 않죠? 그 사람이 평소에 '어떤 행동'을 하는지를 봐야 진짜 성격을 알 수 있습니다.

소프트웨어(파일)도 마찬가지입니다.

겉모습(아이콘, 파일명)은 계산기(Calculator)처럼 위장할 수 있어도, 내부에서 운영체제(OS)에 요청하는 행동인 API(Application Programming Interface) 호출은 속이기 어렵습니다.

  • 정상 파일(계산기): "화면에 숫자 그려줘", "마우스 클릭 받아줘"
  • 악성 파일(랜섬웨어): "파일 목록 싹 다 가져와", "암호화해", "인터넷 연결해서 키 보내"

오늘은 정상 파일과 악성 파일의 API 호출 목록(Import Table)을 추출하고, 이를 AI에게 보여주며 "누가 범인인지 맞춰봐!"라고 질의하는 실습을 해보겠습니다.

AI가 과연 이 '행동 목록'만 보고 악성코드를 탐지할 수 있을까요? 확인해 보시죠! 🚀


1. API 호출 목록(Import Table)이란? 📋

윈도우 실행 파일(PE)은 혼자서 모든 걸 다 하지 않습니다. 파일을 읽거나, 인터넷을 하려면 윈도우 운영체제에게 "도와줘!"라고 요청해야 하는데요. 이때 사용하는 함수들이 바로 Windows API입니다.

이 파일이 "나 실행될 때 이 함수들이 필요해!"라고 적어놓은 목록을 IAT(Import Address Table)라고 부르는데, 이것만 봐도 파일의 목적을 80%는 짐작할 수 있습니다.


2. [준비] API 목록 추출하기 🛠️

추출 방법은 여러 가지(PEStudio, Ghidra 등)가 있지만, 우리는 가장 빠르고 간편한 Python 스크립트를 이용해 보겠습니다. (pefile 라이브러리 필요)

💡 Tip: Python이 없다면 'PEStudio' 같은 무료 도구에 파일을 넣고 'Imports' 탭을 긁어오셔도 됩니다!

🐍 Python 추출 스크립트 (extract_api.py)

Python

import pefile

def get_api_list(file_path):
    try:
        pe = pefile.PE(file_path)
        print(f"--- [ {file_path} ] API List ---")
        for entry in pe.DIRECTORY_ENTRY_IMPORT:
            for imp in entry.imports:
                if imp.name:
                    print(imp.name.decode('utf-8'))
    except Exception as e:
        print(f"Error: {e}")

# 실습: 정상 파일(계산기)와 악성 샘플 경로를 지정하세요
get_api_list("C:\\Windows\\System32\\calc.exe") 
get_api_list("malware_sample.exe") 

3. [데이터] 추출된 API 목록 비교 (Sample Data) 📊

스크립트를 돌려서 얻은 두 파일의 API 목록입니다. 눈으로 쓱 봐도 뭔가 느낌이 다르지 않나요?

✅ 파일 A (정상 파일: 계산기)

GetMessageW
TranslateMessage
DispatchMessageW
SetWindowTextW
DrawTextW
BeginPaint
EndPaint
LoadIconW
...

 

👉 특징: Paint, Window, Message... 주로 화면을 그리고 사용자와 상호작용(GUI) 하는 함수들이 보입니다.

⛔ 파일 B (악성 파일: 랜섬웨어 의심)

FindFirstFileA
FindNextFileA
CryptAcquireContextA
CryptGenKey
CryptEncrypt
InternetOpenA
InternetConnectA
HttpSendRequestA
WriteFile
Process32First
VirtualAllocEx
...

 

👉 특징: FindFile(파일 뒤지기), Crypt(암호화), Internet(네트워크), VirtualAlloc(메모리 할당)... 뭔가 은밀하고 공격적인 작업을 할 것 같습니다.


4. [실습] AI에게 "누가 범인이야?" 물어보기 🗣️

이제 이 목록을 그대로 복사해서 AI(ChatGPT, Claude 등)에게 판단을 맡겨봅시다.

📝 프롬프트 (Prompt)

[역할] 당신은 악성코드 분석 전문가입니다.

[상황] 나는 두 개의 실행 파일(A, B)에서 추출한 API Import 목록을 가지고 있습니다.

[요청사항]

  1. 각 파일의 API 목록을 분석하여 해당 프로그램의 주요 기능(행위)을 추론하세요.
  2. 두 파일 중 악성코드로 의심되는 파일을 지목하고, 그 근거가 되는 위협적인 API 조합을 설명하세요.
  3. 예상되는 악성 행위 유형(예: 랜섬웨어, 키로거, 인젝터 등)을 분류하세요.

[데이터]

(파일 A 목록):

GetMessageW, TranslateMessage, SetWindowTextW, DrawTextW, ... (위의 정상 목록 붙여넣기)

(파일 B 목록):

FindFirstFileA, CryptEncrypt, InternetOpenA, VirtualAllocEx, ... (위의 악성 목록 붙여넣기)


5. [결과] AI의 소름 돋는 분석 🕵️‍♀️

AI는 단순한 함수 이름의 나열을 보고 '문맥(Context)'을 읽어냅니다.

🤖 AI 분석 결과

1. 행위 분석:

  • 파일 A: 윈도우 창을 생성하고, 화면에 텍스트를 그리며, 사용자 입력을 대기하는 전형적인 GUI 응용 프로그램입니다. 위험한 기능이 보이지 않습니다.
  • 파일 B: 파일 시스템을 탐색(FindFile)하고, 데이터를 암호화(CryptEncrypt)하며, 외부 서버와 통신(HttpSendRequest)합니다. 또한 다른 프로세스의 메모리에 접근(VirtualAllocEx)하려는 징후가 보입니다.

2. 범인 지목: 🚨 파일 B (악성 의심)

3. 결정적 증거 (Suspicious API Combination):

  • 랜섬웨어 징후: FindFirstFile + WriteFile + CryptEncrypt 조합은 PC 내의 파일을 찾아 내용을 암호화하고 덮어쓰는 전형적인 랜섬웨어 패턴입니다.
  • C2 통신: InternetOpen + HttpSendRequest는 암호화 키를 전송하거나 명령을 받기 위한 네트워크 행위입니다.
  • 인젝션(Injection): VirtualAllocEx는 다른 프로세스에 악성 코드를 심을 때 자주 사용됩니다.

4. 결론:

파일 B는 랜섬웨어(Ransomware) 또는 정보 탈취형 트로이목마일 가능성이 매우 높습니다. 즉시 격리하세요!


6. 마치며: AI, 정적 분석의 훌륭한 파트너 🤝

어떠신가요? 우리는 코드를 한 줄도 보지 않고, 단지 "얘가 무슨 도구(API)를 챙겼는지" 목록만 보여줬을 뿐인데 AI는 정확하게 악성 여부를 판단했습니다.

물론 지능적인 악성코드는 API를 숨기기도(Dynamic Loading) 하지만, 이 'API 프로파일링' 기법은 초동 분석에서 가장 빠르고 효과적인 방법의 하나입니다.

여러분의 PC에 있는 찜찜한 파일이 있다면, 오늘 배운 방법으로 API 목록을 뽑아서 AI에게 한번 물어보세요! 의외의 결과를 들려줄지도 모릅니다. 👻

다음 시간에는 이론 편, "어셈블리 명령어 패턴과 C언어의 매핑 구조"를 통해 겉모습이 아닌 진짜 코드 속으로 들어가는 준비를 해보겠습니다. 기대해 주세요!