파일 포맷을 구분하는 sflock2 파이썬 모듈

파일 포맷을 구분하는 sflock2 파이썬 모듈

Overview

악성 파일을 분석하다보면 대량의 파일의 파일 포맷을 구분할 필요가 있다. 이런 상황에서 유용하게 쓸 수 있는 파이썬 모듈 sflock2 를 소개한다. sflock2 모듈은 파일 내 매직 값, 파일 확장자, MIME 타입, 등 특정 포맷의 파일이 가질 수 있는 고유한 데이터를 찾아 해당 파일의 포맷을 유추할 수 있다.

Install

파이썬 모듈이기 때문에 기본적으로 파이썬이 설치된 환경이어야 한다. 추가로 다음과 같은 명령어를 실행하여 sflock2 모듈, magic 모듈과 관련된 파일을 설치해야 한다.

Ubuntu / Debian

$ sudo apt-get install p7zip-full rar unace-nonfree cabextract lzip libjpeg8-dev zlib1g-dev zpaq gnupg
$ pip install SFlock2

Windows

> pip install SFlock2
> pip install python-magic-bin

Test code

아래 코드는 sflock2 모듈의 identify() 함수를 호출해 반환하는 간단한 코드이다.

from sflock.abstracts import File
from sflock.ident import identify
import argparse
import os


def call_sflock_identify(file: str):
    f = File.from_path(file.encode())
    try:
        package = identify(f, check_shellcode=True)
    except Exception as e:
        print(f"Error occured while identifying file. filepath:{file}, error message:{e}")
        package = "unknown"
    return package


def get_dir_files(dir_path) -> list:
    result = [os.path.join(dp, f) for dp, dn, filenames in os.walk(dir_path) for f in filenames]
    return result


if __name__ == "__main__":
    parser = argparse.ArgumentParser(description="Simple sflock launcher.")
    parser.add_argument("--input", "-i", help="input file path", type=str, required=True)

    args = parser.parse_args()

    print(f"[-] Result")
    if os.path.isdir(args.input):
        filelist = get_dir_files(args.input)
        for file in filelist:
            package = call_sflock_identify(file)
            print(f"{file}:{package}")
    else:
        package = call_sflock_identify(args.input)
        print(f"{args.input}:{package}")

사용 방법은 다음과 같다. --input 플래그로 파일 포맷을 검증할 단일 파일, 또는 디렉토리를 지정하면 된다.

usage: run_sflock.py [-h] --input INPUT

Simple sflock launcher.

options:
  -h, --help            show this help message and exit
  --input INPUT, -i INPUT
                        input file path

실행하면 다음과 같은 형식으로 결과가 출력된다.

> python .\run_sflock.py --input .\test
[-] Result
.\test\calc.exe:exe
.\test\index.js:js

파이썬 코드보다 exe 실행 파일을 선호하는 분들을 위해 pyinstaller 로 빌드된 exe 파일을 첨부하겠다. exe 파일은 pyinstaller 로 빌드되어 Windows 10 보다 낮은 버전에서는 정상적으로 실행되지 않을 수 있다.

References