Cecilia Laschi

254 papers A* 23A 22B 9C 6Journal 112Unranked 80
YearRankTypeTitle / Venue / Authors
2026 J jnl
CoRR
Jie Wang, Peng Du, Yiyuan Zhang, Zhexin Xie, Cecilia Laschi
2026 J jnl
IEEE Access
Daniele Somma, Diego Bianchi, Francesco Iori, Cecilia Laschi, Egidio Falotico
2026 J jnl
Int. J. Robotics Res.
ZhiQiang Tang, Peiyi Wang, Wenci Xin, Cecilia Laschi
2026 J jnl
CoRR
Linxin Hou, Qirui Wu, Zhihang Qin, Yongxin Guo, Cecilia Laschi
2026 J jnl
CoRR
Huishi Huang, Jack Klusmann, Haozhe Wang, Shuchen Ji, Fengkang Ying, Yiyuan Zhang, John Nassour, Gordon Cheng, Daniela Rus, Jun Liu, Marcelo H. Ang Jr., Cecilia Laschi
2026 J jnl
CoRR
Yuli Song, Wenbo Li, Wenci Xin, ZhiQiang Tang, Daniela Rus, Cecilia Laschi
2026 J jnl
CoRR
Chunzheng Wang, Yiyuan Zhang, Annan Tang, Ziqiu Zeng, Haoran Chen, Quan Gao, Zixuan Zhuang, Boyu Li, Zhilin Xiong, Aoqian Zhang, Ce Hao, Siyuan Luo, Tongyang Zhao, Cecilia Laschi, Fan Shi
2026 J jnl
IEEE Trans. Robotics
Peiyi Wang, Daniel Feliú-Talegon, Yuchen Sun, Zhexin Xie, Wenci Xin, Muhammad Sunny Nazeer, Cosimo Della Santina, Cecilia Laschi, Federico Renda
2026 J jnl
CoRR
Chenrui Zhang, Yiyuan Zhang, Yunfei Ye, Junkai Chen, Haozhe Wang, Cecilia Laschi
2025 J jnl
CoRR
Linxin Hou, Qirui Wu, Zhihang Qin, Neil Banerjee, Yongxin Guo, Cecilia Laschi
2025 J jnl
CoRR
Peiyi Wang, Paul A. M. Lefeuvre, Shangwei Zou, Zhenwei Ni, Daniela Rus, Cecilia Laschi
2025 conf
RoboSoft
Giovanni Bianchi, Muralidharan Mohanakrishnan, Cecilia Laschi
2025 J jnl
Annu. Rev. Control. Robotics Auton. Syst.
Barbara Mazzolai, Cecilia Laschi, Laura Margheri
2025 conf
RoboSoft
Wenci Xin, Mingrui Nie, Zhexin Xie, Cecilia Laschi
2025 J jnl
CoRR
Huishi Huang, Haozhe Wang, Chongyu Fang, Mingge Yan, Ruochen Xu, Yiyuan Zhang, Zhanchi Wang, Fengkang Ying, Jun Liu, Cecilia Laschi, Marcelo H. Ang Jr.
2025 conf
RoboSoft
Keyi Li, Chengxi Bai, Jie Wang, Muralidharan Mohanakrishnan, Zhexin Xie, Cecilia Laschi
2025 conf
RoboSoft
Bobing Zhang, Yiyuan Zhang, Yiming Li, Sicheng Xuan, Hong Wei Ng, Yuliang Liufu, ZhiQiang Tang, Cecilia Laschi
2025 J jnl
CoRR
Shengyao Zhang, Yiyuan Zhang, Chenrui Zhang, Yiming Li, Wenci Xin, Yuliang Liufu, Hong Wei Ng, Cecilia Laschi
2025 A conf
IROS
Zhenwei Ni, Chang Xu, Zhihang Qin, Ceng Zhang, ZhiQiang Tang, Peiyi Wang, Cecilia Laschi
2025 J jnl
CoRR
Zhenwei Ni, Chang Xu, Zhihang Qin, Ceng Zhang, ZhiQiang Tang, Peiyi Wang, Cecilia Laschi
2025 conf
RoboSoft
Peiyi Wang, Yaxin Zeng, Yuchen Sun, Zhenwei Ni, Muhammad Sunny Nazeer, Cecilia Laschi
2025 J jnl
IEEE Robotics Autom. Mag.
Jim Torresen, Cecilia Laschi, Edson Prestes, Lydia E. Kavraki, Praminda Caleb-Solly, Yueh-Hsuan Weng
2025 J jnl
IEEE Robotics Autom. Lett.
YuanYuan Li, Peiyi Wang, Qian Zhang, Keyi Li, Yiyuan Zhang, Longxin Kan, Wenci Xin, Jian Feng, Jianguo Cai, Cecilia Laschi
2025 J jnl
CoRR
Maximilian Stölzle, Niccolò Pagliarani, Francesco Stella, Josie Hughes, Cecilia Laschi, Daniela Rus, Matteo Cianchetti, Cosimo Della Santina, Gioele Zardini
2025 J jnl
CoRR
Zhihang Qin, Yueheng Zhang, Wan Su, Linxin Hou, Shenghao Zhou, Zhijun Chen, Yu Jun Tan, Cecilia Laschi
2025 conf
ICNSC
João Damião Almeida, Egidio Falotico, Cecilia Laschi, José Santos-Victor
2025 J jnl
CoRR
João Damião Almeida, Egidio Falotico, Cecilia Laschi, José Santos-Victor
2025 J jnl
Sci. Robotics
Cecilia Laschi
2024 conf
Living Machines (1)
Muhammad Sunny Nazeer, Yasmin Tauqeer Ansari, Egidio Falotico, Cecilia Laschi
2024 A conf
IROS
Longxin Kan, Joshua Lam Jia Qing, Zhihang Qin, Keyi Li, ZhiQiang Tang, Cecilia Laschi
2024 J jnl
IEEE Robotics Autom. Mag.
Anna Astolfi, Mrudul Chellapurath, Giacomo Picardi, Martina Capriotti, Kayla Mladinich, Cecilia Laschi, Sergio Stefanni, Marcello Calisti
2024 J jnl
CoRR
Bobing Zhang, Yiyuan Zhang, Yiming Li, Sicheng Xuan, Hong Wei Ng, Yuliang Liufu, ZhiQiang Tang, Cecilia Laschi
2024 J jnl
IEEE Trans. Robotics
Muhammad Sunny Nazeer, Cecilia Laschi, Egidio Falotico
2024 J jnl
CoRR
Yuchen Sun, Anup Teejo Mathew, Imran Afgan, Federico Renda, Cecilia Laschi
2024 J jnl
CoRR
Carlo Alessi, Camilla Agabiti, Daniele Caradonna, Cecilia Laschi, Federico Renda, Egidio Falotico
2024 J jnl
IEEE Robotics Autom. Mag.
Diego Bianchi, Michele Gabrio Antonelli, Cecilia Laschi, Angelo Maria Sabatini, Egidio Falotico
2024 J jnl
IEEE Robotics Autom. Lett.
Diego Bianchi, Giulia Campinoti, Costanza Comitini, Cecilia Laschi, Alessandro Rizzo, Angelo Maria Sabatini, Egidio Falotico
2024 A conf
IROS
Peiyi Wang, Daniel Feliú-Talegon, Sheng Guo, Federico Renda, Cecilia Laschi
2023 J jnl
Neuromorph. Comput. Eng.
Elisa Donati, Cecilia Laschi, Barbara Mazzolai, Chiara Bartolozzi
2023 J jnl
IEEE Robotics Autom. Lett.
Wenci Xin, Fangmeng Zhu, Peiyi Wang, Zhexin Xie, ZhiQiang Tang, Cecilia Laschi
2023 conf
ICINCO (1)
Diego Bianchi, Michele Gabrio Antonelli, Cecilia Laschi, Angelo Maria Sabatini, Egidio Falotico
2023 A* conf
ICRA
ZhiQiang Tang, Peiyi Wang, Wenci Xin, Zhexin Xie, Longxin Kan, Muralidharan Mohanakrishnan, Cecilia Laschi
2023 J jnl
Sci. Robotics
Zhexin Xie, Feiyang Yuan, Jiaqi Liu, Lufeng Tian, Bohan Chen, Zhongqiang Fu, Sizhe Mao, Tongtong Jin, Yun Wang, Xia He, Gang Wang, Yanru Mo, Xilun Ding, Yihui Zhang, Cecilia Laschi, Li Wen
2023 conf
RoboSoft
Enrico Donato, Yasmin Tauqeer Ansari, Cecilia Laschi, Egidio Falotico
2023 J jnl
CoRR
Enrico Donato, Yasmin Tauqeer Ansari, Cecilia Laschi, Egidio Falotico
2023 conf
RoboSoft
Muhammad Sunny Nazeer, Diego Bianchi, Giulia Campinoti, Cecilia Laschi, Egidio Falotico
2023 J jnl
Sensors
Muhammad Sunny Nazeer, Cecilia Laschi, Egidio Falotico
2023 J jnl
IEEE Robotics Autom. Lett.
Carlo Bosio, Debora Zrinscak, Cecilia Laschi, Matteo Cianchetti
2023 J jnl
IEEE Robotics Autom. Lett.
Zhexin Xie, Muralidharan Mohanakrishnan, Peiyi Wang, Jiaqi Liu, Wenci Xin, ZhiQiang Tang, Li Wen, Cecilia Laschi
2022 J jnl
IEEE Robotics Autom. Lett.
Andrea Centurelli, Luca Arleo, Alessandro Rizzo, Silvia Tolu, Cecilia Laschi, Egidio Falotico
2022 J jnl
IEEE Robotics Autom. Lett.
Francesco Pique, Hari Teja Kalidindi, Lorenzo Fruzzetti, Cecilia Laschi, Arianna Menciassi, Egidio Falotico
2022 J jnl
IEEE Robotics Autom. Lett.
Peiyi Wang, ZhiQiang Tang, Wenci Xin, Zhexin Xie, Sheng Guo, Cecilia Laschi
2022 J jnl
IEEE Robotics Autom. Lett.
ZhiQiang Tang, Peiyi Wang, Wenci Xin, Cecilia Laschi
2022 C conf
ICINCO
Diego Bianchi, Michele Gabrio Antonelli, Cecilia Laschi, Egidio Falotico
2022 J jnl
Sci. Robotics
Bradley J. Nelson, Pierre E. Dupont, Dario Floreano, Ken Goldberg, Hongri Gu, Neil Jacobstein, Cecilia Laschi, Hod Lipson
2021 J jnl
Frontiers Robotics AI
Concepción Alicia Monje Micharet, Cecilia Laschi
2021 J jnl
Adapt. Behav.
Murat Kirtay, Lorenzo Vannucci, Ugo Albanese, Cecilia Laschi, Erhan Öztop, Egidio Falotico
2021 ed.
ISER
Bruno Siciliano, Cecilia Laschi, Oussama Khatib
2021 J jnl
Sci. Robotics
Guang-Zhong Yang, Steven H. Collins, Paolo Dario, Peer Fischer, Ken Goldberg, Cecilia Laschi, Marcia McNutt
2021 J jnl
IEEE Robotics Autom. Mag.
Alessandra Sciutti, Fiorella Battaglia, Maria Rosanna Fossati, Valentina Calderai, Manuel Giuseppe Catalano, Gianluca Antonelli, Giorgio Maria Di Nunzio, Nevio Dubbini, Laura Giarré, Emanuele Menegatti, Francesca Negrello, Federica Pascucci, Monica Pivetti, Andrea Maria Zanchettin, Arturo Baroncelli, Salvatore Majorana, Carlo Marchisio, Bruno Siciliano, Paolo Rocco, Giorgio Metta, Claudio Melchiorri, Cecilia Laschi, Eugenio Guglielmelli, Alessandro De Luca, Paolo Dario, Antonio Bicchi
2021 conf
RiTA
Mattia Villani, Lorenzo Vannucci, Alessio Fasano, Cecilia Laschi, Egidio Falotico
2021 J jnl
Int. J. Robotics Res.
Giacomo Picardi, Helmut Hauser, Cecilia Laschi, Marcello Calisti
2021 J jnl
Int. J. Mach. Learn. Cybern.
Golnaz Baghdadi, Mahmood Amiri, Egidio Falotico, Cecilia Laschi
2021 J jnl
IEEE Robotics Autom. Mag.
Lino Marques, Robin Roberson Murphy, Kaspar Althoefer, Satoshi Tadokoro, Cecilia Laschi
2021 J jnl
Sci. Robotics
Cecilia Laschi, Robert J. Wood
2021 J jnl
IEEE Robotics Autom. Mag.
Gabriele Trovato, Leonardo Ricotti, Cecilia Laschi, Massimiliano Zecca, Sarah Cosentino, Luca Bartolomeo, Shuji Hashimoto, Atsuo Takanishi, Paolo Dario
2020 J jnl
Int. J. Neural Syst.
Silvia Tolu, Marie Claire Capolei, Lorenzo Vannucci, Cecilia Laschi, Egidio Falotico, Mauricio Vanegas Hernández
2020 B conf
RO-MAN
Thomas George Thuruthel, Syed Haider Abidi, Matteo Cianchetti, Cecilia Laschi, Egidio Falotico
2020 J jnl
Sci. Robotics
Barbara Mazzolai, Cecilia Laschi
2020 J jnl
Sci. Robotics
Giacomo Picardi, Mrudul Chellapurath, Saverio Iacoponi, Sergio Stefanni, Cecilia Laschi, Marcello Calisti
2020 conf
ISER
Bruno Siciliano, Cecilia Laschi, Oussama Khatib
2020 J jnl
Frontiers Robotics AI
Concepción A. Monje, Cecilia Laschi
2020 J jnl
Robotics Auton. Syst.
Athanasia Zlatintsi, A. C. Dometios, Nikolaos Kardaris, Isidoros Rodomagoulakis, Petros Koutras, Xanthi S. Papageorgiou, Petros Maragos, Costas S. Tzafestas, Panagiotis Vartholomeos, Klaus Hauer, Christian Werner, Roberta Annicchiarico, Maria Giovanna Lombardi, Fulvia Adriano, Tamim Asfour, Angelo M. Sabatini, Cecilia Laschi, Matteo Cianchetti, Rafael López
2020 ch.
Metrics of Sensory Motor Coordination and Integration in Robots and Animals
Barbara Mazzolai, Laura Margheri, Cecilia Laschi
2020 J jnl
Neurocomputing
Fatemeh Yavari, Mahmood Amiri, Fereydoon Nowshiravan Rahatabad, Egidio Falotico, Cecilia Laschi
2020 B conf
ICMI
Murat Kirtay, Ugo Albanese, Lorenzo Vannucci, Guido Schillaci, Cecilia Laschi, Egidio Falotico
2020 J jnl
CoRR
Murat Kirtay, Ugo Albanese, Lorenzo Vannucci, Guido Schillaci, Cecilia Laschi, Egidio Falotico
2020 J jnl
IEEE Robotics Autom. Mag.
Jiaqi Liu, Saverio Iacoponi, Cecilia Laschi, Li Wen, Marcello Calisti
2019 J jnl
CoRR
Thomas George Thuruthel, Syed Haider Abidi, Matteo Cianchetti, Cecilia Laschi, Egidio Falotico
2019 conf
RoboSoft
Hari Teja Kalidindi, Thomas George Thuruthel, Cecilia Laschi, Egidio Falotico
2019 conf
CBS
Thomas George Thuruthel, Taimoor Hassan, Egidio Falotico, Yasmin Ansari, Matteo Cianchetti, Cecilia Laschi
2019 J jnl
Frontiers Neurorobotics
Elisa Massi, Lorenzo Vannucci, Ugo Albanese, Marie Claire Capolei, Alexander Vandesompele, Gabriel Urbain, Angelo Maria Sabatini, Joni Dambre, Cecilia Laschi, Silvia Tolu, Egidio Falotico
2019 J jnl
IEEE Trans. Biomed. Eng.
Laura Fiorini, Martina Maselli, Raffaele Esposito, Emanuela Castro, Gianmaria Mancioppi, Francesca Cecchi, Cecilia Laschi, Saverio Ottino, Chiara Rossi, Francesca Pinori, Stefania Tocchini, Marco T. Sportiello, Paolo Dario, Filippo Cavallo
2019 J jnl
IEEE Trans. Robotics
Thomas George Thuruthel, Egidio Falotico, Federico Renda, Cecilia Laschi
2019 J jnl
Sci. Robotics
Benjamin Shih, Cecilia Laschi, Michael Thomas Tolley
2019 conf
RoboSoft
Yasmin Ansari, Cecilia Laschi, Egidio Falotico
2019 conf
CBS
Lorenzo Vannucci, Maria Pasquini, Cristina Spalletti, Matteo Caleo, Silvestro Micera, Cecilia Laschi, Egidio Falotico
2018 J jnl
Int. J. Robotics Res.
Federico Renda, Francesco Giorgio-Serchi, Frédéric Boyer, Cecilia Laschi, Jorge Dias, Lakmal D. Seneviratne
2018 conf
RoboSoft
Hiroki Shigemune, Vito Cacucciolo, Matteo Cianchetti, Hideyuki Sawada, Shuji Hashimoto, Cecilia Laschi
2018 conf
BioRob
Thomas George Thuruthel, Mariangela Manti, Egidio Falotico, Matteo Cianchetti, Cecilia Laschi
2018 J jnl
Frontiers Comput. Neurosci.
Hari Teja Kalidindi, Thomas George Thuruthel, Cecilia Laschi, Egidio Falotico
2018 conf
ICDL-EPIROB
Murat Kirtay, Lorenzo Vannucci, Ugo Albanese, Egidio Falotico, Cecilia Laschi
2018 J jnl
IEEE Robotics Autom. Lett.
Yasmin Ansari, Mariangela Manti, Egidio Falotico, Matteo Cianchetti, Cecilia Laschi
2018 B conf
ESANN
Murat Kirtay, Lorenzo Vannucci, Ugo Albanese, Alessandro Ambrosano, Egidio Falotico, Cecilia Laschi
2018 J jnl
IEEE Robotics Autom. Lett.
Thomas George Thuruthel, Egidio Falotico, Mariangela Manti, Cecilia Laschi
2018 J jnl
IEEE Robotics Autom. Mag.
Cecilia Laschi, Barbara Mazzolai, Nicola Nosengo, Valeria Delle Cave, Tamim Asfour, Dario Floreano, Stefano Stramigioli, Jean-Paul Laumond, Sabine Hauert
2018 conf
ForItAAL
Gianmaria Mancioppi, Emanuela Castro, Laura Fiorini, Martina Maselli, Cecilia Laschi, Francesca Cecchi, Filippo Cavallo
2018 conf
RoboSoft
Saverio Iacoponi, Giacomo Picardi, Mrudul Chellapurath, Marcello Calisti, Cecilia Laschi
2017 conf
Living Machines
Dario Lunni, Matteo Cianchetti, Egidio Falotico, Cecilia Laschi, Barbara Mazzolai
2017 J jnl
J. Intell. Robotic Syst.
Georg Hinkel, Henning Groenda, Sebastian Krach, Lorenzo Vannucci, Oliver Denninger, Nino Cauli, Stefan Ulbrich, Arne Roennau, Egidio Falotico, Marc-Oliver Gewaltig, Alois C. Knoll, Rüdiger Dillmann, Cecilia Laschi, Ralf H. Reussner
2017 conf
EMBC
Ilaria Baldoli, Martina Maselli, Mariangela Manti, Elisabetta Surace, Matteo Cianchetti, Cecilia Laschi
2017 A conf
IROS
Yu Kuwajima, Hiroki Shigemune, Vito Cacucciolo, Matteo Cianchetti, Cecilia Laschi, Shingo Maeda
2017 J jnl
IEEE Robotics Autom. Lett.
Taimoor Hassan, Matteo Cianchetti, Barbara Mazzolai, Cecilia Laschi, Paolo Dario
2017 J jnl
Frontiers Neurorobotics
Egidio Falotico, Lorenzo Vannucci, Alessandro Ambrosano, Ugo Albanese, Stefan Ulbrich, Juan Camilo Vasquez Tieck, Georg Hinkel, Jacques Kaiser, Igor Peric, Oliver Denninger, Nino Cauli, Murat Kirtay, Arne Roennau, Gudrun Klinker, Axel von Arnim, Luc Guyot, Daniel Peppicelli, Pablo Martínez-Cañada, Eduardo Ros, Patrick Maier, Sandro Weber, Manuel Hubert, David A. Plecher, Florian Röhrbein, Stefan Deser, Alina Roitberg, Patrick van der Smagt, Rüdiger Dillmann, Paul Levi, Cecilia Laschi, Alois C. Knoll, Marc-Oliver Gewaltig
2017 conf
EMBC
Martina Maselli, Laura Fiorini, Emanuela Castro, Ilaria Baldoli, Stefania Tocchini, Marco T. Sportiello, Filippo Cavallo, Francesca Cecchi, Cecilia Laschi
2017 J jnl
Comput. Hum. Behav.
Maria Chiara Di Lieto, Emanuela Inguaggiato, Emanuela Castro, Francesca Cecchi, Giovanni Cioni, Marta Dell'Omo, Cecilia Laschi, Chiara Pecini, Giacomo Santerini, Giuseppina Sgandurra, Paolo Dario
2017 J jnl
Biomed. Signal Process. Control.
Alberto Macerata, Andrea Nacci, Mariangela Manti, Matteo Cianchetti, Jacopo Matteucci, Salvatore Osvaldo Romeo, Bruno Fattori, Stefano Berrettini, Cecilia Laschi, Francesco Ursino
2017 J jnl
Frontiers Robotics AI
Francesco Corucci, Nick Cheney, Sam Kriegman, Josh C. Bongard, Cecilia Laschi
2017 J jnl
CoRR
Francesco Corucci, Nick Cheney, Francesco Giorgio-Serchi, Josh C. Bongard, Cecilia Laschi
2017 conf
Living Machines
Mariangela Manti, Thomas George Thuruthel, Francesco Paolo Falotico, Andrea Pratesi, Egidio Falotico, Matteo Cianchetti, Cecilia Laschi
2017 conf
EMBC
Laura Fiorini, Martina Maselli, Emanuela Castro, Stefania Tocchini, Marco T. Sportiello, Cecilia Laschi, Francesca Cecchi, Filippo Cavallo
2017 J jnl
Auton. Robots
Egidio Falotico, Nino Cauli, Przemyslaw Kryczka, Kenji Hashimoto, Alain Berthoz, Atsuo Takanishi, Paolo Dario, Cecilia Laschi
2017 J jnl
Sci. Robotics
Alain Berthoz, Paolo Dario, Cecilia Laschi
2017 conf
ROBIO
Hiroki Shigemune, Shigeki Sugano, Hideyuki Sawada, Shuji Hashimoto, Yu Kuwajima, Yuki Matsushita, Shingo Maeda, Vito Cacucciolo, Matteo Cianchetti, Cecilia Laschi
2016 conf
BioRob
Yasmin Ansari, Egidio Falotico, Yoan Mollard, Baptiste Busch, Matteo Cianchetti, Cecilia Laschi
2016 conf
BioRob
Lorenzo Vannucci, Silvia Tolu, Egidio Falotico, Paolo Dario, Henrik Hautop Lund, Cecilia Laschi
2016 J jnl
IEEE Robotics Autom. Mag.
Francesca Cecchi, Giuseppina Sgandurra, Matjaz Mihelj, Luiza Mici, Jianwei Zhang, Marko Munih, Giovanni Cioni, Cecilia Laschi, Paolo Dario
2016 J jnl
Frontiers Robotics AI
Marcello Calisti, Matteo Cianchetti, Mariangela Manti, Francesco Corucci, Cecilia Laschi
2016 J jnl
IEEE Robotics Autom. Mag.
Nino Cauli, Egidio Falotico, Alexandre Bernardino, José Santos-Victor, Cecilia Laschi
2016 conf
Living Machines
Lorenzo Vannucci, Egidio Falotico, Silvia Tolu, Paolo Dario, Henrik Hautop Lund, Cecilia Laschi
2016 J jnl
IEEE Robotics Autom. Lett.
Marcello Calisti, Egidio Falotico, Cecilia Laschi
2016 conf
ICINCO (2)
Thomas George Thuruthel, Egidio Falotico, Matteo Cianchetti, Federico Renda, Cecilia Laschi
2016 J jnl
IEEE Robotics Autom. Mag.
Cecilia Laschi, Barbara Mazzolai
2016 C conf
ALIFE
Josh C. Bongard, Cecilia Laschi, Hod Lipson, Nick Cheney, Francesco Corucci
2016 J jnl
CoRR
Vito Cacucciolo, Federico Renda, Ernesto Poccia, Cecilia Laschi, Matteo Cianchetti
2016 conf
SIMPAR
Yasmin Ansari, Egidio Falotico, Matteo Cianchetti, Cecilia Laschi
2016 conf
Living Machines
Alessandro Ambrosano, Lorenzo Vannucci, Ugo Albanese, Murat Kirtay, Egidio Falotico, Pablo Martínez-Cañada, Georg Hinkel, Jacques Kaiser, Stefan Ulbrich, Paul Levi, Christian A. Morillas, Alois C. Knoll, Marc-Oliver Gewaltig, Cecilia Laschi
2016 conf
Humanoids
Murat Kirtay, Lorenzo Vannucci, Egidio Falotico, Erhan Öztop, Cecilia Laschi
2016 J jnl
IEEE Robotics Autom. Mag.
Fumiya Iida, Andre Rosendo, Surya Girinatha Nurzaman, Cecilia Laschi, Robert Wood, Dario Floreano
2016 conf
BioRob
Mariangela Manti, Andrea Pratesi, Egidio Falotico, Matteo Cianchetti, Cecilia Laschi
2016 B conf
CogSci
Florian Röhrbein, Marc-Oliver Gewaltig, Cecilia Laschi, Gudrun Klinker, Paul Levi, Alois C. Knoll
2016 J jnl
Int. J. Robotics Res.
Francesco Giorgio-Serchi, Andrea Arienti, Cecilia Laschi
2016 conf
Living Machines
Murat Kirtay, Egidio Falotico, Alessandro Ambrosano, Ugo Albanese, Lorenzo Vannucci, Cecilia Laschi
2015 conf
ISRR (1)
Federico Renda, Francesco Giorgio-Serchi, Frédéric Boyer, Cecilia Laschi, Jorge Dias, Lakmal D. Seneviratne
2015 conf
ICAR
Egidio Falotico, Lorenzo Vannucci, Nicola Di Lecce, Paolo Dario, Cecilia Laschi
2015 conf
EMBC
Mariangela Manti, Matteo Cianchetti, Andrea Nacci, Francesco Ursino, Cecilia Laschi
2015 conf
Humanoids
Lorenzo Vannucci, Alessandro Ambrosano, Nino Cauli, Ugo Albanese, Egidio Falotico, Stefan Ulbrich, Lars Pfotzer, Georg Hinkel, Oliver Denninger, Daniel Peppicelli, Luc Guyot, Axel von Arnim, Stefan Deser, Patrick Maier, Rüdiger Dillmann, Gudrun Klinker, Paul Levi, Alois C. Knoll, Marc-Oliver Gewaltig, Cecilia Laschi
2015 conf
Living Machines
Mariangela Manti, Taimoor Hassan, Giovanni Passetti, Nicolò d'Elia, Matteo Cianchetti, Cecilia Laschi
2015 conf
EMBC
Taimoor Hassan, Mariangela Manti, Giovanni Passetti, Nicolò d'Elia, Matteo Cianchetti, Cecilia Laschi
2015 conf
Living Machines
Yasmin Ansari, Ali Leylavi Shoushtari, Vito Cacucciolo, Matteo Cianchetti, Cecilia Laschi
2015 conf
ICAR
Francesco Corucci, Marcello Calisti, Helmut Hauser, Cecilia Laschi
2015 conf
Living Machines
Lorenzo Vannucci, Egidio Falotico, Nicola Di Lecce, Paolo Dario, Cecilia Laschi
2015 A* conf
ICRA
Federico Renda, Francesco Giorgio-Serchi, Frédéric Boyer, Cecilia Laschi
2015 J jnl
IEEE Trans. Robotics
Michele Giorelli, Federico Renda, Marcello Calisti, Andrea Arienti, Gabriele Ferri, Cecilia Laschi
2015 A conf
GECCO
Francesco Corucci, Marcello Calisti, Helmut Hauser, Cecilia Laschi
2015 conf
EMBC
Ilaria Baldoli, Francesca Cecchi, Andrea Guzzetta, Cecilia Laschi
2015 conf
EMBC
Angela Grassi, Francesca Cecchi, Andrea Guzzetta, Cecilia Laschi
2015 conf
EMBC
Giovanni Passetti, Francesca Cecchi, Ilaria Baldoli, Giuseppina Sgandurra, Elena Beani, Giovanni Cioni, Cecilia Laschi, Paolo Dario
2014 C conf
ALIFE
Vito Cacucciolo, Matteo Cianchetti, Cecilia Laschi
2014 conf
Humanoids
Lorenzo Vannucci, Nino Cauli, Egidio Falotico, Alexandre Bernardino, Cecilia Laschi
2014 conf
Living Machines
Marcello Calisti, Francesco Corucci, Andrea Arienti, Cecilia Laschi
2014 conf
EMS
Vito Cacucciolo, Matteo Cianchetti, Cecilia Laschi
2014 conf
Living Machines
Federico Renda, Frédéric Boyer, Cecilia Laschi
2014 J jnl
IEEE Trans. Robotics
Federico Renda, Michele Giorelli, Marcello Calisti, Matteo Cianchetti, Cecilia Laschi
2014 conf
Living Machines
Vito Cacucciolo, Francesco Corucci, Matteo Cianchetti, Cecilia Laschi
2014 J jnl
Robotics Auton. Syst.
Maarja Kruusmaa, Xiaobo Tan, Cecilia Laschi, Paolo Fiorini, Raj Madhavan
2014 B conf
ESANN
Davide Zambrano, Jaldert O. Rombouts, Cecilia Laschi, Sander M. Bohté
2014 J jnl
IEEE Trans. Biomed. Circuits Syst.
Federico Corradi, Davide Zambrano, Marco Raglianti, Giovanni Passetti, Cecilia Laschi, Giacomo Indiveri
2013 A conf
IROS
Michele Giorelli, Federico Renda, Gabriele Ferri, Cecilia Laschi
2013 A* conf
ICRA
Francesco Giorgio-Serchi, Andrea Arienti, Ilaria Baldoli, Cecilia Laschi
2013 conf
EMBC
Selene Tognarelli, L. Deri, Francesca Cecchi, R. Scaramuzzo, A. Cuttano, Cecilia Laschi, Arianna Menciassi, P. Dario Ratti
2013 conf
BioCAS
Giovanni Passetti, Federico Corradi, Marco Raglianti, Davide Zambrano, Cecilia Laschi, Giacomo Indiveri
2013 conf
Living Machines
Michele Giorelli, Federico Renda, Gabriele Ferri, Cecilia Laschi
2013 conf
Living Machines
Maurizio Follador, Francesca Tramacere, Lucie Viry, Matteo Cianchetti, Lucia Beccai, Cecilia Laschi, Barbara Mazzolai
2013 A conf
IROS
Matteo Cianchetti, Tommaso Ranzani, Giada Gerboni, Iris De Falco, Cecilia Laschi, Arianna Menciassi
2012 conf
Living Machines
Francesco Giorgio-Serchi, Andrea Arienti, Cecilia Laschi
2012 conf
Living Machines
Marcello Calisti, Michele Giorelli, Cecilia Laschi
2012 A* conf
ICRA
Federico Renda, Cecilia Laschi
2012 A conf
IROS
Przemyslaw Kryczka, Egidio Falotico, Kenji Hashimoto, Hun-ok Lim, Atsuo Takanishi, Cecilia Laschi, Paolo Dario, Alain Berthoz
2012 A* conf
ICRA
Michele Giorelli, Federico Renda, Marcello Calisti, Andrea Arienti, Gabriele Ferri, Cecilia Laschi
2012 A* conf
ICRA
Tao Li, Kohei Nakajima, Matteo Cianchetti, Cecilia Laschi, Rolf Pfeifer
2012 conf
Living Machines
Laura Margheri, Maurizio Follador, Matteo Cianchetti, Barbara Mazzolai, Cecilia Laschi
2012 A* conf
ICRA
Marcello Calisti, Andrea Arienti, Federico Renda, Guy Levy, Binyamin Hochner, Barbara Mazzolai, Paolo Dario, Cecilia Laschi
2012 A* conf
ICRA
Matteo Cianchetti, Maurizio Follador, Barbara Mazzolai, Paolo Dario, Cecilia Laschi
2012 J jnl
Mach. Vis. Appl.
Nicola Greggio, Alexandre Bernardino, Cecilia Laschi, Paolo Dario, José Santos-Victor
2012 B conf
RO-MAN
Egidio Falotico, Nino Cauli, Kenji Hashimoto, Przemyslaw Kryczka, Atsuo Takanishi, Paolo Dario, Alain Berthoz, Cecilia Laschi
2012 conf
Living Machines
Michele Giorelli, Federico Renda, Andrea Arienti, Marcello Calisti, Matteo Cianchetti, Gabriele Ferri, Cecilia Laschi
2012 A conf
IROS
Kenji Hashimoto, Hyun-Jin Kang, Masashi Nakamura, Egidio Falotico, Hun-ok Lim, Atsuo Takanishi, Cecilia Laschi, Paolo Dario, Alain Berthoz
2012 J jnl
Adv. Robotics
Cecilia Laschi, Matteo Cianchetti, Barbara Mazzolai, Laura Margheri, Maurizio Follador, Paolo Dario
2011 conf
Humanoids
Giovanni Gerardo Muscolo, Carmine Tommaso Recchiuto, Cecilia Laschi, Paolo Dario, Kenji Hashimoto, Atsuo Takanishi
2011 conf
FET
Francesca Tramacere, Lucia Beccai, Edoardo Sinibaldi, Cecilia Laschi, Barbara Mazzolai
2011 A conf
IROS
Nuno Moutinho, Nino Cauli, Egidio Falotico, Ricardo Ferreira, José António Gaspar, Alexandre Bernardino, José Santos-Victor, Paolo Dario, Cecilia Laschi
2011 A* conf
ICRA
Gabriele Ferri, Alessandro Manzi, Francesco Fornai, Barbara Mazzolai, Cecilia Laschi, Francesco Ciuchi, Paolo Dario
2011 J jnl
J. Cogn. Neurosci.
Maria Ida Gobbini, Claudio Gentili, Emiliano Ricciardi, Claudia Bellucci, Pericle Salvini, Cecilia Laschi, Mario Guazzelli, Pietro Pietrini
2011 J jnl
IEEE Robotics Autom. Mag.
Pericle Salvini, Cecilia Laschi, Paolo Dario
2011 A* conf
ICRA
Gabriele Ferri, Alessandro Manzi, Pericle Salvini, Barbara Mazzolai, Cecilia Laschi, Paolo Dario
2011 conf
EMBC
S. M. Serio, Francesca Cecchi, E. Boldrini, Cecilia Laschi, Giuseppina Sgandurra, Giovanni Cioni, P. Dario Ratti
2011 J jnl
J. Intell. Robotic Syst.
Nicola Greggio, Alexandre Bernardino, Cecilia Laschi, José Santos-Victor, Paolo Dario
2011 conf
ICINCO (2)
Nicola Greggio, Alexandre Bernardino, Cecilia Laschi, Paolo Dario, José Santos-Victor
2011 conf
FET
Fumiya Iida, Cecilia Laschi
2011 J jnl
IEEE Robotics Autom. Mag.
Pericle Salvini, Giancarlo Teti, Enza Spadoni, Cecilia Laschi, Barbara Mazzolai, Paolo Dario
2011 conf
Humanoids
Egidio Falotico, Cecilia Laschi, Paolo Dario, Delphine Bernardin, Alain Berthoz
2010 conf
Humanoids
Elena Franchi, Egidio Falotico, Davide Zambrano, Giovanni Gerardo Muscolo, Laura Marazzato, Paolo Dario, Cecilia Laschi
2010 conf
ICTAI (2)
Nicola Greggio, Alexandre Bernardino, Cecilia Laschi, Paolo Dario, José Santos-Victor
2010 J jnl
Adv. Robotics
Pericle Salvini, Giancarlo Teti, Enza Spadoni, Emiliano Frediani, Silvio Boccalatte, Luca Nocco, Barbara Mazzolai, Cecilia Laschi, Giovanni Comandè, Emanuele Rossi, Paolo Carrozza, Paolo Dario
2010 J jnl
Int. J. Soc. Robotics
Pericle Salvini, Cecilia Laschi, Paolo Dario
2010 A conf
IROS
Qing Shi, Shunsuke Miyagishima, Shogo Fumino, Hiroyuki Ishii, Atsuo Takanishi, Cecilia Laschi, Barbara Mazzolai, Virgilio Mattoli, Paolo Dario
2010 A* conf
ICRA
Liang Ju, Gabriele Ferri, Cecilia Laschi, Barbara Mazzolai, Paolo Dario
2010 B conf
RO-MAN
Pericle Salvini, Gaetano Ciaravella, Wonpil Yu, Gabriele Ferri, Alessandro Manzi, Barbara Mazzolai, Cecilia Laschi, Sang-Rok Oh, Paolo Dario
2010 B conf
RO-MAN
Egidio Falotico, Davide Zambrano, Giovanni Gerardo Muscolo, Laura Marazzato, Paolo Dario, Cecilia Laschi
2010 J jnl
Adv. Robotics
Pericle Salvini, Cecilia Laschi
2010 C conf
ISDA
Nicola Greggio, Alexandre Bernardino, Cecilia Laschi, Paolo Dario, José Santos-Victor
2010 conf
ICTAI (2)
Nicola Greggio, Alexandre Bernardino, Cecilia Laschi, Paolo Dario, José Santos-Victor
2009 J jnl
Biol. Cybern.
Luca Ascari, Ulisse Bertocchi, Paolo Corradi, Cecilia Laschi, Paolo Dario
2009 conf
Humanoids
Egidio Falotico, Matteo Taiana, Davide Zambrano, Alexandre Bernardino, José Santos-Victor, Paolo Dario, Cecilia Laschi
2008 conf
ICIRA (1)
Liang Ju, Gabriele Ferri, Virgilio Mattoli, Barbara Mazzolai, Cecilia Laschi, Paolo Dario
2008 J jnl
Auton. Robots
Cecilia Laschi, Gioel Asuni, Eugenio Guglielmelli, Giancarlo Teti, Roland S. Johansson, Hitoshi Konosu, Zbigniew Wasik, Maria Chiara Carrozza, Paolo Dario
2008 J jnl
Adv. Robotics
Cecilia Laschi, Francesco Patane, Eliseo Stefano Maini, Luigi Manfredi, Giancarlo Teti, Loredana Zollo, Eugenio Guglielmelli, Paolo Dario
2008 J jnl
Adv. Robotics
Loredana Zollo, Selim Eskiizmirliler, Giancarlo Teti, Cecilia Laschi, Yves Burnod, Eugenio Guglielmelli, Marc A. Maier
2008 J jnl
Auton. Robots
Cecilia Laschi, Roland S. Johansson
2008 J jnl
Auton. Robots
Eliseo Stefano Maini, Luigi Manfredi, Cecilia Laschi, Paolo Dario
2008 conf
ISER
Cecilia Laschi, Barbara Mazzolai, Virgilio Mattoli, Matteo Cianchetti, Paolo Dario
2008 conf
SIMPAR
Nicola Greggio, Luigi Manfredi, Cecilia Laschi, Paolo Dario, Maria Chiara Carrozza
2008 conf
Humanoids
Nicola Greggio, Luigi Manfredi, Cecilia Laschi, Paolo Dario, Maria Chiara Carrozza
2008 J jnl
AI Soc.
Pericle Salvini, Edoardo Datteri, Cecilia Laschi, Paolo Dario
2007 J jnl
Adv. Robotics
Domenico Campolo, Cecilia Laschi, Flavio Keller, Eugenio Guglielmelli
2007 conf
ROBIO
Francesco Patane, Virgilio Mattoli, Cecilia Laschi, Barbara Mazzolai, Paolo Dario, Hiroyuki Ishii, Atsuo Takanishi
2007 J jnl
Int. J. Humanoid Robotics
Stefano Roccella, Maria Chiara Carrozza, Giovanni Cappiello, John-John Cabibihan, Cecilia Laschi, Paolo Dario, Hideaki Takanobu, Munemichi Matsumoto, Hiroyasu Miwa, Kazuko Itoh, Atsuo Takanishi
2007 A* conf
ICRA
Domenico Campolo, Eliseo Stefano Maini, Francesco Patane, Cecilia Laschi, Paolo Dario, Flavio Keller, Eugenio Guglielmelli
2007 J jnl
IEEE Trans. Robotics
Cecilia Laschi, Cynthia Breazeal, Yasushi Nakauchi
2006 conf
EMBC
Gaetano Ciaravella, Cecilia Laschi, Paolo Dario
2006 A conf
IROS
Gioel Asuni, Giancarlo Teti, Cecilia Laschi, Eugenio Guglielmelli, Paolo Dario
2006 conf
Humanoids
Luigi Manfredi, Eliseo Stefano Maini, Paolo Dario, Cecilia Laschi, Benoît Girard, Nicolas Tabareau, Alain Berthoz
2006 A* conf
ICRA
Ulisse Bertocchi, Luca Ascari, Cesare Stefanini, Cecilia Laschi, Paolo Dario
2006 conf
EMBC
Domenico Campolo, Massimo Molteni, Eugenio Guglielmelli, Flavio Keller, Cecilia Laschi, Paolo Dario
2006 B conf
RO-MAN
Paolo Dario, Cesare Stefanini, Arianna Menciassi, Cecilia Laschi, Fabrizio Vecchi
2005 A* conf
ICRA
Loredana Zollo, Eugenio Guglielmelli, Giancarlo Teti, Cecilia Laschi, Selim Eskiizmirliler, Franck Carenzi, Patrice Bendahan, Philippe Gorce, Marc A. Maier, Yves Burnod, Paolo Dario
2005 A* conf
ICRA
Gioel Asuni, Giancarlo Teti, Cecilia Laschi, Eugenio Guglielmelli, Paolo Dario
2005 C conf
ISRR
Cecilia Laschi, Eliseo Stefano Maini, Francesco Patane, Luca Ascari, Gaetano Ciaravella, Ulisse Bertocchi, Cesare Stefanini, Paolo Dario, Alain Berthoz
2005 A conf
IROS
Maria Chiara Carrozza, Alessandro Persichetti, Cecilia Laschi, Fabrizio Vecchi, Pierpaolo Vacalebri, Vincenzo Tamburrelli, Roberto Lazzarini, Paolo Dario
2005 J jnl
IEEE Robotics Autom. Mag.
Paolo Dario, Maria Chiara Carrozza, Eugenio Guglielmelli, Cecilia Laschi, Arianna Menciassi, Silvestro Micera, Fabrizio Vecchi
2004 A* conf
ICRA
Luca Ascari, Ulisse Bertocchi, Cecilia Laschi, Cesare Stefanini, Antonina Starita, Paolo Dario
2004 A conf
IROS
Francesco Patane, Cecilia Laschi, Hiroyasu Miwa, Eugenio Guglielmelli, Paolo Dario, Atsuo Takanishi
2004 A conf
IROS
Edoardo Datteri, Gioel Asuni, Giancarlo Teti, Cecilia Laschi, Paolo Dario, Eugenio Guglielmelli
2003 J jnl
Robotics Auton. Syst.
Loredana Zollo, Bruno Siciliano, Cecilia Laschi, Giancarlo Teti, Paolo Dario
2003 A conf
IROS
Edoardo Datteri, Giancarlo Teti, Cecilia Laschi, Guglielmo Tamburrini, Paolo Dario, Eugenio Guglielmelli
2003 A* conf
ICRA
Cecilia Laschi, Hiroyasu Miwa, Atsuo Takanishi, Eugenio Guglielmelli, Paolo Dario
2002 A conf
IROS
Cecilia Laschi, Philippe Gorce, Juan López Coronado, Fabio Leoni, Giancarlo Teti, Nasser Rezzoug, Antonio Guerrero-González, Juan L. Pedreño-Molina, Loredana Zollo, Eugenio Guglielmelli, Paolo Dario, Yves Burnod
2002 A conf
IROS
Loredana Zollo, Bruno Siciliano, Cecilia Laschi, Giancarlo Teti, Paolo Dario, Eugenio Guglielmelli
2002 A* conf
ICRA
Loredana Zollo, Bruno Siciliano, Cecilia Laschi, Giancarlo Teti, Paolo Dario
2002 A* conf
ICRA
Giancarlo Teti, Cecilia Laschi, Loredana Zollo, Eugenio Guglielmelli, Paolo Dario
2002 C conf
ACC
Loredana Zollo, Bruno Siciliano, Cecilia Laschi, Giancarlo Teti, Paolo Dario
2002 A* conf
ICRA
Cecilia Laschi, Margarita Gonzalo Tasis, Javier Finat Codes, Paolo Dario
2001 A conf
IROS
Loredana Zollo, Cecilia Laschi, Giancarlo Teti, Bruno Siciliano, Paolo Dario
2001 J jnl
J. Field Robotics
Paolo Dario, Eugenio Guglielmelli, Cecilia Laschi
2000 A conf
IROS
Paolo Dario, Cecilia Laschi, Maria Chiara Carrozza, Eugenio Guglielmelli, Giancarlo Teti, Bruno Massa, Massimiliano Zecca, Davide Taddeucci, Fabio Leoni
1998 J jnl
Adv. Robotics
Paolo Dario, Cecilia Laschi, Eugenio Guglielmelli
1998 A* conf
ICRA
Fabio Leoni, Massimo Guerrini, Cecilia Laschi, Davide Taddeucci, Paolo Dario, Antonina Starita
1998 A conf
IROS
Davide Taddeucci, Cecilia Laschi, Paolo Dario, Fabio Leoni, Massimo Guerrini, K. Cerbioni, C. Colosimo
1997 conf
ISER
Cecilia Laschi, Davide Taddeucci, Paolo Dario
1997 A* conf
ICRA
Davide Taddeucci, Cecilia Laschi, Roberto Lazzarini, Riccardo Magni, Paolo Dario, Antonina Starita
1996 J jnl
Adv. Robotics
Paolo Dario, Cecilia Laschi, Eugenio Guglielmelli
1994 A* conf
ICRA
Paolo Dario, Michele Rucci, C. Guadagnini, Cecilia Laschi
1994 A conf
IROS
Paolo Dario, C. Guadagnini, Cecilia Laschi, Michele Rucci
redb/extractors/yara.py
← Index redb/extractors/yara.py python
"""
YARA Extractor - Scans binary files with YARA rules and stores matches in ClickHouse.

This extractor uses the yara-x library to scan samples against a collection of
YARA rules located in the 'yara/' folder at the project root.

Supports both:
- Pre-compiled rules (.yarac) for faster loading
- Source rules (.yar/.yara) compiled on-the-fly

Schema Design:
- yara_rules: Rule metadata stored once per unique rule (deduplicated by rule_id)
- yara_matches: Sample-rule matches with binary sha256 for efficiency
"""
import inspect
import json
import os
import re
import threading
import time
from datetime import datetime, timezone
from pathlib import Path
from typing import Any, Dict, List, Optional, Tuple

import xxhash
import yara_x

from redb.extractors.enum import Tag
from redb.extractors.extractor import Extractor
from redb.models.dataclasses import YaraMatch, YaraRule


# Default compiled rules filename (can be overridden via YARA_COMPILED_RULES env var)
COMPILED_RULES_FILENAME = os.getenv("YARA_COMPILED_RULES", "compiled_rules.yarac")

# Default source collection name
DEFAULT_SOURCE_COLLECTION = os.getenv("YARA_SOURCE_COLLECTION", "default")


def canonicalize_rule(rule_text: str) -> str:
    """
    Canonicalize YARA rule text for consistent hashing.

    Strips comments and normalizes whitespace, but excludes metadata
    so rules with same logic but different metadata get the same ID.
    """
    # Strip single-line comments
    text = re.sub(r'//.*$', '', rule_text, flags=re.MULTILINE)
    # Strip multi-line comments
    text = re.sub(r'/\*.*?\*/', '', text, flags=re.DOTALL)
    # Strip meta section (keep only strings/condition)
    text = re.sub(r'meta\s*:\s*[^}]+(?=strings|condition|})', '', text, flags=re.DOTALL)
    # Normalize whitespace
    text = ' '.join(text.split())
    return text


def generate_rule_id(rule_text: str) -> int:
    """
    Generate a unique rule_id from canonicalized rule content.

    Returns:
        UInt64 hash of the canonical rule content
    """
    canonical = canonicalize_rule(rule_text)
    return xxhash.xxh64(canonical.encode('utf-8')).intdigest()


