Carlo Massaroni

204 papers B 2Journal 55Unranked 147
YearRankTypeTitle / Venue / Authors
2026 J jnl
IEEE Internet Things J.
Yingshuo Bao, Zhuo Wang, Qian Zhang, Kun Xiao, Daniele Tosi, Carlo Massaroni, Xiaoli Li, Rui Min
2026 J jnl
Biomed. Signal Process. Control.
Francesca Santucci, Emanuele Maiorana, Chiara Romano, Annunziata Nusca, Gian Paolo Ussia, Emiliano Schena, Roberto Setola, Carlo Massaroni
2025 conf
MetroInd4.0 & IoT
Alfredo Dimo, Arianna Carnevale, Martina Pulcinelli, Vincenzo Lavorgna, Emiliano Schena, Carlo Massaroni, Daniela Lo Presti, Umile Giuseppe Longo
2025 conf
MeMeA
Martina Pulcinelli, Vincenzo Lavorgna, Valeria Tomarchio, Ombretta Annibali, Luigi Rigacci, Carlo Massaroni, Emiliano Schena, Daniela Lo Presti
2025 conf
BATS
Ilaria Condò, Carlo Massaroni, Sara Maria Giannitelli, Marcella Trombetta, Emiliano Schena, Daniela Lo Presti
2025 conf
MetroInd4.0 & IoT
Carla Antonacci, Arianna Carnevale, Letizia Mancini, Alessandro de Sire, Pieter D'Oghe, Carlo Massaroni, Rocco Papalia, Emiliano Schena, Umile Giuseppe Longo
2025 conf
BATS
Federico Filippi, Moscol Albanil Isabel Del Pilar, Giorgia Fiori, Arianna Carnevale, Marta Cecchitelli, Carlo Massaroni, Emiliano Schena, Salvatore Andrea Sciuto, Daniela Lo Presti, Andrea Scorza
2025 J jnl
IEEE Trans. Instrum. Meas.
Daniela Lo Presti, Carlo Massaroni, Valeria Tomarchio, Emiliano Schena
2025 conf
BATS
Martina Pulcinelli, Valeria Tomarchio, Ombretta Annibali, Luigi Rigacci, Carlo Massaroni, Emiliano Schena, Daniela Lo Presti
2025 conf
BATS
Alessandro Ledda, Maria Rosaria Fizzano, Mara Stefanelli, Enrico D'Emilia, Emiliano Schena, Carlo Massaroni, Mariangela Pinelli, Davide Giordani
2025 conf
BATS
Chiara Romano, Daniela Lo Presti, Sergio Silvestri, Annunziata Nusca, Gian Paolo Ussia, Emiliano Schena, Carlo Massaroni
2025 conf
MetroInd4.0 & IoT
Chiara Romano, Francesca De Tommasi, Daniela Lo Presti, Manish Sharma, Sergio Silvestri, Emiliano Schena, Carlo Massaroni
2025 conf
BATS
Vincenzo Saroli, Sergio Silvestri, Emiliano Schena, Carlo Massaroni
2025 conf
MetroInd4.0 & IoT
Vincenzo Saroli, Mariangela Pinnelli, Chiara Romano, Sergio Silvestri, Emiliano Schena, Carlo Massaroni
2025 conf
BATS
Vincenzo Lavorgna, Tommaso Giannini, Daniela Lo Presti, Emiliano Schena, Carlo Massaroni
2025 conf
BATS
Letizia Mancini, Giovanni Spallone, Arianna Carnevale, Carla Antonacci, Stefano Campi, Alessandro de Sire, Pieter D'Hoghe, Carlo Massaroni, Rocco Papalia, Emiliano Schena, Umile Giuseppe Longo
2025 conf
MetroInd4.0 & IoT
Vincenzo Lavorgna, Martina Pulcinelli, Carlo Massaroni, Guido Gabriele, Emiliano Schena, Daniela Lo Presti
2025 conf
MetroInd4.0 & IoT
Mariangela Pinnelli, Vincenzo Saroli, Gianpaolo Pennacchio, Chiara Romano, Roberto Setola, Emiliano Schena, Carlo Massaroni
2025 B conf
VRST
Ivo Roupa, João Raposo, Camila Abreu, Maria Ribeiro dos Santos, Pedro F. Campos, Carlo Massaroni, Hugo Plácido da Silva, Daniel S. Lopes
2025 conf
MetroInd4.0 & IoT
Letizia Mancini, Arianna Carnevale, Giovanni Spallone, Carla Antonacci, Stefano Campi, Alessandro de Sire, Pieter D'Hoghe, Carlo Massaroni, Rocco Papalia, Emiliano Schena, Umile Giuseppe Longo
2025 conf
MetroInd4.0 & IoT
Moscol Albanil Isabel Del Pilar, Chiara Romano, Mariangela Pinnelli, Annunziata Nusca, Gian Paolo Ussia, Emiliano Schena, Carlo Massaroni
2025 conf
BATS
Maria Rosaria Fizzano, Alessandro Ledda, Mara Stefanelli, Calogero Vitale, Emiliano Schena, Carlo Massaroni, Mariangela Pinelli, Davide Giordani
2025 conf
MetroInd4.0 & IoT
Ana Luiza de Castro Lopes, Bruno L. S. Bedo, Sergio Silvestri, Emiliano Schena, Umile Giuseppe Longo, Arianna Carnevale, Pietro Cerveri, Richard Diego Leite, Amanda Piaia Silvatti, Karine Jacon Sarro, Carlo Massaroni
2025 conf
MetroInd4.0 & IoT
Martina Pulcinelli, Carlo Massaroni, Francesco Giurazza, Francesco Muto, Vittorio Altomare, Antonella Grasso, Emiliano Schena, Daniela Lo Presti
2025 conf
BATS
Vincenzo Saroli, Giulia Paciotti, Sergio Silvestri, Emiliano Schena, Carlo Massaroni
2025 conf
BATS
Moscol Albanil Isabel Del Pilar, Valeria Tomarchio, Carlo Massaroni, Emiliano Schena, Carlos Ojeda, Mario Quinde, Ombretta Annibali, Daniela Lo Presti
2025 conf
MetroInd4.0 & IoT
Mariangela Pinnelli, Moscol Albanil Isabel Del Pilar, Alessandro Dascola, Chiara Romano, Ilaria Condò, Francesca Santucci, Alessandro Ledda, Emiliano Schena, Roberto Setola, Carlo Massaroni
2025 conf
BATS
Mariangela Pinnelli, Carlo Massaroni, Fabrizio Marra, Alessandro Ledda, Emiliano Schena, Maria Sabrina Sarto
2025 conf
BATS
Carla Antonacci, Arianna Carnevale, Letizia Mancini, Alessandro de Sire, Pieter D'Hoghe, Carlo Massaroni, Rocco Papalia, Emiliano Schena, Umile Giuseppe Longo
2025 conf
MetroInd4.0 & IoT
Francesca Santucci, Chiara Romano, Mariangela Pinnelli, Annunziata Nusca, Gian Paolo Ussia, Sergio Silvestri, Emiliano Schena, Roberto Setola, Carlo Massaroni
2024 conf
MetroInd4.0 & IoT
Daniela Lo Presti, Martina Pulcinelli, Carlo Massaroni, Jan Nedoma, Emiliano Schena
2024 conf
MetroInd4.0 & IoT
Mariangela Pinnelli, Chiara Romano, Martina Pulcinelli, Emiliano Schena, Sergio Silvestri, Giancarlo Fortino, Carlo Massaroni, Roberto Setola, Daniela Lo Presti
2024 conf
MetroInd4.0 & IoT
Lucrezia Giorgi, Federico Di Marco, Daniela Lo Presti, Carlo Massaroni, Chiara Romano, Antonio Moffa, Manuele Casale, Emiliano Schena
2024 conf
MetroInd4.0 & IoT
Elzbieta Olejarczyk, Elzbieta Raus-Jarzabek, Carlo Massaroni
2024 J jnl
IEEE Trans. Dependable Secur. Comput.
Emanuele Maiorana, Chiara Romano, Emiliano Schena, Carlo Massaroni
2024 J jnl
Sensors
Lorenzo Innocenti, Chiara Romano, Giuseppe Greco, Stefano Nuccio, Alessio Bellini, Federico Mari, Sergio Silvestri, Emiliano Schena, Massimo Sacchetti, Carlo Massaroni, Andrea Nicolò
2024 conf
MetroInd4.0 & IoT
Carlo Massaroni, Sergio Silvestri, Emiliano Schena
2024 conf
MetroInd4.0 & IoT
Martina Pulcinelli, Lorenzo Zoboli, Daniele Bianchi, Carlo Massaroni, Vittorio Altomare, Antonella Grasso, Alessio Gizzi, Emiliano Schena, Daniela Lo Presti
2024 J jnl
Frontiers Digit. Health
Gloria Cosoli, Carlo Massaroni, Paola Saccomandi
2024 J jnl
Sensors
Daniela Lo Presti, Sara Cimini, Francesca De Tommasi, Carlo Massaroni, Stefano Cinti, Laura De Gara, Emiliano Schena
2024 J jnl
Sensors
Chiara Romano, Daniela Lo Presti, Sergio Silvestri, Emiliano Schena, Carlo Massaroni
2024 J jnl
Adv. Intell. Syst.
Carlo Massaroni, Loy Vitali, Daniela Lo Presti, Sergio Silvestri, Emiliano Schena
2024 conf
MetroInd4.0 & IoT
Carlo Massaroni, Elzbieta Olejarczyk, Daniela Lo Presti, Emiliano Schena, Annunziata Nusca, Gian Paolo Ussia, Sergio Silvestri
2024 conf
MetroInd4.0 & IoT
Carlo Massaroni, Francesca De Tommasi, Daniela Lo Presti, Manish Sharma, Sergio Silvestri, Emiliano Schena
2024 conf
MetroInd4.0 & IoT
Alfredo Dimo, Arianna Carnevale, Martina Pulcinelli, Carlo Massaroni, Umile Giuseppe Longo, Emiliano Schena, Daniela Lo Presti
2024 conf
Q-BATS
Francesca De Tommasi, Daniela Lo Presti, Carlo Massaroni, Martina Pulcinelli, Emiliano Schena
2024 J jnl
Sensors
Francesca Santucci, Martina Nobili, Francesca De Tommasi, Daniela Lo Presti, Carlo Massaroni, Emiliano Schena, Gabriele Oliva
2024 conf
MetroInd4.0 & IoT
Federico D'Antoni, Francesca De Tommasi, Giampiero Bartolomei, Daniela Lo Presti, Luca Vollero, Sergio Silvestri, Emiliano Schena, Mario Merone, Carlo Massaroni
2024 conf
Q-BATS
Francesca De Tommasi, Francesco Avossa, Martina Pulcinelli, Daniela Lo Presti, Carlo Massaroni, Sergio Silvestri, Emiliano Schena
2024 conf
MetroInd4.0 & IoT
Chiara Romano, Sergio Silvestri, Daniela Lo Presti, Emiliano Schena, Carlo Massaroni
2024 J jnl
Sensors
Mariangela Pinnelli, Daniela Lo Presti, Sergio Silvestri, Roberto Setola, Emiliano Schena, Carlo Massaroni
2024 conf
MetroInd4.0 & IoT
Martina Pulcinelli, Daniela Lo Presti, Carlo Massaroni, Sergio Silvestri, Emiliano Schena, Francesca De Tommasi
2024 conf
Q-BATS
Carlo Massaroni, Daniela Lo Presti, Emiliano Schena
2023 conf
MetroInd4.0&IoT
Daniela Lo Presti, Sofia Famiani, Carlo Massaroni, Pawar Dnyandeo Krabhari, Valeria Tomarchio, Emiliano Schena
2023 conf
MetroInd4.0&IoT
Lucrezia Giorgi, Federico Di Marco, Daniela Lo Presti, Carlo Massaroni, Chiara Romano, Antonio Moffa, Manuele Casale, Emiliano Schena
2023 J jnl
IEEE Trans. Biomed. Eng.
Martina Zaltieri, Daniela Lo Presti, Marco Bravi, Michele Arturo Caponero, Silvia Sterzi, Emiliano Schena, Carlo Massaroni
2023 J jnl
Sensors
Nunzia Molinaro, Emiliano Schena, Sergio Silvestri, Carlo Massaroni
2023 conf
BATS
Chiara Romano, Daniela Lo Presti, John W. Dickinson, Emiliano Schena, Sergio Silvestri, Carlo Massaroni
2023 conf
BATS
Carlo Massaroni, Loy Vitali, Daniela Lo Presti, Sergio Silvestri, Emiliano Schena
2023 conf
MetroInd4.0&IoT
Daniela Lo Presti, Fabio Pizza, Cátia Sofia Jorge Leitão, Carlo Massaroni, Michele A. Caponero, Paulo Antunes, Emiliano Schena
2023 conf
MeMeA
Daniela Lo Presti, Carlo Massaroni, Daniele Bianchi, Michele A. Caponero, Alessio Gizzi, Emiliano Schena
2023 conf
MetroInd4.0&IoT
Federica Bianconi, Carlo Massaroni, Stefania Campopiano, Elena De Vita, Daniele Bianchi, Emiliano Schena, Daniela Lo Presti, Agostino Iadicicco, Alessio Gizzi
2023 conf
MeMeA
Francesca De Tommasi, Daniela Lo Presti, Michele Arturo Caponero, Massimiliano Carassiti, Emiliano Schena, Carlo Massaroni
2023 conf
MetroInd4.0&IoT
Nunzia Molinaro, Emiliano Schena, Marco Bravi, Sandra Miccinilli, Silvia Sterzi, Sergio Silvestri, Carlo Massaroni
2023 J jnl
IEEE Trans. Instrum. Meas.
Francesca De Tommasi, Livio D'Alvia, Carlo Massaroni, Daniela Lo Presti, Massimiliano Carassiti, Zaccaria Del Prete, Emiliano Schena, Eduardo Palermo
2023 conf
MetroInd4.0&IoT
Daniela Lo Presti, Francesca De Tommasi, Carlo Massaroni, Sara Cimini, Laura De Gara, Stefano Cinti, Emiliano Schena
2023 conf
BATS
Federica Bianconi, Elena De Vita, Daniela Lo Presti, Carlo Massaroni, Daniele Bianchi, Agostino Iadicicco, Stefania Campopiano, Emiliano Schena, Alessio Gizzi
2023 J jnl
Sensors
Milena Cukic, Chiara Romano, Francesca De Tommasi, Massimiliano Carassiti, Domenico Formica, Emiliano Schena, Carlo Massaroni
2023 J jnl
Sensors
Daniela Lo Presti, Joshua Di Tocco, Sara Cimini, Stefano Cinti, Carlo Massaroni, Rosaria D'Amato, Michele A. Caponero, Laura De Gara, Emiliano Schena
2023 J jnl
Sensors
Joshua Di Tocco, Daniela Lo Presti, Carlo Massaroni, Stefano Cinti, Sara Cimini, Laura De Gara, Emiliano Schena
2023 conf
MetroInd4.0&IoT
Luca Bacco, Matteo Coletta, Martina Zaltieri, Daniela Lo Presti, Carlo Massaroni, Emiliano Schena, Mario Merone
2023 J jnl
IEEE Trans. Hum. Mach. Syst.
Shekh Md Mahmudul Islam, Nunzia Molinaro, Sergio Silvestri, Emiliano Schena, Carlo Massaroni
2023 J jnl
IEEE Trans. Instrum. Meas.
Francesca De Tommasi, Daniela Lo Presti, Michele Arturo Caponero, Massimiliano Carassiti, Emiliano Schena, Carlo Massaroni
2023 conf
MeMeA
Chiara Romano, Domenico Formica, Marco Bravi, Sandra Miccinilli, Silvia Sterzi, Emiliano Schena, Carlo Massaroni
2023 conf
MetroInd4.0&IoT
Carlo Massaroni, Massimo Sacchetti, Chiara Romano, Emiliano Schena, Lorenzo Innocenti, Andrea Nicolò
2023 J jnl
IEEE Trans. Biomed. Eng.
Francesca Santucci, Martina Nobili, Daniela Lo Presti, Carlo Massaroni, Roberto Setola, Emiliano Schena, Gabriele Oliva
2023 conf
BATS
Daniela Lo Presti, Chiara Romano, Carlo Massaroni, Nicola Di Stefano, Domenico Formica, Emiliano Schena
2023 J jnl
Sensors
Martina Pulcinelli, Mariangela Pinnelli, Carlo Massaroni, Daniela Lo Presti, Giancarlo Fortino, Emiliano Schena
2022 J jnl
Sensors
Daniela Lo Presti, Martina Zaltieri, Marco Bravi, Michelangelo Morrone, Michele Arturo Caponero, Emiliano Schena, Silvia Sterzi, Carlo Massaroni
2022 conf
MetroInd4.0& IoT
Mariangela Pinnelli, Martina Pulcinelli, Arianna Carnevale, Joshua Di Tocco, Carlo Massaroni, Emiliano Schena, Umile Giuseppe Longo, Vincenzo Denaro
2022 J jnl
Artif. Intell. Medicine
Mariangela Filosa, Luca Massari, Davide Ferraro, Giacomo D'Alesio, Jessica D'Abbraccio, Andrea Aliperta, Daniela Lo Presti, Joshua Di Tocco, Martina Zaltieri, Carlo Massaroni, Maria Chiara Carrozza, Maurizio Ferrarin, Marco Di Rienzo, Emiliano Schena, Calogero Maria Oddo
2022 conf
DASC/PiCom/CBDCom/CyberSciTech
Daniela Lo Presti, Francesca De Tommasi, Chiara Romano, Martina Pulcinelli, Mariangela Pinnelli, Carlo Massaroni, Blandina Lanni, Massimiliano Carassiti, Giancarlo Fortino, Emiliano Schena
2022 conf
MeMeA
Daniela Lo Presti, Chiara Romano, Cátia Sofia Jorge Leitão, Carlo Massaroni, Domenico Formica, Emiliano Schena
2022 conf
MeMeA
Martina Zaltieri, Carlo Massaroni, Stefano Bianchi, Filippo Maria Cauti, Emiliano Schena
2022 J jnl
CoRR
Emanuele Maiorana, Chiara Romano, Emiliano Schena, Carlo Massaroni
2022 conf
MetroInd4.0& IoT
Joshua Di Tocco, Carlo Massaroni, Emiliano Schena, Fabrizio Marra, Alessio Tamburrano, Serena Minutillo, Maria Sabrina Sarto
2022 conf
MeMeA
Elena De Vita, Francesca De Tommasi, Carlo Altomare, Sofia Ialongo, Carlo Massaroni, Daniela Lo Presti, Eliodoro Faiella, Flavio Andresciani, Giuseppina Pacella, Andrea Palermo, Massimiliano Carassiti, Agostino Iadicicco, Rosario Francesco Grasso, Emiliano Schena, Stefania Campopiano
2022 conf
MetroInd4.0& IoT
Daniela Lo Presti, Joshua Di Tocco, Carlo Massaroni, Sara Cimini, Stefano Cinti, Rosaria D'Amato, Michele A. Caponero, Laura De Gara, Emiliano Schena
2022 conf
MetroInd4.0& IoT
Carlo Massaroni, Chiara Romano, Francesca De Tommasi, Milena Cukic, Massimiliano Carassiti, Domenico Formica, Emiliano Schena
2022 conf
MetroInd4.0& IoT
Nunzia Molinaro, Emiliano Schena, Sergio Silvestri, Carlo Massaroni
2022 J jnl
Sensors
Lorenzo Innocenti, Andrea Nicolò, Carlo Massaroni, Carlo Minganti, Emiliano Schena, Massimo Sacchetti
2022 J jnl
Sensors
Joshua Di Tocco, Daniela Lo Presti, Martina Zaltieri, Marco Bravi, Michelangelo Morrone, Silvia Sterzi, Emiliano Schena, Carlo Massaroni
2022 J jnl
Sensors
Nunzia Molinaro, Emiliano Schena, Sergio Silvestri, Carlo Massaroni
2022 J jnl
Sensors
Francesca Santucci, Daniela Lo Presti, Carlo Massaroni, Emiliano Schena, Roberto Setola
2022 J jnl
Sensors
Joshua Di Tocco, Daniela Lo Presti, Alberto Rainer, Emiliano Schena, Carlo Massaroni
2022 conf
MetroInd4.0& IoT
Joshua Di Tocco, Daniela Lo Presti, Carlo Massaroni, Stefano Cinti, Sara Cimini, Laura De Gara, Emiliano Schena
2022 conf
MetroInd4.0& IoT
Daniela Lo Presti, Joshua Di Tocco, Carlo Massaroni, Emiliano Schena, Domenico Formica
2021 B conf
CHASE
Daniela Lo Presti, Raffaele Gravina, Carlo Massaroni, Domenico Formica, Emiliano Schena, Giancarlo Fortino
2021 J jnl
Sensors
Joshua Di Tocco, Luigi Raiano, Riccardo Sabbadini, Carlo Massaroni, Domenico Formica, Emiliano Schena
2021 conf
MeMeA
Riccardo Sabbadini, Joshua Di Tocco, Carlo Massaroni, Emiliano Schena, Massimiliano Carassiti
2021 conf
IWBF
Emanuele Maiorana, Carlo Massaroni
2021 J jnl
Sensors
Joshua Di Tocco, Riccardo Sabbadini, Luigi Raiano, Federica Fani, Simone Ripani, Emiliano Schena, Domenico Formica, Carlo Massaroni
2021 conf
MeMeA
Daniela Lo Presti, Carlo Massaroni, Michele A. Caponero, Domenico Formica, Emiliano Schena
2021 conf
MetroInd4.0&IoT
Lorenzo Innocenti, Andrea Nicolò, Carlo Massaroni, Massimo Sacchetti
2021 conf
MetroInd4.0&IoT
Francesca De Tommasi, Daniela Lo Presti, Carlo Massaroni, Emiliano Schena, Massimiliano Carassiti
2021 conf
MetroInd4.0&IoT
Daniela Lo Presti, Martina Zaltieri, Rosaria D'Amato, Michele A. Caponero, Carlo Massaroni, Emiliano Schena
2021 J jnl
IEEE Trans. Biomed. Eng.
Elena De Vita, Martina De Landro, Carlo Massaroni, Agostino Iadicicco, Paola Saccomandi, Emiliano Schena, Stefania Campopiano
2021 J jnl
Sensors
Chiara Romano, Emiliano Schena, Sergio Silvestri, Carlo Massaroni
2021 J jnl
Sensors
Daniela Lo Presti, Sara Cimini, Carlo Massaroni, Rosaria D'Amato, Michele Arturo Caponero, Laura De Gara, Emiliano Schena
2021 conf
MetroInd4.0&IoT
Arianna Carnevale, Joshua Di Tocco, Carlo Massaroni, Umile Giuseppe Longo, Emiliano Schena, Vincenzo Denaro
2021 conf
MetroInd4.0&IoT
Davide Paloschi, Marco Bravi, Sandra Miccinilli, Emiliano Schena, Silvia Sterzi, Carlo Massaroni, Paola Saccomandi
2021 conf
MetroInd4.0&IoT
Luigi Raiano, Joshua Di Tocco, Carlo Massaroni, Giovanni Di Pino, Emiliano Schena, Domenico Formica
2021 conf
MetroInd4.0&IoT
Daniela Lo Presti, Martina Zaltieri, Joshua Di Tocco, Carlo Massaroni, Giacomo D'Alesio, Jessica D'Abbraccio, Mariangela Filosa, Calogero M. Oddo, Maria Chiara Carrozza, Maurizio Ferrarin, Marco Di Rienzo, Emiliano Schena
2021 J jnl
Sensors
Arianna Carnevale, Emiliano Schena, Domenico Formica, Carlo Massaroni, Umile Giuseppe Longo, Vincenzo Denaro
2021 conf
MetroInd4.0&IoT
Francesca De Tommasi, Daniela Lo Presti, Massimiliano Carassiti, Emiliano Schena, Carlo Massaroni
2021 J jnl
Sensors
Francesca De Tommasi, Daniela Lo Presti, Francesca Virgili, Carlo Massaroni, Emiliano Schena, Massimiliano Carassiti
2021 J jnl
Sensors
Martina Zaltieri, Carlo Massaroni, Filippo Maria Cauti, Emiliano Schena
2021 conf
MetroInd4.0&IoT
Elena De Vita, Francesca De Tommasi, Carlo Massaroni, Agostino Iadicicco, Eliodoro Faiella, Massimiliano Carassiti, Rosario Francesco Grasso, Emiliano Schena, Stefania Campopiano
2021 J jnl
Sensors
Francesca De Tommasi, Carlo Massaroni, Rosario Francesco Grasso, Massimiliano Carassiti, Emiliano Schena
2021 J jnl
Sensors
Davide Paloschi, Marco Bravi, Emiliano Schena, Sandra Miccinilli, Michelangelo Morrone, Silvia Sterzi, Paola Saccomandi, Carlo Massaroni
2021 J jnl
Sensors
Marco Bravi, Carlo Massaroni, Fabio Santacaterina, Joshua Di Tocco, Emiliano Schena, Silvia Sterzi, Federica Bressi, Sandra Miccinilli
2021 conf
MetroInd4.0&IoT
Joshua Di Tocco, Arianna Carnevale, Marco Bravi, Umile Giuseppe Longo, Silvia Sterzi, Carlo Massaroni, Emiliano Schena
2020 J jnl
Sensors
Daniela Lo Presti, Arianna Carnevale, Jessica D'Abbraccio, Luca Massari, Carlo Massaroni, Riccardo Sabbadini, Martina Zaltieri, Joshua Di Tocco, Marco Bravi, Sandra Miccinilli, Silvia Sterzi, Umile Giuseppe Longo, Vincenzo Denaro, Michele A. Caponero, Domenico Formica, Calogero M. Oddo, Emiliano Schena
2020 conf
MetroInd4.0&IoT
Antonio Lanatà, Alberto Greco, Stefano Di Modica, Francesco Niccolini, Federico Vivaldi, Fabio Di Francesco, Christian Tamantini, Francesca Cordella, Loredana Zollo, Marco Di Rienzo, Carlo Massaroni, Emiliano Schena, Mariasabrina Di Sarto, Enzo Pasquale Scilingo
2020 conf
MetroInd4.0&IoT
Martina Zaltieri, Joshua Di Tocco, Daniela Lo Presti, Carlo Massaroni, Domenico Formica, Emiliano Schena, Giacomo D'Alesio, Mariangela Filosa, Jessica D'Abbraccio, Ilaria Cesini, Luca Massari, Calogero Maria Oddo, Marco Di Rienzo, Maurizio Ferrarin, Michele Arturo Caponero, Maria Sabrina Sarto
2020 J jnl
Sensors
Martina Zaltieri, Carlo Massaroni, Daniela Lo Presti, Marco Bravi, Riccardo Sabbadini, Sandra Miccinilli, Silvia Sterzi, Domenico Formica, Emiliano Schena
2020 conf
MetroInd4.0&IoT
Riccardo Sabbadini, Carlo Massaroni, Joshua Di Tocco, Emiliano Schena, Domenico Formica, Alessia Mattei, Rita Cataldo, Francesca Gargano, Massimiliano Carassiti
2020 conf
MetroInd4.0&IoT
Paolo Resta, Daniela Lo Presti, Emiliano Schena, Carlo Massaroni, Domenico Formica, Taesung Kim, Dongjoo Shin
2020 conf
MetroInd4.0&IoT
Joshua Di Tocco, Carlo Massaroni, Luigi Raiano, Domenico Formica, Emiliano Schena
2020 conf
MetroInd4.0&IoT
Martina Zaltieri, Daniela Lo Presti, Carlo Massaroni, Riccardo Sabbadini, Emiliano Schena, Marco Bravi, Sandra Miccinilli, Silvia Sterzi, Domenico Formica
2020 J jnl
Sensors
Daniela Lo Presti, Sofia Dall'Orso, Silvia Muceli, Tomoki Arichi, Sara Neumane, Anna Lukens, Riccardo Sabbadini, Carlo Massaroni, Michele Arturo Caponero, Domenico Formica, Etienne Burdet, Emiliano Schena
2020 conf
MetroInd4.0&IoT
Luigi Raiano, Joshua Di Tocco, Carlo Massaroni, Giovanni Di Pino, Emiliano Schena, Domenico Formica
2020 conf
MeMeA
Arianna Carnevale, Carlo Massaroni, Daniela Lo Presti, Joshua Di Tocco, Martina Zaltieri, Domenico Formica, Umile Giuseppe Longo, Emiliano Schena, Vincenzo Denaro
2020 conf
MetroInd4.0&IoT
Soumyajyoti Maji, Carlo Massaroni, Emiliano Schena, Sergio Silvestri
2020 conf
IEEE SENSORS
Martina Zaltieri, Elena De Vita, Francesca De Tommasi, Carlo Massaroni, Eliodoro Faiella, Bruno Beomonte Zobel, Agostino Iadicicco, Emiliano Schena, Rosario Francesco Grasso, Stefania Campopiano
2020 conf
I2MTC
Joshua Di Tocco, Carlo Massaroni, Marco Bravi, Sandra Miccinilli, Silvia Sterzi, Domenico Formica, Emiliano Schena
2020 conf
I2MTC
Martina Zaltieri, Daniela Lo Presti, Carlo Massaroni, Emiliano Schena, Jessica D'Abbraccio, Luca Massari, Calogero M. Oddo, Domenico Formica, Michele A. Caponero, Marco Bravi, Sandra Miccinilli, Silvia Sterzi
2020 J jnl
Sensors
Martina Zaltieri, Greta Allegretti, Carlo Massaroni, Emiliano Schena, Filippo Maria Cauti
2020 J jnl
IEEE Access
Daniela Lo Presti, Carlo Massaroni, Cátia Sofia Jorge Leitão, Maria de Fátima Domingues, Marzhan Sypabekova, David Barrera, Ignazio Floris, Luca Massari, Calogero Maria Oddo, Salvador Sales, Iulian Iordachita, Daniele Tosi, Emiliano Schena
2020 conf
I2MTC
Carlo Massaroni, Joshua Di Tocco, Riccardo Sabbadini, Arianna Carnevale, Daniela Lo Presti, Emiliano Schena, Luigi Raiano, Domenico Formica, Sandra Miccinilli, Marco Bravi, Silvia Sterzi
2020 J jnl
Sensors
Elena De Vita, Martina Zaltieri, Francesca De Tommasi, Carlo Massaroni, Eliodoro Faiella, Bruno Beomonte Zobel, Agostino Iadicicco, Emiliano Schena, Rosario Francesco Grasso, Stefania Campopiano
2020 conf
MetroInd4.0&IoT
Carlo Massaroni, Andrea Nicolò, Daniela Lo Presti, Massimo Sacchetti, Emiliano Schena
2020 conf
MetroInd4.0&IoT
Francesca De Tommasi, Martina Zaltieri, Emiliano Schena, Carlo Massaroni, Eliodoro Faiella, Rosario Francesco Grasso, Bruno Beomonte Zobel, Elena De Vita, Agostino Iadicicco, Stefania Campopiano
2020 J jnl
Sensors
Andrea Nicolò, Carlo Massaroni, Emiliano Schena, Massimo Sacchetti
2020 conf
MetroInd4.0&IoT
Arianna Carnevale, Carlo Massaroni, Daniela Lo Presti, Domenico Formica, Umile Giuseppe Longo, Emiliano Schena, Vincenzo Denaro
2019 conf
MeMeA
Chiara Romano, Daniela Lo Presti, Emiliano Schena, Carlo Massaroni, Domenico Formica, Michele A. Caponero, Calogero M. Oddo, Jessica D'Abbraccio, Luca Massari, Umile Giuseppe Longo, Alessandra Berton
2019 conf
MeMeA
Daniela Lo Presti, Carlo Massaroni, Joshua Di Tocco, Emiliano Schena, Domenico Formica, Michele Arturo Caponero, Umile Giuseppe Longo, Arianna Carnevale, Jessica D'Abbraccio, Luca Massari, Calogero M. Oddo
2019 J jnl
Sensors
Daniela Lo Presti, Chiara Romano, Carlo Massaroni, Jessica D'Abbraccio, Luca Massari, Michele Arturo Caponero, Calogero Maria Oddo, Domenico Formica, Emiliano Schena
2019 conf
MeMeA
Carlo Massaroni, Emiliano Schena, Sergio Silvestri, Soumyajyoti Maji
2019 J jnl
Sensors
Carlo Massaroni, Andrea Nicolò, Daniela Lo Presti, Massimo Sacchetti, Sergio Silvestri, Emiliano Schena
2019 conf
MetroInd4.0&IoT
Emiliano Schena, Carlo Massaroni, Sara Iacoponi, Alessandro Bertè, Arianna Leone, Sara Musicco, Domenico Formica, Luigi Raiano, Massimiliano Carassiti, Paola Palermo, Aurelio De Filippis, Chiara Valenti
2019 conf
MeMeA
Carlo Massaroni, Joshua Di Tocco, Daniela Lo Presti, Emiliano Schena, Federica Bressi, Marco Bravi, Sandra Miccinilli, Silvia Sterzi, Umile Giuseppe Longo, Alessandra Berton, Pasquale Terracina, Arianna Carnevale, Vincenzo Denaro, Domenico Formica, Paola Saccomandi
2019 J jnl
Sensors
Carlo Massaroni, Daniela Lo Presti, Domenico Formica, Sergio Silvestri, Emiliano Schena
2019 conf
MetroInd4.0&IoT
Daniela Lo Presti, Carlo Massaroni, Joshua Di Tocco, Emiliano Schena, Arianna Carnevale, Umile Giuseppe Longo, Jessica D'Abbraccio, Luca Massari, Calogero Maria Oddo, Michele Arturo Caponero
2019 conf
MeMeA
Paola Saccomandi, Martina De Landro, Carlo Massaroni, Yuman Fong, Jinha M. Park, John P. Park, Emiliano Schena
2019 conf
IEEE SENSORS
Joshua Di Tocco, Carlo Massaroni, Nicola Di Stefano, Domenico Formica, Emiliano Schena
2018 conf
EMBC
Carlo Massaroni, Francesco Giurazza, Marco Tesei, Emiliano Schena, Fabio Corvino, M. Meneo, L. Corletti, R. Niola, Roberto Setola
2018 J jnl
J. Sensors
Carlo Massaroni, Daniel Simões Lopes, Daniela Lo Presti, Emiliano Schena, Sergio Silvestri
2018 conf
MeMeA
Edoardo Evangelisti, Emiliano Schena, Carlo Massaroni, Daniela Lo Presti, Paola Saccomandi, Massimiliano Carassiti, Paola Palermo, Domenico Formica, Roberto Setola
2018 conf
MeMeA
Federica Montagna, Emiliano Schena, Carlo Massaroni, Chiara Caciotti, Daniela Lo Presti, Sergio Silvestri
2018 conf
MeMeA
Carlo Massaroni, Emiliano Schena, Sergio Silvestri, Fabrizio Taffoni, Mario Merone
2018 conf
MeMeA
Carlo Massaroni, Daniela Lo Presti, Chiara Losquadro, Paolo Resta, Paola Saccomandi, Emiliano Schena, Rosaria D'Amato, Michele Arturo Caponero
2018 conf
MeMeA
Paola Saccomandi, Eugenio Magnoni, Carlo Massaroni, Francesco Giurazza, Daniela Lo Presti, Emiliano Schena
2018 conf
EMBC
Sara Iacoponi, Carlo Massaroni, Daniela Lo Presti, Paola Saccomandi, Michele A. Caponero, Rosaria D'Amato, Emiliano Schena
2018 conf
MeMeA
Daniela Lo Presti, Carlo Massaroni, Paola Saccomandi, Emiliano Schena, Domenico Formica, Michele Arturo Caponero, Giulia Di Tomaso
2018 conf
MeMeA
Elena De Vita, Emiliano Schena, Carlo Massaroni, Paolo Verze, Nicola Carlomagno, Vincenzo Tammaro, Juliet Ippolito, Daniele Tosi, Michele Arturo Caponero, Paola Saccomandi, Giovanna Palumbo, Agostino Iadicicco, Stefania Campopiano
2018 conf
EMBC
Nunzia Molinaro, Carlo Massaroni, Daniela Lo Presti, Paola Saccomandi, Giulia Di Tomaso, Loredana Zollo, Paolo Perego, Giuseppe Andreoni, Emiliano Schena
2017 conf
EMBC
Daniela Lo Presti, Carlo Massaroni, Paola Saccomandi, Michele A. Caponero, Domenico Formica, Emiliano Schena
2017 conf
I2MTC
Ambra Varalda, Emiliano Schena, Carlo Massaroni, Michele Arturo Caponero, Andrea Polimadei, Daniele Tosi, Paola Saccomandi
2017 conf
I2MTC
Carlo Massaroni, Guglielmo Senesi, Emiliano Schena, Paola Saccomandi, Sergio Silvestri, Amanda P. Silvatti, Irisz K. Levai, Ricardo M. L. Barros
2017 conf
EMBC
Massimiliano Carassiti, Rossella Quarta, Alessia Mattei, Marco Tesei, Paola Saccomandi, Carlo Massaroni, Roberto Setola, Emiliano Schena
2017 conf
I2MTC
Michele Arturo Caponero, Andrea Polimadei, Marcello Ariano, Emiliano Schena, Carlo Massaroni, Sergio Silvestri, Paola Saccomandi
2017 conf
I2MTC
Rosaria D'Amato, Michele A. Caponero, Emiliano Schena, Paola Saccomandi, Carlo Massaroni
2017 J jnl
Sensors
Carlo Massaroni, Michele A. Caponero, Rosaria D'Amato, Daniela Lo Presti, Emiliano Schena
2017 conf
I2MTC
Giovanna Palumbo, Agostino Iadicicco, Stefania Campopiano, Daniele Tosi, Emiliano Schena, Carlo Massaroni, Nicola Carlomagno, Vincenzo Tammaro, Paolo Verze, Juliet Ippolito
2017 conf
I2MTC
Daniela Lo Presti, Carlo Massaroni, Domenico Formica, Francesco Giurazza, Emiliano Schena, Paola Saccomandi, Michele Arturo Caponero, M. Muto
2017 conf
IEEE SENSORS
Emiliano Schena, Carlo Massaroni, Paola Saccomandi, Jacques Marescaux, Michele Diana, Guido Costamagna, Daniele Tosi
2017 conf
EMBC
Paola Saccomandi, Francesco Maria Di Matteo, Emiliano Schena, Giuseppe Quero, Carlo Massaroni, Francesco Giurazza, Guido Costamagna, Sergio Silvestri
2017 conf
EMBC
Carlo Massaroni, Emiliano Schena, Sergio Silvestri
2017 conf
IEEE SENSORS
Sanzhar Korganbayev, Yerzhan Orazayev, Sultan Sovetov, Ali Bazyl, Daniele Tosi, Emiliano Schena, Carlo Massaroni, Riccardo Gassino, Alberto Vallan, Guido Perrone
2017 conf
I2MTC
Emiliano Schena, Francesco Giurazza, Carlo Massaroni, Yuman Fong, John J. Park, Paola Saccomandi
2016 J jnl
J. Sensors
Andrea Rosi, Emiliano Schena, Carlo Massaroni, Eleonora Tamilia, Domenico Formica, Fabrizio Taffoni
2016 conf
EMBC
Marco Tesei, Paola Saccomandi, Carlo Massaroni, Rossella Quarta, Massimiliano Carassiti, Emiliano Schena, Roberto Setola
2016 conf
EMBC
Carlo Massaroni, Emiliano Schena, Paola Saccomandi, Sergio Silvestri
2016 conf
EMBC
Carlo Massaroni, Ciocchetti Ciocchetti, Giulia Di Tomaso, Paola Saccomandi, Michele A. Caponero, Andrea Polimadei, Domenico Formica, Emiliano Schena
2016 conf
MeMeA
Serena Villani, Paola Saccomandi, Carlo Massaroni, Emiliano Schena, Roberto L. Cazzato, Francesco Giurazza, Giulia Frauenfelder
2016 conf
MeMeA
Nadia Di Santo, Camilla Cavaiola, Paola Saccomandi, Carlo Massaroni, Francesco Giurazza, Giulia Frauenfelder, Emiliano Schena, Francesco Maria Di Matteo, Guido Costamagna, Michele Arturo Caponero, Andrea Polimadei
2016 conf
MeMeA
Sara Pangaro, Paola Saccomandi, Carlo Massaroni, Sergio Silvestri, Emiliano Schena, Guido Costamagna, Francesco Maria Di Matteo, Michele Arturo Caponero, Andrea Polimadei
2016 conf
EMBC
Carlo Massaroni, Eugenio Cassetta, Irisz K. Levai, Samantha L. Winter, John W. Dickinson, Sergio Silvestri
2016 conf
MeMeA
Chiara Losquadro, Paola Saccomandi, Carlo Massaroni, Emiliano Schena
2016 conf
EMBC
Paola Saccomandi, Giulia Frauenfelder, Carlo Massaroni, Michele A. Caponero, Andrea Polimadei, Fabrizio Taffoni, Francesco Maria Di Matteo, Guido Costamagna, Francesco Giurazza, Emiliano Schena
2015 conf
EMBC
Niccolò Vallone, Maria Cecilia Pizzo, Carlo Massaroni, Paola Saccomandi, Sergio Silvestri, Massimiliano Carassiti, Alessia Mattei, Emiliano Schena
2015 conf
EMBC
Carlo Massaroni, Emiliano Schena, Paola Saccomandi, Michelangelo Morrone, Silvia Sterzi, Sergio Silvestri
2015 J jnl
J. Sensors
Giuseppe Tardi, Carlo Massaroni, Paola Saccomandi, Emiliano Schena
2015 conf
EMBC
Emiliano Schena, Federica Fani, Paola Saccomandi, Carlo Massaroni, Giulia Frauenfelder, Francesco Giurazza, Sergio Silvestri
2015 J jnl
J. Sensors
Paola Saccomandi, Calogero Maria Oddo, Loredana Zollo, Domenico Formica, Rocco Antonio Romeo, Carlo Massaroni, Michele Arturo Caponero, Nicola Vitiello, Eugenio Guglielmelli, Sergio Silvestri, Emiliano Schena
2015 conf
EMBC
Paola Saccomandi, Emiliano Schena, Carlo Massaroni, Francesco Maria Di Matteo, Sergio Silvestri
2015 conf
MeMeA
Emiliano Schena, Paola Saccomandi, Marina Piccolo, Carlo Massaroni, Sergio Silvestri, Claudia L. Piccolo, Giulia Frauenfelder, Francesco Giurazza, Bruno Beomonte Zobel
2015 conf
EMBC
Silivia Cappelli, Paola Saccomandi, Carlo Massaroni, Andrea Polimadei, Sergio Silvestri, Michele A. Caponero, Giulia Frauenfelder, Emiliano Schena
2015 conf
MeMeA
Carlo Massaroni, Francesca De Leo, Emiliano Schena, Paola Saccomandi, Sergio Silvestri
2015 conf
MeMeA
Emiliano Schena, Paola Saccomandi, Carlo Massaroni, Valeria Quattrocchi, Giulia Frauenfelder, Francesco Giurazza, Sergio Silvestri, Michele Arturo Caponero, Andrea Polimadei
2015 conf
MeMeA
Emiliano Schena, Paola Saccomandi, Carlo Massaroni, Giulia Frauenfelder, Francesco Giurazza, Giorgio M. Peroglio, Sergio Silvestri, Michele Arturo Caponero, Andrea Polimadei
2014 conf
EMBC
Camilla Cavaiola, Eleonora Tamilia, Carlo Massaroni, Giulia Morbidoni, Emiliano Schena, Domenico Formica, Fabrizio Taffoni
2014 conf
EMBC
Ilaria Malvarosa, Carlo Massaroni, Carlo Liguori, Jijo Paul, Bruno Beomonte Zobel, Paola Saccomandi, Thomas J. Vogl, Sergio Silvestri, Emiliano Schena
tests/unit/test_decompile_ioc_extractor.py
← Index tests/unit/test_decompile_ioc_extractor.py python
"""Unit tests for IOC extraction modules:
- ioc_extractor/ioc_extractor.py — IOCExtractorFromResults
- ioc_extractor/standalone_ioc_extractor.py — IOCScraper
"""
import pytest
from unittest.mock import MagicMock

from redb.extractors.ioc_extractor.standalone_ioc_extractor import (
    IOCScraper,
    IOCType,
    SourceType,
    ExtractedIOC,
)
from redb.extractors.ioc_extractor.ioc_extractor import IOCExtractorFromResults


# ============================================================================
# 8a. IOCExtractorFromResults
# ============================================================================

class TestIOCExtractorFromResults:
    def setup_method(self):
        self.log = MagicMock()

    def test_extract_from_strings(self):
        results = {
            "strings": [
                {"string": "Visit https://evil.com/payload", "string_offset": 0x100}
            ],
            "decompiled": [],
        }
        extractor = IOCExtractorFromResults(results, sha256="a" * 64, log=self.log)
        iocs = extractor.extract()
        assert any(ioc.ioc_type == IOCType.URL for ioc in iocs)

    def test_extract_from_decompiled(self):
        results = {
            "strings": [],
            "decompiled": [
                {
                    "decompiled_function": "connect_to('https://c2.malware.org/gate');",
                    "decompiled_function_hash": "hash123",
                    "function_type": "USER",
                }
            ],
        }
        extractor = IOCExtractorFromResults(results, sha256="a" * 64, log=self.log)
        iocs = extractor.extract()
        assert any(ioc.ioc_type == IOCType.URL for ioc in iocs)

    def test_extract_skips_library_functions(self):
        results = {
            "strings": [],
            "decompiled": [
                {
                    "decompiled_function": "call https://should-skip.com",
                    "decompiled_function_hash": "lib_hash",
                    "function_type": "LIBRARY",
                },
                {
                    "decompiled_function": "jmp https://also-skip.com",
                    "decompiled_function_hash": "thunk_hash",
                    "function_type": "THUNK",
                },
            ],
        }
        extractor = IOCExtractorFromResults(results, sha256="a" * 64, log=self.log)
        iocs = extractor.extract()
        assert len(iocs) == 0

    def test_extract_handles_bytes_strings(self):
        results = {
            "strings": [
                {"string": b"Visit https://evil.net/gate", "string_offset": 0}
            ],
            "decompiled": [],
        }
        extractor = IOCExtractorFromResults(results, sha256="a" * 64, log=self.log)
        iocs = extractor.extract()
        assert any(ioc.ioc_type == IOCType.URL for ioc in iocs)

    def test_extract_empty_results(self):
        results = {"strings": [], "decompiled": []}
        extractor = IOCExtractorFromResults(results, sha256="a" * 64, log=self.log)
        iocs = extractor.extract()
        assert len(iocs) == 0

    def test_extract_from_text_raw(self):
        """text_raw entries are scraped and tagged with SourceType.TEXT_RAW."""
        from redb.extractors.ioc_extractor.standalone_ioc_extractor import SourceType

        results = {
            "text_raw": [
                {
                    "content": "var x = fetch('https://attacker.example.org/c2');",
                    "content_hash": "rawhash",
                }
            ],
        }
        extractor = IOCExtractorFromResults(results, sha256="a" * 64, log=self.log)
        iocs = extractor.extract()
        assert any(
            ioc.ioc_type == IOCType.URL and ioc.source_type == SourceType.TEXT_RAW
            for ioc in iocs
        )

    def test_extract_from_text_normalized(self):
        """text_normalized entries are scraped and tagged with TEXT_NORMALIZED.
        This is the surface that catches IOCs hidden behind eval(atob(...)) or
        similar wrappers — the deobfuscator unwraps them, this path scrapes
        the unwrapped form."""
        from redb.extractors.ioc_extractor.standalone_ioc_extractor import SourceType

        results = {
            "text_normalized": [
                {
                    "content": "fetch('http://hidden.example.com/payload');",
                    "content_hash": "normhash",
                }
            ],
        }
        extractor = IOCExtractorFromResults(results, sha256="a" * 64, log=self.log)
        iocs = extractor.extract()
        assert any(
            ioc.ioc_type == IOCType.URL
            and ioc.source_type == SourceType.TEXT_NORMALIZED
            for ioc in iocs
        )

    def test_extract_text_surfaces_distinct_from_decompiled(self):
        """Same URL appearing in raw and normalized forms produces two IOCs
        with distinct source_type values, so analysts can tell them apart."""
        from redb.extractors.ioc_extractor.standalone_ioc_extractor import SourceType

        results = {
            "text_raw": [
                {"content": "https://shared.example.com/", "content_hash": "h1"}
            ],
            "text_normalized": [
                {"content": "https://shared.example.com/", "content_hash": "h2"}
            ],
        }
        extractor = IOCExtractorFromResults(results, sha256="a" * 64, log=self.log)
        iocs = extractor.extract()
        kinds = {ioc.source_type for ioc in iocs if ioc.ioc_type == IOCType.URL}
        assert SourceType.TEXT_RAW in kinds
        assert SourceType.TEXT_NORMALIZED in kinds

    def test_prepare_export_clickhouse(self):
        results = {
            "strings": [
                {"string": "https://evil.com/test", "string_offset": 100}
            ],
            "decompiled": [],
        }
        extractor = IOCExtractorFromResults(results, sha256="a" * 64, log=self.log)
        extractor.extract()
        export = extractor.prepare_export_data("ClickHouseExporter")
        assert export is not None
        data, col_names, col_types = export
        assert len(data) > 0
        assert len(col_names) == 6
        assert len(col_types) == 6

    def test_prepare_export_print(self):
        results = {
            "strings": [
                {"string": "https://evil.com/test", "string_offset": 100}
            ],
            "decompiled": [],
        }
        extractor = IOCExtractorFromResults(results, sha256="a" * 64, log=self.log)
        extractor.extract()
        export = extractor.prepare_export_data("PrintExporter")
        assert isinstance(export, list)
        assert len(export) > 0
        assert "sha256" in export[0]
        assert "ioc_type" in export[0]

    def test_prepare_export_no_iocs(self):
        results = {"strings": [], "decompiled": []}
        extractor = IOCExtractorFromResults(results, sha256="a" * 64, log=self.log)
        extractor.extract()
        export = extractor.prepare_export_data("ClickHouseExporter")
        assert export is None

    def test_get_clickhouse_table(self):
        results = {"strings": [], "decompiled": []}
        extractor = IOCExtractorFromResults(results, sha256="a" * 64, log=self.log)
        assert extractor.get_clickhouse_table() == "redb_iocs"

    def test_tag(self):
        results = {"strings": [], "decompiled": []}
        extractor = IOCExtractorFromResults(results, sha256="a" * 64, log=self.log)
        tag = extractor.tag()
        assert isinstance(tag, str)


# ============================================================================
# 8b. IOCScraper (standalone_ioc_extractor.py)
# ============================================================================

class TestIOCScraperIPv4:
    def setup_method(self):
        self.scraper = IOCScraper()

    def test_scrape_ipv4(self):
        # Use a routable public IP (not in RFC 5737 test ranges, not private)
        text = "Connect to 185.100.87.202 for command"
        iocs = list(self.scraper.scrape(text, SourceType.STRING, "test"))
        ipv4_iocs = [i for i in iocs if i.ioc_type == IOCType.IPV4]
        assert len(ipv4_iocs) == 1
        assert ipv4_iocs[0].ioc_value == "185.100.87.202"

    def test_scrape_ipv4_private_excluded(self):
        text = "192.168.1.1 and 8.8.8.8"
        iocs = list(self.scraper.scrape(text, SourceType.STRING, "test"))
        ipv4_iocs = [i for i in iocs if i.ioc_type == IOCType.IPV4]
        assert len(ipv4_iocs) == 0


class TestIOCScraperIPv6:
    def setup_method(self):
        self.scraper = IOCScraper()

    def test_scrape_ipv6(self):
        text = "Connect to 2001:0db8:85a3:0000:0000:8a2e:0370:7334"
        iocs = list(self.scraper.scrape(text, SourceType.STRING, "test"))
        ipv6_iocs = [i for i in iocs if i.ioc_type == IOCType.IPV6]
        # 2001:0db8 is documentation range, but the regex may still match
        # we just check no crash and proper handling
        assert isinstance(ipv6_iocs, list)


