파일 포맷을 구분하는 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 보다 낮은 버전에서는 정상적으로 실행되지 않을 수 있다.