def sha256_hex_to_binary(hex_str: str) -> bytes:
    """Convert SHA256 hex string to binary (32 bytes)."""
    return bytes.fromhex(hex_str)


def sha256_binary_to_hex(binary: bytes) -> str:
    """Convert SHA256 binary (32 bytes) to hex string."""
    return binary.hex()


def parse_yara_rules(file_content: str) -> List[Dict[str, Any]]:
    """
    Parse individual YARA rules from file content.

    Handles files with multiple rules and extracts:
    - rule_name: The rule identifier
    - rule_tags: List of tags (from 'rule Name : tag1 tag2 {')
    - rule_meta: Dict of metadata key-value pairs
    - rule_text: Full rule source code

    Args:
        file_content: Raw content of a .yar/.yara file

    Returns:
        List of dicts, each containing rule_name, rule_tags, rule_meta, rule_text
    """
    rules = []

    # Pattern to match rule declarations: rule Name or rule Name : tags
    # We need to find rule boundaries by tracking braces
    rule_pattern = re.compile(
        r'(?:^|\n)\s*((?:private\s+|global\s+)*rule\s+(\w+)\s*(?::\s*([^{]*))?\s*\{)',
        re.MULTILINE
    )

    matches = list(rule_pattern.finditer(file_content))

    for i, match in enumerate(matches):
        rule_start = match.start(1)  # Start of 'rule ...'
        rule_name = match.group(2)
        tags_str = match.group(3) or ""
        rule_tags = [t.strip() for t in tags_str.split() if t.strip()]

        # Find the matching closing brace by counting braces
        brace_count = 0
        rule_end = match.end()
        in_string = False
        escape_next = False

        for j, char in enumerate(file_content[match.end() - 1:], start=match.end() - 1):
            if escape_next:
                escape_next = False
                continue
            if char == '\\':
                escape_next = True
                continue
            if char == '"' and not escape_next:
                in_string = not in_string
                continue
            if in_string:
                continue
            if char == '{':
                brace_count += 1
            elif char == '}':
                brace_count -= 1
                if brace_count == 0:
                    rule_end = j + 1
                    break

        rule_text = file_content[rule_start:rule_end].strip()

        # Extract metadata from rule
        meta = {}
        meta_match = re.search(
            r'meta\s*:\s*(.*?)(?=strings\s*:|condition\s*:|$)',
            rule_text,
            re.DOTALL
        )
        if meta_match:
            meta_text = meta_match.group(1)
            for line in meta_text.strip().split('\n'):
                if '=' in line:
                    key, _, value = line.partition('=')
                    key = key.strip()
                    value = value.strip().strip('"\'')
                    if key and not key.startswith('//'):
                        meta[key] = value

        rules.append({
            'rule_name': rule_name,
            'rule_tags': rule_tags,
            'rule_meta': meta,
            'rule_text': rule_text,
        })

    return rules


class YaraBatchInsertBuffer:
    """
    Thread-safe buffer for batching YARA match inserts.

    Collects matches from multiple samples and flushes to ClickHouse
    when batch_size is reached or flush_interval expires.
    """

    def __init__(
        self,
        exporter,
        index_prefix: str,
        batch_size: int = 1000,
        flush_interval: int = 30,
    ):
        self.exporter = exporter
        self.index_prefix = index_prefix
        self.batch_size = batch_size
        self.flush_interval = flush_interval

        self.matches_buffer: List[List] = []
        self.rules_buffer: Dict[int, List] = {}  # rule_id -> rule_data (deduplicated)
        self.lock = threading.Lock()
        self.last_flush = time.time()

        # Start background flush timer
        self._stop_timer = False
        self._timer_thread = threading.Thread(target=self._flush_timer, daemon=True)
        self._timer_thread.start()

    def add(self, sha256_binary: bytes, matches: List[Tuple], rules: Dict[int, List]) -> None:
        """
        Add matches and rules to buffer.

        Args:
            sha256_binary: Binary SHA256 (32 bytes)
            matches: List of match tuples (sha256_binary, rule_id, rule_name, scan_date, match_strings)
            rules: Dict of rule_id -> rule_data tuples
        """
        with self.lock:
            self.matches_buffer.extend(matches)
            # Merge rules (deduplicated by rule_id)
            for rule_id, rule_data in rules.items():
                if rule_id not in self.rules_buffer:
                    self.rules_buffer[rule_id] = rule_data

            if len(self.matches_buffer) >= self.batch_size:
                self._flush_locked()

    def _flush_locked(self) -> None:
        """Flush buffer (must hold lock)."""
        if not self.matches_buffer:
            return

        try:
            # Insert rules first (deduplicated)
            if self.rules_buffer:
                rules_data = list(self.rules_buffer.values())
                self.exporter.batch_insert(
                    table='yara_rules',
                    rows=rules_data,
                    column_names=[
                        'rule_id', 'rule_name', 'source_collection',
                        'ingested_at', 'rule_text', 'rule_meta', 'rule_tags'
                    ],
                    column_type_names=[
                        'UInt64', 'String', 'LowCardinality(String)',
                        "DateTime64(3, 'UTC')", 'String', 'JSON', 'Array(LowCardinality(String))'
                    ]
                )

            # Insert matches
            self.exporter.batch_insert(
                table='yara_matches',
                rows=self.matches_buffer,
                column_names=[
                    'sha256', 'rule_id', 'rule_name',
                    'scan_date', 'match_strings'
                ],
                column_type_names=[
                    'FixedString(32)', 'UInt64', 'LowCardinality(String)',
                    "DateTime64(3, 'UTC')", 'Array(String)'
                ]
            )

            print(f"[YARA] Flushed {len(self.matches_buffer)} matches and {len(self.rules_buffer)} rules")

        except Exception as e:
            print(f"[YARA] Error flushing batch: {e}")

        # Clear buffers
        self.matches_buffer = []
        self.rules_buffer = {}
        self.last_flush = time.time()

    def flush(self) -> None:
        """Public flush (acquires lock)."""
        with self.lock:
            self._flush_locked()

    def _flush_timer(self) -> None:
        """Background timer for periodic flushes."""
        while not self._stop_timer:
            time.sleep(5)  # Check every 5 seconds
            with self.lock:
                if time.time() - self.last_flush > self.flush_interval and self.matches_buffer:
                    self._flush_locked()

    def stop(self) -> None:
        """Stop the background timer and flush remaining data."""
        self._stop_timer = True
        self.flush()


class YaraExtractor(Extractor):
    """
    Extractor that scans binary files with YARA rules.

    The YARA rules are loaded from the 'yara/' folder at the project root.
    Each matching rule is stored in ClickHouse with its metadata.

    Supports pre-compiled rules for faster loading:
    - If 'yara/compiled_rules.yarac' exists, it will be loaded directly
    - Otherwise, all .yar/.yara files are compiled and cached in memory
    - Use YaraExtractor.compile_and_save() to pre-compile rules
    """

    # Class-level cache for compiled YARA rules
    _compiled_rules = None
    _rules_path = None

    def __init__(
        self,
        filepath: str,
        log: Any,
        exporters: Optional[List] = None,
        index_prefix: Optional[str] = None,
        known_benign: bool = False,
        known_malicious: bool = False,
    ):
        super().__init__(
            filepath,
            log,
            exporters,
            index_prefix,
            known_benign,
            known_malicious,
        )
        self.matches: List[YaraMatch] = []
        self.rules: Dict[str, YaraRule] = {}  # rule_name -> YaraRule (deduplicated)

    @classmethod
    def get_yara_rules_path(cls) -> Path:
        """Get the path to the YARA rules directory."""
        # Default to 'yara/' in project root
        project_root = Path(__file__).parent.parent.parent
        default_path = project_root / "yara"

        # Allow override via environment variable
        rules_path = os.getenv("YARA_RULES_PATH", str(default_path))
        return Path(rules_path)

    @classmethod
    def get_compiled_rules_path(cls) -> Path:
        """Get the path to the pre-compiled rules file."""
        return cls.get_yara_rules_path() / COMPILED_RULES_FILENAME

    @classmethod
    def load_compiled_rules(cls) -> Optional[yara_x.Rules]:
        """
        Load pre-compiled YARA rules from .yarac file.

        Returns:
            Compiled Rules object or None if file doesn't exist
        """
        compiled_path = cls.get_compiled_rules_path()
        if not compiled_path.exists():
            return None

        try:
            with open(compiled_path, "rb") as f:
                rules = yara_x.Rules.deserialize_from(f)
            # Only log in debug mode (non-prod) to avoid spamming in bulk processing
            if os.getenv("SERVER_ENV") != "prod":
                print(f"[DEBUG] Loaded pre-compiled YARA rules from {compiled_path}")
            return rules
        except Exception as e:
            print(f"[WARNING] Failed to load compiled rules from {compiled_path}: {e}")
            return None

    @classmethod
    def compile_rules_from_source(cls) -> Optional[yara_x.Rules]:
        """
        Compile all YARA rules from source .yar/.yara files.

        Returns:
            Compiled Rules object or None if no rules found
        """
        rules_path = cls.get_yara_rules_path()

        if not rules_path.exists():
            return None

        # Find all .yar and .yara files recursively
        rule_files = []
        for ext in ["*.yar", "*.yara"]:
            rule_files.extend(rules_path.rglob(ext))

        if not rule_files:
            return None

        print(f"[INFO] Compiling {len(rule_files)} YARA rule files from {rules_path}")

        # Compile all rules using yara-x compiler
        compiler = yara_x.Compiler()
        compiled_count = 0
        failed_count = 0

        for rule_file in rule_files:
            try:
                with open(rule_file, "r", encoding="utf-8") as f:
                    rule_content = f.read()
                # Use the relative path from rules_path as namespace
                namespace = str(rule_file.relative_to(rules_path).parent)
                if namespace == ".":
                    namespace = "default"
                compiler.new_namespace(namespace)
                compiler.add_source(rule_content)
                compiled_count += 1
            except Exception as e:
                # Log warning but continue with other rules
                print(f"[WARNING] Failed to compile YARA rule {rule_file}: {e}")
                failed_count += 1
                continue

        try:
            rules = compiler.build()
            print(f"[INFO] Successfully compiled {compiled_count} rule files ({failed_count} failed)")
            return rules
        except Exception as e:
            print(f"[ERROR] Failed to build YARA rules: {e}")
            return None

    @classmethod
    def compile_rules(cls, force_reload: bool = False) -> Optional[yara_x.Rules]:
        """
        Get compiled YARA rules, loading from cache, .yarac file, or compiling from source.

        Priority:
        1. Return cached rules if available
        2. Load pre-compiled .yarac file if it exists
        3. Compile from source .yar/.yara files

        Args:
            force_reload: If True, ignore cache and reload rules

        Returns:
            Compiled YARA rules or None if no rules found
        """
        rules_path = cls.get_yara_rules_path()

        # Return cached rules if available and path hasn't changed
        if (
            cls._compiled_rules is not None
            and cls._rules_path == rules_path
            and not force_reload
        ):
            return cls._compiled_rules

        # Try loading pre-compiled rules first
        rules = cls.load_compiled_rules()

        # If no pre-compiled rules, compile from source
        if rules is None:
            rules = cls.compile_rules_from_source()

        # Cache the rules
        if rules is not None:
            cls._compiled_rules = rules
            cls._rules_path = rules_path

        return rules

    @classmethod
    def compile_and_save(cls, output_path: Optional[Path] = None) -> bool:
        """
        Compile all YARA rules from source and save to a .yarac file.

        This is useful for pre-compiling rules for faster loading in production.

        Args:
            output_path: Path to save compiled rules (default: yara/compiled_rules.yarac)

        Returns:
            True if successful, False otherwise
        """
        if output_path is None:
            output_path = cls.get_compiled_rules_path()

        # Force compile from source
        rules = cls.compile_rules_from_source()
        if rules is None:
            print("[ERROR] No rules to compile")
            return False

        try:
            # Ensure parent directory exists
            output_path.parent.mkdir(parents=True, exist_ok=True)

            with open(output_path, "wb") as f:
                rules.serialize_into(f)

            print(f"[INFO] Saved compiled YARA rules to {output_path}")
            return True
        except Exception as e:
            print(f"[ERROR] Failed to save compiled rules: {e}")
            return False

    def _extract_yara_matches(self) -> Tuple[List[YaraMatch], Dict[str, YaraRule]]:
        """
        Scan the binary with compiled YARA rules.

        Returns:
            Tuple of (matches list, rules dict) for each matching rule
        """
        self.log.debug(inspect.currentframe().f_code.co_name)

        compiled_rules = self.compile_rules()
        if compiled_rules is None:
            self.log.warning("No YARA rules found or compiled")
            return [], {}

        matches = []
        rules = {}

        try:
            # Scan the binary data
            scan_results = compiled_rules.scan(self.binary)

            # Process each matching rule
            for rule in scan_results.matching_rules:
                rule_name = rule.identifier

                # Extract rule metadata and store rule (deduplicated by name)
                if rule_name not in rules:
                    meta = {}
                    for identifier, value in rule.metadata:
                        meta[identifier] = str(value)
                    rules[rule_name] = YaraRule(
                        rule_name=rule_name,
                        rule_tags=list(rule.tags),
                        rule_meta=meta,
                    )

                # Extract matched string identifiers
                matched_strings = []
                for pattern in rule.patterns:
                    for match in pattern.matches:
                        matched_strings.append(pattern.identifier)

                # Remove duplicates from matched strings
                matched_strings = list(set(matched_strings))

                yara_match = YaraMatch(
                    rule_name=rule_name,
                    match_strings=matched_strings,
                )
                matches.append(yara_match)

                self.log.debug(
                    f"YARA match: {rule_name} (tags: {list(rule.tags)})"
                )

        except Exception as e:
            self.log.error(f"Error scanning with YARA: {e}")
            return [], {}

        return matches, rules

    def extract(self) -> Optional[List[YaraMatch]]:
        """
        Extract YARA matches from the binary.

        Returns:
            List of YaraMatch objects or None on error
        """
        self.log.debug(inspect.currentframe().f_code.co_name)
        try:
            self.matches, self.rules = self._extract_yara_matches()
            return self.matches if self.matches else None
        except Exception as e:
            self.log.error(f"Error extracting YARA matches: {e}")
            return None

    def tag(self) -> str:
        """Return the tag for this extractor."""
        return Tag.YARA.value

    def get_clickhouse_table(self) -> str:
        """Return the ClickHouse table name for YARA matches."""
        return "yara_matches"

    def get_clickhouse_tables(self) -> Dict[str, str]:
        """Return all ClickHouse table names for multi-table support."""
        return {
            'rules': 'yara_rules',
            'matches': 'yara_matches',
        }

    def prepare_export_data(self, exporter_type: str) -> Any:
        """
        Prepare data for export to the specified exporter type.

        Uses optimized normalized schema with two tables:
        - yara_rules: Rule metadata with rule_id (UInt64 hash)
        - yara_matches: Matches with binary sha256 (32 bytes) and rule_id

        Args:
            exporter_type: The type of exporter (e.g., 'ClickHouseExporter')

        Returns:
            Data formatted for the specified exporter
        """

        if exporter_type == "ClickHouseExporter":
            if not self.matches:
                return None

            current_time = datetime.now(timezone.utc)
            source_collection = DEFAULT_SOURCE_COLLECTION

            # Convert sha256 hex to binary (32 bytes)
            sha256_binary = sha256_hex_to_binary(self.sha256)

            # Build rules data from self.rules (deduplicated by rule_id)
            rules_data = {}  # rule_id -> rule_data
            for rule_name, rule in self.rules.items():
                rule_content = f"rule {rule_name} {{ }}"  # Simplified for now
                rule_id = generate_rule_id(rule_content)
                if rule_id not in rules_data:
                    rules_data[rule_id] = [
                        rule_id,
                        rule.rule_name,
                        source_collection,
                        current_time,  # ingested_at
                        "",  # rule_text (empty for now, populated during sync)
                        json.dumps(rule.rule_meta),
                        rule.rule_tags,
                    ]

            # Build matches data
            matches_data = []
            for match in self.matches:
                rule_content = f"rule {match.rule_name} {{ }}"
                rule_id = generate_rule_id(rule_content)

                matches_data.append([
                    sha256_binary,  # Binary sha256 (32 bytes)
                    rule_id,
                    match.rule_name,
                    current_time,  # scan_date
                    match.match_strings,
                ])

            return {
                'multi_table': True,
                'rules': {
                    'table': 'yara_rules',
                    'data': list(rules_data.values()),
                    'column_names': [
                        'rule_id',
                        'rule_name',
                        'source_collection',
                        'ingested_at',
                        'rule_text',
                        'rule_meta',
                        'rule_tags',
                    ],
                    'column_type_names': [
                        'UInt64',
                        'String',
                        'LowCardinality(String)',
                        "DateTime64(3, 'UTC')",
                        'String',
                        'JSON',
                        'Array(LowCardinality(String))',
                    ],
                },
                'matches': {
                    'table': 'yara_matches',
                    'data': matches_data,
                    'column_names': [
                        'sha256',
                        'rule_id',
                        'rule_name',
                        'scan_date',
                        'match_strings',
                    ],
                    'column_type_names': [
                        'FixedString(32)',  # Binary sha256
                        'UInt64',
                        'LowCardinality(String)',
                        "DateTime64(3, 'UTC')",
                        'Array(String)',
                    ],
                },
            }

        return None


def sync_rules_to_db(source_collection: str = None) -> bool:
    """
    Sync all YARA rules from source files to the database.

    This ensures all rules exist in yara_rules table before scanning begins.
    Should be run before batch scanning or in container initialization.

    Args:
        source_collection: Source collection name (default from env)

    Returns:
        True if successful, False otherwise
    """
    from redb import settings

    source_collection = source_collection or DEFAULT_SOURCE_COLLECTION
    rules_path = YaraExtractor.get_yara_rules_path()

    if not rules_path.exists():
        print(f"[ERROR] Rules path does not exist: {rules_path}")
        return False

    # Find all rule files
    rule_files = []
    for ext in ["*.yar", "*.yara"]:
        rule_files.extend(rules_path.rglob(ext))

    if not rule_files:
        print(f"[INFO] No rule files found in {rules_path}")
        return True

    print(f"[INFO] Syncing {len(rule_files)} rule files to database...")

    current_time = datetime.now(timezone.utc)
    rules_data = []
    total_rules = 0

    for rule_file in rule_files:
        try:
            with open(rule_file, "r", encoding="utf-8") as f:
                file_content = f.read()

            # Parse individual rules from file (handles multiple rules per file)
            parsed_rules = parse_yara_rules(file_content)

            for rule in parsed_rules:
                rule_id = generate_rule_id(rule['rule_text'])

                rules_data.append([
                    rule_id,
                    rule['rule_name'],
                    source_collection,
                    current_time,
                    rule['rule_text'],
                    json.dumps(rule['rule_meta']),
                    rule['rule_tags'],
                ])
                total_rules += 1

        except Exception as e:
            print(f"[WARNING] Failed to parse rule file {rule_file}: {e}")
            continue

    print(f"[INFO] Parsed {total_rules} individual rules from {len(rule_files)} files")

    if not rules_data:
        print("[INFO] No rules to sync")
        return True

    # Insert rules to database
    try:
        client = settings.create_clickhouse_client()
        table = "yara_rules"

        client.insert(
            table,
            rules_data,
            column_names=[
                'rule_id', 'rule_name', 'source_collection',
                'ingested_at', 'rule_text', 'rule_meta', 'rule_tags'
            ],
            column_type_names=[
                'UInt64', 'String', 'LowCardinality(String)',
                "DateTime64(3, 'UTC')", 'String', 'JSON', 'Array(LowCardinality(String))'
            ]
        )

        print(f"[INFO] Successfully synced {len(rules_data)} rules to {table}")
        client.close()
        return True

    except Exception as e:
        print(f"[ERROR] Failed to sync rules to database: {e}")
        return False


# CLI utility for pre-compiling rules and syncing
if __name__ == "__main__":
    import argparse

    parser = argparse.ArgumentParser(description="YARA Rules Management Utility")
    parser.add_argument(
        "--compile",
        action="store_true",
        help="Compile all YARA rules and save to .yarac file",
    )
    parser.add_argument(
        "--sync-rules",
        action="store_true",
        help="Sync all YARA rules to the database (run before batch scanning)",
    )
    parser.add_argument(
        "--output",
        type=str,
        help="Output path for compiled rules (default: yara/compiled_rules.yarac)",
    )
    parser.add_argument(
        "--rules-path",
        type=str,
        help="Path to YARA rules directory (default: yara/)",
    )
    parser.add_argument(
        "--source-collection",
        type=str,
        help="Source collection name for rules (default: from YARA_SOURCE_COLLECTION env)",
    )

    args = parser.parse_args()

    if args.rules_path:
        os.environ["YARA_RULES_PATH"] = args.rules_path

    if args.compile:
        output_path = Path(args.output) if args.output else None
        success = YaraExtractor.compile_and_save(output_path)
        if not success:
            exit(1)

    if args.sync_rules:
        success = sync_rules_to_db(args.source_collection)
        if not success:
            exit(1)

    if not args.compile and not args.sync_rules:
        parser.print_help()