class TestIOCScraperURL:
    def setup_method(self):
        self.scraper = IOCScraper()

    def test_scrape_url(self):
        text = 'load("https://evil.com/payload")'
        iocs = list(self.scraper.scrape(text, SourceType.STRING, "test"))
        url_iocs = [i for i in iocs if i.ioc_type == IOCType.URL]
        assert len(url_iocs) >= 1
        assert "evil.com" in url_iocs[0].ioc_value

    def test_scrape_defanged_url(self):
        text = "hxxps://evil[.]com/payload"
        iocs = list(self.scraper.scrape(text, SourceType.STRING, "test"))
        url_iocs = [i for i in iocs if i.ioc_type == IOCType.URL]
        assert len(url_iocs) >= 1


class TestIOCScraperEmail:
    def setup_method(self):
        self.scraper = IOCScraper()

    def test_scrape_email(self):
        text = "Send report to [email protected] for review"
        iocs = list(self.scraper.scrape(text, SourceType.STRING, "test"))
        email_iocs = [i for i in iocs if i.ioc_type == IOCType.EMAIL]
        assert len(email_iocs) >= 1
        assert email_iocs[0].ioc_value == "[email protected]"


class TestIOCScraperFQDN:
    def setup_method(self):
        self.scraper = IOCScraper()

    def test_scrape_fqdn(self):
        text = "Resolved evil.com in DNS lookup"
        iocs = list(self.scraper.scrape(text, SourceType.STRING, "test"))
        fqdn_iocs = [i for i in iocs if i.ioc_type == IOCType.FQDN]
        assert any(ioc.ioc_value == "evil.com" for ioc in fqdn_iocs)

    def test_scrape_fqdn_excluded(self):
        text = "Visit example.com"
        iocs = list(self.scraper.scrape(text, SourceType.STRING, "test"))
        fqdn_iocs = [i for i in iocs if i.ioc_type == IOCType.FQDN]
        assert not any(ioc.ioc_value == "example.com" for ioc in fqdn_iocs)


