diff --git a/floss/const.py b/floss/const.py index 336988083..24140f7df 100644 --- a/floss/const.py +++ b/floss/const.py @@ -3,7 +3,7 @@ KILOBYTE = 1024 MEGABYTE = 1024 * KILOBYTE MAX_FILE_SIZE = 16 * MEGABYTE -SUPPORTED_FILE_MAGIC = {b"MZ"} +SUPPORTED_FILE_MAGIC = {b"MZ",b"\x7fELF"} MIN_STRING_LENGTH = 4 MAX_STRING_LENGTH = 2048 diff --git a/floss/main.py b/floss/main.py index 0e5ccdc2c..40b76b1a6 100644 --- a/floss/main.py +++ b/floss/main.py @@ -69,6 +69,9 @@ class StringType(str, Enum): TIGHT = "tight" DECODED = "decoded" +class FileType(): + PE = False + ELF = False class WorkspaceLoadError(ValueError): pass @@ -356,6 +359,10 @@ def select_functions(vw, asked_functions: Optional[List[int]]) -> Set[int]: return asked_functions_ +def get_file_type(sample_file_path: Path): + with sample_file_path.open("rb") as f: + magic = f.read(4) + return magic def is_supported_file_type(sample_file_path: Path): """ @@ -363,10 +370,13 @@ def is_supported_file_type(sample_file_path: Path): :param sample_file_path: :return: True if file type is supported, False otherwise """ - with sample_file_path.open("rb") as f: - magic = f.read(2) + magic = get_file_type(sample_file_path) if magic in SUPPORTED_FILE_MAGIC: + FileType.ELF = True + return True + elif magic[:2] in SUPPORTED_FILE_MAGIC: + FileType.PE = True return True else: return False @@ -398,7 +408,8 @@ def load_vw( else: vw = viv_utils.getWorkspace(str(sample_path), analyze=False, should_save=False) - viv_utils.flirt.register_flirt_signature_analyzers(vw, list(map(str, sigpaths))) + if not FileType.ELF: + viv_utils.flirt.register_flirt_signature_analyzers(vw, list(map(str, sigpaths))) vw.analyze() @@ -555,6 +566,8 @@ def main(argv=None) -> int: return 0 static_runtime = get_runtime_diff(interim) + if not is_supported_file_type(sample): + logger.error("FileType not Supported") # set language configurations selected_lang = Language(args.language) @@ -562,7 +575,7 @@ def main(argv=None) -> int: results.metadata.language = "" results.metadata.language_version = "" results.metadata.language_selected = "" - else: + elif FileType.PE: lang_id, lang_version = identify_language_and_version(sample, static_strings) if selected_lang == Language.UNKNOWN: