Raffaele Nutricato

42 papers C 19Journal 11Unranked 12
YearRankTypeTitle / Venue / Authors
2024 J jnl
Remote. Sens.
Rosa Colacicco, Alberto Refice, Raffaele Nutricato, Fabio Bovenga, Giacomo Caporusso, Annarita D'Addabbo, Marco La Salandra, Francesco Paolo Lovergine, Davide Oscar Nitti, Domenico Capolongo
2024 C conf
IGARSS
Alberto Refice, Giacomo Caporusso, Francesco P. Lovergine, Raffaele Nutricato, Davide Oscar Nitti, Alessandro Parisi, Rosa Colacicco, Domenico Capolongo, Maria Virelli, Deodato Tapete, Alessandro Ursi
2024 C conf
IGARSS
Raffaele Lafortezza, Francesco Giordano, Domenico Capolongo, Alberto Refice, Francesco P. Lovergine, Mario Elia, Nicola Amoroso, Raffaele Nutricato, Davide Oscar Nitti, Alessandro Parisi, Alessandro Ursi, Patrizia Sacco, Maria Virelli, Deodato Tapete
2023 J jnl
Int. J. Appl. Earth Obs. Geoinformation
Alberico Sonnessa, Annamaria di Lernia, Davide Oscar Nitti, Raffaele Nutricato, Eufemia Tarantino, Federica Cotecchia
2023 J jnl
Remote. Sens.
Nicola Amoroso, Roberto Cilli, Davide Oscar Nitti, Raffaele Nutricato, Muzaffer Can Iban, Tommaso Maggipinto, Sabina Tangaro, Alfonso Monaco, Roberto Bellotti
2022 J jnl
Remote. Sens.
Fabio Bovenga, Ilenia Argentiero, Alberto Refice, Raffaele Nutricato, Davide Oscar Nitti, Guido Pasquariello, Giuseppe Spilotro
2022 C conf
IGARSS
Alberto Refice, Annarita D'Addabbo, Francesco P. Lovergine, Fabio Bovenga, Raffaele Nutricato, Davide Oscar Nitti
2022 C conf
IGARSS
Alberto Refice, L. Partipilo, Fabio Bovenga, Francesco P. Lovergine, Raffaele Nutricato, Davide Oscar Nitti, Domenico Capolongo
2021 C conf
IGARSS
Angelo Amodio, Sergio Samarelli, Vincenzo Massimi, Alberto Lorenzo-Alonso, Ángel Utanda González, Michael Foumelis, Floriane Provost, Philippe Bally, Raffaele Nutricato, Davide Oscar Nitti
2020 J jnl
Remote. Sens.
Nicola Amoroso, Roberto Cilli, Loredana Bellantuono, Vincenzo Massimi, Alfonso Monaco, Davide Oscar Nitti, Raffaele Nutricato, Sergio Samarelli, Nicolò Taggio, Sabina Tangaro, Andrea Tateo, Luciano Guerriero, Roberto Bellotti
2019 J jnl
Sensors
Maria Francesca Bruno, Matteo Gianluca Molfetta, Luigi Pratola, Michele Mossa, Raffaele Nutricato, Alberto Morea, Davide Oscar Nitti, Maria Teresa Chiaradia
2018 C conf
IGARSS
Fabio Bovenga, Alberto Refice, Antonella Belmonte, Raffaele Nutricato, Davide Oscar Nitti, Maria Teresa Chiaradia, Sotirios Valkaniotis, Sofia Gkioni, Chrysanthi Kosma, Athanassis Ganas, Paolo Manunta, Elizar Elizar, Darusman Darusman, Philippe Bally
2018 J jnl
Sensors
Fabio Bovenga, Antonella Belmonte, Alberto Refice, Guido Pasquariello, Raffaele Nutricato, Davide Oscar Nitti, Maria T. Chiaradia
2018 C conf
IGARSS
Sergio Samarelli, Luigi Agrimano, Italo Epicoco, Massimo Cafaro, Raffaele Nutricato, Davide Oscar Nitti, Fabio Bovenga
2016 conf
SAR
Davide Oscar Nitti, Alberto Morea, Raffaele Nutricato, Maria Teresa Chiaradia, Claudio La Mantia, Luigi Agrimano, Sergio Samarelli
2016 conf
SAR
Raffaele Nutricato, Alberto Morea, Davide Oscar Nitti, Claudio La Mantia, Luigi Agrimano, Sergio Samarelli, Maria Teresa Chiaradia
2016 conf
SAR
Sergio Samarelli, Antonio Pio Lorusso, Luigi Agrimano, Raffaele Nutricato, Fabio Bovenga, Davide Oscar Nitti, Maria Teresa Chiaradia
2015 C conf
IGARSS
Raffaele Nutricato, Davide Oscar Nitti, Fabio Bovenga, Alberto Refice, Janusz Wasowski, Maria T. Chiaradia, Giovanni Milillo
2015 C conf
IGARSS
Andrea Guerriero, Vito Walter Anelli, Alessandro Pagliara, Raffaele Nutricato, Davide Oscar Nitti
2015 C conf
IGARSS
Khalid Tijani, Maria T. Chiaradia, Alberto Morea, Raffaele Nutricato, Luciano Guerriero, Guido Pasquariello
2015 conf
SAR
Davide Oscar Nitti, Raffaele Nutricato, Rino Lorusso, Nunzia Lombardi, Fabio Bovenga, Maria Francesca Bruno, Maria Teresa Chiaradia, Giovanni Milillo
2014 conf
SAR
Fabio Bovenga, Alberto Refice, Guido Pasquariello, Davide Oscar Nitti, Raffaele Nutricato
2014 conf
SAR
Raffaele Nutricato, Davide Oscar Nitti, Fabio Bovenga, Alberto Refice, Maria Teresa Chiaradia
2014 J jnl
IEEE J. Sel. Top. Appl. Earth Obs. Remote. Sens.
Alberto Refice, Domenico Capolongo, Guido Pasquariello, Annarita D'Addabbo, Fabio Bovenga, Raffaele Nutricato, Francesco P. Lovergine, Luca Pietranera
2014 conf
SAR
Domenico Conte, Fabio Bovenga, Alberto Refice, Davide Oscar Nitti, Raffaele Nutricato, Maria T. Chiaradia
2013 conf
SAR
Raffaele Nutricato, Davide Oscar Nitti, Fabio Bovenga, Alberto Refice, Janusz Wasowski, Maria Teresa Chiaradia
2013 conf
SAR
Davide Oscar Nitti, Fabio Bovenga, Raffaele Nutricato, Francesca Intini, Maria Teresa Chiaradia
2012 C conf
IGARSS
Maria T. Chiaradia, Gianfranco Fornaro, Angelo Freni, Giorgio Franceschetti, Pasquale Imperatore, Francesca Intini, Antonio Iodice, Alessandro Mori, Davide Oscar Nitti, Raffaele Nutricato, Diego Reale, Daniele Riccio, Paolo Trivero
2012 C conf
IGARSS
Davide Oscar Nitti, Raffaele Nutricato, Francesca Intini, Fabio Bovenga, Maria T. Chiaradia, Rosa Pacione, Francesco Vespe
2011 J jnl
IEEE Trans. Geosci. Remote. Sens.
Davide Oscar Nitti, Ramon F. Hanssen, Alberto Refice, Fabio Bovenga, Raffaele Nutricato
2011 J jnl
IEEE Geosci. Remote. Sens. Lett.
Diego Reale, Davide Oscar Nitti, Dario Peduto, Raffaele Nutricato, Fabio Bovenga, Gianfranco Fornaro
2010 conf
SAR
Fabio Bovenga, Davide Oscar Nitti, Alberto Refice, Raffaele Nutricato, Maria Teresa Chiaradia
2010 C conf
IGARSS
Fabio Bovenga, Laura Candela, Francesco Casu, Gianfranco Fornaro, Fausto Guzzetti, Riccardo Lanari, Davide Oscar Nitti, Raffaele Nutricato, Diego Reale
2009 conf
IGARSS (2)
Davide Oscar Nitti, Raffaele Nutricato, Fabio Bovenga, Fabio M. Rana, Domenico Conte, Giovanni Milillo, Luciano Guerriero
2007 conf
VECIMS
Fabio Bovenga, Elena Miali, Raffaele Nutricato, Maria T. Chiaradia
2006 C conf
IGARSS
Davide Oscar Nitti, Fabio Bovenga, Raffaele Nutricato, Alberto Refice, Maria T. Chiaradia
2006 J jnl
IEEE Trans. Geosci. Remote. Sens.
Alberto Refice, Fabio Bovenga, Raffaele Nutricato
2005 C conf
IGARSS
Alberto Refice, Fabio Bovenga, Raffaele Nutricato, Maria T. Chiaradia, Janusz Wasowski
2004 C conf
IGARSS
Alberto Refice, Fabio Bovenga, Raffaele Nutricato, Maria T. Chiaradia
2003 C conf
IGARSS
Fabio Bovenga, Sebastiano Stramaglia, Raffaele Nutricato, Alberto Refice
2002 C conf
IGARSS
Fabio Bovenga, Alberto Refice, Raffaele Nutricato, Guido Pasquariello, Giacomo De Carolis
2002 C conf
IGARSS
Raffaele Nutricato, Fabio Bovenga, Alberto Refice
redb/extractors/detectiteasy.py
← Index redb/extractors/detectiteasy.py python
import inspect
from pprint import pprint
import subprocess
import json
from typing import Any
from datetime import datetime, timezone
import os
from dotenv import load_dotenv