class TestIOCScraperJSContext:
    """Verifies the JS-context FQDN filter rejects JS object-access syntax
    that shape-matches a hostname while preserving real C2 hostnames.

    The corpus below comes from a real Vjw0rm-family screenshot showing 12
    'Domains' extracted from a JS sample of which only 2 were genuine. The
    filter must drop the 10 FPs and keep the 2 TPs.
    """

    def _scrape_fqdns(self, scraper, fragment: str):
        # Wrap each fragment in spaces so the FQDN regex's lookbehind succeeds
        # (the pre-token character is a non-identifier).
        text = f" {fragment} "
        return [
            ioc.ioc_value
            for ioc in scraper.scrape(text, SourceType.STRING, "test")
            if ioc.ioc_type == IOCType.FQDN
        ]

    def test_default_mode_keeps_legacy_behavior(self):
        """Without js_context=True the filter is dormant — every FQDN that
        the regex catches must still pass _validate_fqdn the same way it did
        before this change."""
        scraper = IOCScraper()  # js_context defaults to False
        assert self._scrape_fqdns(scraper, "process.id") == ["process.id"]
        assert self._scrape_fqdns(scraper, "lib.so") == ["lib.so"]
        assert self._scrape_fqdns(scraper, "system.net") == ["system.net"]

    def test_js_context_drops_fp_tlds(self):
        """gTLDs that double as common JS property suffixes (`.name`, `.id`,
        `.so`, `.post`, `.services`, `.tools`, ...) are rejected wholesale
        when js_context is set."""
        scraper = IOCScraper(js_context=True)
        # Each of these is in the screenshot and must be rejected purely on
        # the TLD blocklist (some also hit the SLD blocklist, but the TLD
        # check fires first).
        assert self._scrape_fqdns(scraper, "component.name") == []
        assert self._scrape_fqdns(scraper, "exploit.name") == []
        assert self._scrape_fqdns(scraper, "func.name") == []
        assert self._scrape_fqdns(scraper, "proc.name") == []
        assert self._scrape_fqdns(scraper, "process.name") == []
        assert self._scrape_fqdns(scraper, "lib.so") == []
        assert self._scrape_fqdns(scraper, "proc.id") == []
        assert self._scrape_fqdns(scraper, "http.post") == []
        assert self._scrape_fqdns(scraper, "this.sandboxindicators.services") == []

    def test_js_context_drops_fp_slds(self):
        """JS keywords / framework roots used as the leftmost segment of a
        dotted chain are rejected even when the TLD is legitimate (`system.net`
        is the canonical example: `.net` is a real TLD but `system` is never
        a hostname)."""
        scraper = IOCScraper(js_context=True)
        assert self._scrape_fqdns(scraper, "system.net") == []
        assert self._scrape_fqdns(scraper, "this.foo.com") == []
        assert self._scrape_fqdns(scraper, "process.config.json") == []
        assert self._scrape_fqdns(scraper, "vue.app") == []
        assert self._scrape_fqdns(scraper, "firebase.io") == []

    def test_js_context_preserves_real_c2(self):
        """The screenshot's two true positives must survive: protocol prefix
        SLDs (`ftp`, `smtp`) are intentionally NOT in JS_FP_SLDS so legitimate
        C2 / exfil hostnames keep flowing into the IOC table."""
        scraper = IOCScraper(js_context=True)
        assert self._scrape_fqdns(scraper, "ftp.syfrusvoid.com") == ["ftp.syfrusvoid.com"]
        assert self._scrape_fqdns(scraper, "smtp.gmail.com") == ["smtp.gmail.com"]
        # And a generic malware-style hostname (no TLD/SLD overlap with code)
        # still passes:
        assert self._scrape_fqdns(scraper, "evil-c2.example.org") == ["evil-c2.example.org"]


class TestIOCScraperOnion:
    def setup_method(self):
        self.scraper = IOCScraper()

    def test_scrape_onion(self):
        # v2 onion address (16 chars)
        text = "Connect to expyuzz4wqqyqhjn.onion"
        iocs = list(self.scraper.scrape(text, SourceType.STRING, "test"))
        onion_iocs = [i for i in iocs if i.ioc_type == IOCType.ONION]
        assert len(onion_iocs) >= 1


class TestIOCScraperHashes:
    def setup_method(self):
        self.scraper = IOCScraper()

    def test_scrape_md5_hash(self):
        md5_val = "d41d8cd98f00b204e9800998ecf8427e"
        text = f"Hash: {md5_val}"
        iocs = list(self.scraper.scrape(text, SourceType.STRING, "test"))
        md5_iocs = [i for i in iocs if i.ioc_type == IOCType.HASH_MD5]
        assert len(md5_iocs) == 1

    def test_scrape_sha1_hash(self):
        sha1_val = "da39a3ee5e6b4b0d3255bfef95601890afd80709"
        text = f"Hash: {sha1_val}"
        iocs = list(self.scraper.scrape(text, SourceType.STRING, "test"))
        sha1_iocs = [i for i in iocs if i.ioc_type == IOCType.HASH_SHA1]
        assert len(sha1_iocs) == 1

    def test_scrape_sha256_hash(self):
        sha256_val = "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
        text = f"Hash: {sha256_val}"
        iocs = list(self.scraper.scrape(text, SourceType.STRING, "test"))
        sha256_iocs = [i for i in iocs if i.ioc_type == IOCType.HASH_SHA256]
        assert len(sha256_iocs) == 1

    def test_scrape_hash_dedup(self):
        # A SHA256 match should prevent the same hex being emitted as SHA1 substring
        sha256_val = "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
        text = f"Hash: {sha256_val}"
        iocs = list(self.scraper.scrape(text, SourceType.STRING, "test"))
        sha256_iocs = [i for i in iocs if i.ioc_type == IOCType.HASH_SHA256]
        sha1_iocs = [i for i in iocs if i.ioc_type == IOCType.HASH_SHA1]
        # SHA256 first 40 chars should not appear as separate SHA1
        assert len(sha256_iocs) >= 1
        first40 = sha256_val[:40]
        assert not any(ioc.ioc_value == first40 for ioc in sha1_iocs)

    def test_scrape_invalid_hash(self):
        # All zeros should be excluded
        text = "Hash: " + "0" * 32
        iocs = list(self.scraper.scrape(text, SourceType.STRING, "test"))
        hash_iocs = [i for i in iocs if i.ioc_type in (IOCType.HASH_MD5, IOCType.HASH_SHA1, IOCType.HASH_SHA256)]
        assert len(hash_iocs) == 0