from redb.extractors.enum import Tag
from redb.models.dataclasses import DIEinfo
from redb.extractors.extractor import Extractor

load_dotenv(override=True)

class DIEExtractor(Extractor):

    def __init__(
        self,
        filepath,
        log,
        exporters=None,
        index_prefix=None,
        elastic_index=None,
        known_benign=False,
        known_malicious=False,
        precomputed_hashes=None,
    ):
        super().__init__(
            filepath, log, exporters, index_prefix, elastic_index, known_benign, known_malicious,
            precomputed_hashes=precomputed_hashes
        )
        self.log.debug(inspect.currentframe().f_code.co_name)
        self.die_info = None
        self.die_info_dict = {}
        self.elastic_index = self.index_prefix + "-die"

    def _recursive_entry(self, die_dict, master_key):
        self.log.debug(inspect.currentframe().f_code.co_name)
        if master_key:
            self.die_info_dict[master_key] = {}
        else:
            self.die_info_dict = {}
        for value in die_dict:
            if "type" in value:
                type_key = value["type"].lower().replace(" ", "_")
                name = value.get("name", "")
                version = f"({value.get('version')})" if value.get("version") else ""
                info = f"[{value.get('info')}]" if value.get("info") else ""

                if master_key:
                    self.die_info_dict[master_key][type_key] = f"{name}"
                    self.die_info_dict[master_key][f'{type_key}(full)'] = f"{name}{version}{info}"
                else:
                    self.die_info_dict[type_key] = f"{name}"
                    self.die_info_dict[f'{type_key}(full)'] = f"{name}{version}{info}"

            elif "parentfilepart" in value:
                child_key = (
                    value["parentfilepart"].lower().replace(" ", "_")
                    + "."
                    + value["filetype"].lower().replace(" ", "_")
                )
                if master_key:
                    self._recursive_entry(value["values"], f"{master_key}.{child_key}")
                else:
                    self._recursive_entry(value["values"], f"{child_key}")

    def _extract_dieinfo(self):
        """
        Execute a command-line binary with arguments and parse its JSON output.

        :param command: The command or path to the binary to execute
        :param args: Additional arguments to pass to the command
        :return: Parsed JSON output as a Python object
        """
        self.log.debug(inspect.currentframe().f_code.co_name)

        # Construct the full command
        # command = "nfdc" # UNCOMMENT FOR PROD
        # command = "/Users/p4c0/_tools/NFD.app/Contents/MacOS/nfdc" # COMMENT FOR TESTING ON MAC
        command = os.getenv("DIE_PATH")
        args = ["-durj", self.filepath]
        full_command = [command] + list(args)
        TIMEOUT = int(os.getenv("DIE_TIMEOUT", "180"))

        try:
            # Execute the command and capture its output
            result = subprocess.run(
                full_command,
                capture_output=True,
                text=True,
                check=True,
                timeout=TIMEOUT,
            )

            # Parse the JSON output
            nfdc_output = json.loads(result.stdout)

            # Extract the DIE information from the json output
            for die_entry in nfdc_output["detects"]:
                if die_entry["parentfilepart"] == "Header":
                    master_key = (
                        die_entry["parentfilepart"].lower().replace(" ", "_")
                        + "."
                        + die_entry["filetype"].lower().replace(" ", "_")
                    )
                    self._recursive_entry(die_entry["values"], None)

            # pprint(json.dumps(self.die_info_dict, indent=2)) #debug
            self.die_info = DIEinfo(result.stdout, self.die_info_dict)
            self.log.debug(f"NFDC-DIE JSON dump: todo")
        except subprocess.TimeoutExpired:
            self.log.error(f"The DIE command timed out after {TIMEOUT} seconds")
            return None
        except subprocess.CalledProcessError as e:
            self.log.error(f"Error executing DIE command: {e}")
            self.log.error(f"Command output (stderr): {e.stderr}")
            return None
        except json.JSONDecodeError as e:
            self.log.error(f"Error parsing DIE JSON output: {e}")
            self.log.error(f"Raw output: {result.stdout}")
            return None

    def prepare_export_data(self, exporter_type: str) -> Any:
        if exporter_type == "ElasticsearchExporter":
            return self.die_info
        elif exporter_type == "ClickHouseExporter":
            # Convert DIE info to JSON string
            die_info_json = json.dumps(self.die_info_dict)
            
            data = [[
                self.sha256,
                self.md5,
                self.sha1,
                die_info_json,
                datetime.now(timezone.utc)
            ]]
            
            column_names = [
                'sha256', 'md5', 'sha1', 'die_info', 'analysis_date'
            ]
            
            column_type_names = [
                'String', 'String', 'String', 'JSON', 'DateTime64(3, \'UTC\')'
            ]
            
            return (data, column_names, column_type_names)

    def get_clickhouse_table(self) -> str:
        return "redb_die"

    def extract(self):
        self.log.debug(inspect.currentframe().f_code.co_name)
        try:
            self._extract_dieinfo()
            
            # Check if there's a packer in the DIE results
            is_packed = False
            if self.die_info_dict:
                # Check if 'packer' exists in the DIE results
                is_packed = bool(self.die_info_dict.get('packer'))
            
            return self.die_info  # Return the extracted data instead of exporting directly
        except Exception as e:
            self.log.error(f"Error extracting DIE information: {e}")
            return None

    def tag(self):
        return Tag.DIEC.value