class TestIOCScraperCVECWE:
    def setup_method(self):
        self.scraper = IOCScraper()

    def test_scrape_cve(self):
        text = "Exploiting CVE-2021-44228"
        iocs = list(self.scraper.scrape(text, SourceType.STRING, "test"))
        cve_iocs = [i for i in iocs if i.ioc_type == IOCType.CVE]
        assert len(cve_iocs) == 1
        assert cve_iocs[0].ioc_value == "CVE-2021-44228"

    def test_scrape_cwe(self):
        text = "This is CWE-79 in action"
        iocs = list(self.scraper.scrape(text, SourceType.STRING, "test"))
        cwe_iocs = [i for i in iocs if i.ioc_type == IOCType.CWE]
        assert len(cwe_iocs) == 1
        assert cwe_iocs[0].ioc_value == "CWE-79"


class TestIOCScraperCrypto:
    def setup_method(self):
        self.scraper = IOCScraper()

    def test_scrape_btc_address(self):
        # A valid-looking BTC P2PKH address
        text = "Send BTC to 1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa"
        iocs = list(self.scraper.scrape(text, SourceType.STRING, "test"))
        btc_iocs = [i for i in iocs if i.ioc_type == IOCType.CRYPTO_BTC]
        assert len(btc_iocs) >= 1

    def test_scrape_eth_address(self):
        text = "ETH wallet: 0xde0B295669a9FD93d5F28D9Ec85E40f4cb697BAe"
        iocs = list(self.scraper.scrape(text, SourceType.STRING, "test"))
        eth_iocs = [i for i in iocs if i.ioc_type == IOCType.CRYPTO_ETH]
        assert len(eth_iocs) >= 1


class TestIOCScraperPaths:
    def setup_method(self):
        self.scraper = IOCScraper()

    def test_scrape_linux_path(self):
        text = "Read config from /etc/passwd"
        iocs = list(self.scraper.scrape(text, SourceType.STRING, "test"))
        path_iocs = [i for i in iocs if i.ioc_type == IOCType.PATH_LINUX]
        assert len(path_iocs) >= 1
        assert any("/etc/passwd" in ioc.ioc_value for ioc in path_iocs)

    def test_scrape_windows_path(self):
        text = r"Load from C:\Windows\System32\cmd.exe"
        iocs = list(self.scraper.scrape(text, SourceType.STRING, "test"))
        path_iocs = [i for i in iocs if i.ioc_type == IOCType.PATH_WINDOWS]
        assert len(path_iocs) >= 1
        assert any(r"C:\Windows\System32\cmd.exe" in ioc.ioc_value for ioc in path_iocs)

    def test_scrape_windows_path_source_escaped(self):
        """Paths embedded in JS / JSON / PowerShell string literals appear with
        doubled backslashes. The regex must accept both forms, and the stored
        IOC must be normalised so escaped and runtime forms collapse to one."""
        text = "const exclusions = ['C:\\\\Windows\\\\Temp', 'C:\\\\Users\\\\Public'];"
        iocs = list(self.scraper.scrape(text, SourceType.STRING, "test"))
        path_iocs = [i for i in iocs if i.ioc_type == IOCType.PATH_WINDOWS]
        assert len(path_iocs) >= 2
        values = {ioc.ioc_value for ioc in path_iocs}
        assert r"C:\Windows\Temp" in values
        assert r"C:\Users\Public" in values
        assert not any("\\\\" in v for v in values), f"backslashes not normalised: {values}"

    def test_scrape_windows_path_with_wildcard(self):
        """Malware commonly uses wildcard paths like the Defender-exclusion
        pattern below; `*` is a valid path component and must be preserved."""
        text = "'C:\\\\Users\\\\*\\\\AppData\\\\Local\\\\Temp'"
        iocs = list(self.scraper.scrape(text, SourceType.STRING, "test"))
        path_iocs = [i for i in iocs if i.ioc_type == IOCType.PATH_WINDOWS]
        assert any(r"C:\Users\*\AppData\Local\Temp" == ioc.ioc_value for ioc in path_iocs)

    # --- Behaviour-pinning regression tests -----------------------------------
    # These lock in the trade-offs of the two-tier component grammar (strict
    # first char, permissive body in delimited segments, strict final segment,
    # colon excluded from bodies). Every one of them was a real-or-potential
    # regression while the regex was being rewritten.

    def test_path_with_internal_space(self):
        """`Program Files` is the canonical reason segment bodies must allow
        whitespace. The old regex's permissive body class was correct on this
        case; the new grammar must preserve it."""
        text = r"Path: C:\Program Files\Microsoft\app.exe"
        iocs = list(self.scraper.scrape(text, SourceType.STRING, "test"))
        path_iocs = [i for i in iocs if i.ioc_type == IOCType.PATH_WINDOWS]
        assert any(r"C:\Program Files\Microsoft\app.exe" == ioc.ioc_value for ioc in path_iocs)

    def test_path_with_internal_space_in_escaped_form(self):
        """The combination of source-escaping and internal whitespace is the
        case the old regex got wrong (it required single backslashes) and the
        first iteration of the new regex got wrong (it forbade whitespace
        everywhere). Both must work now."""
        text = "'C:\\\\Program Files (x86)\\\\Microsoft\\\\app.exe'"
        iocs = list(self.scraper.scrape(text, SourceType.STRING, "test"))
        path_iocs = [i for i in iocs if i.ioc_type == IOCType.PATH_WINDOWS]
        assert any(r"C:\Program Files (x86)\Microsoft\app.exe" == ioc.ioc_value for ioc in path_iocs)

    def test_path_stops_at_whitespace_when_no_separator_follows(self):
        """The strict final-segment class prevents prose-slurping. Critical
        because segment bodies allow whitespace — without this, every path
        followed by free text would gobble the rest of the line."""
        text = r"see c:\users\admin and other stuff"
        iocs = list(self.scraper.scrape(text, SourceType.STRING, "test"))
        path_iocs = [i for i in iocs if i.ioc_type == IOCType.PATH_WINDOWS]
        assert any(ioc.ioc_value == r"c:\users\admin" for ioc in path_iocs)
        assert not any("stuff" in ioc.ioc_value for ioc in path_iocs)

    def test_two_drives_separated_by_prose_match_independently(self):
        """`From C:\\one to D:\\two` must yield two IOCs, not one slurp.
        Pinned because excluding `:` from segment bodies is what enables this
        — without that exclusion, ` to D:` would be valid body of segment 1."""
        text = r"From C:\one to D:\two"
        iocs = list(self.scraper.scrape(text, SourceType.STRING, "test"))
        values = {i.ioc_value for i in iocs if i.ioc_type == IOCType.PATH_WINDOWS}
        assert r"C:\one" in values
        assert r"D:\two" in values

    def test_path_lowercase_drive(self):
        text = r"Backup at d:\backup\db.sql"
        iocs = list(self.scraper.scrape(text, SourceType.STRING, "test"))
        path_iocs = [i for i in iocs if i.ioc_type == IOCType.PATH_WINDOWS]
        assert any(ioc.ioc_value == r"d:\backup\db.sql" for ioc in path_iocs)

    def test_path_just_root(self):
        """Bare `C:\\` (the root of a drive) must match — Defender exclusion
        lists ship it as a literal entry."""
        text = "['C:\\\\', 'C:\\\\Windows']"
        iocs = list(self.scraper.scrape(text, SourceType.STRING, "test"))
        values = {i.ioc_value for i in iocs if i.ioc_type == IOCType.PATH_WINDOWS}
        assert "C:\\" in values
        assert r"C:\Windows" in values

    def test_drive_letter_alone_does_not_match(self):
        """`D:` with no separator following is not a path."""
        text = "Drive D: is mounted"
        iocs = list(self.scraper.scrape(text, SourceType.STRING, "test"))
        path_iocs = [i for i in iocs if i.ioc_type == IOCType.PATH_WINDOWS]
        assert path_iocs == []

    def test_trailing_punctuation_is_stripped(self):
        """`See C:\\Path\\file.txt.` — the final period is sentence
        punctuation, not part of the path. `rstrip('.,;:')` strips it."""
        text = r"See C:\Path\file.txt, and also C:\Other\file.exe."
        iocs = list(self.scraper.scrape(text, SourceType.STRING, "test"))
        values = {i.ioc_value for i in iocs if i.ioc_type == IOCType.PATH_WINDOWS}
        assert r"C:\Path\file.txt" in values
        assert r"C:\Other\file.exe" in values


class TestIOCScraperRegistryKey:
    def setup_method(self):
        self.scraper = IOCScraper()

    def test_scrape_hklm_short_form(self):
        text = r"reg add HKLM\SYSTEM\CurrentControlSet\Services\SharedAccess /v EnableFirewall"
        iocs = list(self.scraper.scrape(text, SourceType.STRING, "test"))
        reg_iocs = [i for i in iocs if i.ioc_type == IOCType.REGISTRY_KEY]
        assert any(r"HKLM\SYSTEM\CurrentControlSet\Services\SharedAccess" in ioc.ioc_value for ioc in reg_iocs)

    def test_scrape_hkey_long_form(self):
        text = r"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run"
        iocs = list(self.scraper.scrape(text, SourceType.STRING, "test"))
        reg_iocs = [i for i in iocs if i.ioc_type == IOCType.REGISTRY_KEY]
        assert any(r"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run" == ioc.ioc_value for ioc in reg_iocs)

    def test_scrape_registry_source_escaped(self):
        """Same source-escaping concern as Windows paths."""
        text = "'HKLM\\\\SYSTEM\\\\CurrentControlSet\\\\Services\\\\SharedAccess\\\\Parameters\\\\FirewallPolicy\\\\DomainProfile'"
        iocs = list(self.scraper.scrape(text, SourceType.STRING, "test"))
        reg_iocs = [i for i in iocs if i.ioc_type == IOCType.REGISTRY_KEY]
        assert any(r"HKLM\SYSTEM\CurrentControlSet\Services\SharedAccess\Parameters\FirewallPolicy\DomainProfile" == ioc.ioc_value for ioc in reg_iocs)
        assert all("\\\\" not in ioc.ioc_value for ioc in reg_iocs)

    def test_bare_hive_not_extracted(self):
        """A bare hive mention with no path component should not match — too
        common in prose ('the HKLM hive') to be useful as an IOC."""
        text = "The HKLM hive contains system-wide settings; HKCU is per-user."
        iocs = list(self.scraper.scrape(text, SourceType.STRING, "test"))
        reg_iocs = [i for i in iocs if i.ioc_type == IOCType.REGISTRY_KEY]
        assert reg_iocs == []

    def test_registry_not_classified_as_path(self):
        """HKLM\\... starts with letters not a drive-letter+colon, so the
        Windows path regex must not also match it."""
        text = r"HKLM\SYSTEM\CurrentControlSet\Services\Foo"
        iocs = list(self.scraper.scrape(text, SourceType.STRING, "test"))
        path_iocs = [i for i in iocs if i.ioc_type == IOCType.PATH_WINDOWS]
        assert path_iocs == []


class TestIOCScraperServer:
    def setup_method(self):
        self.scraper = IOCScraper()

    def test_scrape_server(self):
        text = "Connect to 185.100.87.202:8080 for C2"
        iocs = list(self.scraper.scrape(text, SourceType.STRING, "test"))
        server_iocs = [i for i in iocs if i.ioc_type == IOCType.SERVER]
        assert len(server_iocs) >= 1
        assert "185.100.87.202:8080" in server_iocs[0].ioc_value


class TestIOCScraperDedup:
    def setup_method(self):
        self.scraper = IOCScraper()

    def test_scrape_dedup_within_text(self):
        text = "https://evil.com https://evil.com"
        iocs = list(self.scraper.scrape(text, SourceType.STRING, "test"))
        url_iocs = [i for i in iocs if i.ioc_type == IOCType.URL]
        assert len(url_iocs) == 1

    def test_scrape_empty_text(self):
        iocs = list(self.scraper.scrape("", SourceType.STRING, "test"))
        assert len(iocs) == 0