Catuscia Palamidessi

354 papers A* 20A 19B 40C 13Misc 1Journal 160Unranked 90
YearRankTypeTitle / Venue / Authors
2026 J jnl
ACM SIGLOG News
Catuscia Palamidessi
2026 A* conf
AAAI
Carlos Antonio Pinzón, Ehab ElSalamouny, Lucas Massot, Alexis Miller, Héber Hwang Arcolezi, Catuscia Palamidessi
2026 J jnl
CoRR
Carlos Antonio Pinzón, Ehab ElSalamouny, Lucas Massot, Alexis Miller, Héber Hwang Arcolezi, Catuscia Palamidessi
2026 J jnl
CoRR
Andreas Athanasiou, Kangsoo Jung, Catuscia Palamidessi
2025 J jnl
IEEE Access
Martina Cinquini, Karima Makhlouf, Sami Zhioua, Catuscia Palamidessi, Riccardo Guidotti
2025 J jnl
ACM SIGLOG News
Catuscia Palamidessi
2025 J jnl
CoRR
Sayan Biswas, Mark Dras, Pedro Faustini, Natasha Fernandes, Annabelle McIver, Catuscia Palamidessi, Parastoo Sadeghi
2025 J jnl
IEEE Access
Martina Cinquini, Karima Makhlouf, Jay Jawale, Sami Zhioua, Catuscia Palamidessi, Riccardo Guidotti
2025 J jnl
Proc. Priv. Enhancing Technol.
Andreas Athanasiou, Konstantinos Chatzikokolakis, Catuscia Palamidessi
2025 J jnl
CoRR
Loïs Ecoffet, Veronika Rehn-Sonigo, Jean-François Couchot, Catuscia Palamidessi
2025 J jnl
J. Comput. Secur.
Héber Hwang Arcolezi, Karima Makhlouf, Catuscia Palamidessi
2025 J jnl
CoRR
Carlos Pinzón, Catuscia Palamidessi
2025 J jnl
CoRR
Judith Sáinz-Pardo Díaz, Andreas Athanasiou, Kangsoo Jung, Catuscia Palamidessi, Álvaro López García
2025 conf
ARTMAN@CCS
Kangsoo Jung, Sayan Biswas, Catuscia Palamidessi
2025 J jnl
CoRR
Kangsoo Jung, Sayan Biswas, Catuscia Palamidessi
2025 J jnl
IEEE Trans. Dependable Secur. Comput.
Daniele Gorla, Louis Jalouzot, Federica Granese, Catuscia Palamidessi, Pablo Piantanida
2025 J jnl
CoRR
Ehab ElSalamouny, Catuscia Palamidessi
2025 A conf
CSF
Andreas Athanasiou, Konstantinos Chatzikokolakis, Catuscia Palamidessi
2024 A conf
CSF
Karima Makhlouf, Tamara Stefanovic, Héber Hwang Arcolezi, Catuscia Palamidessi
2024 J jnl
CoRR
Karima Makhlouf, Tamara Stefanovic, Héber Hwang Arcolezi, Catuscia Palamidessi
2024 conf
FAccT
Ruta Binkyte, Daniele Gorla, Catuscia Palamidessi
2024 J jnl
CoRR
Sayan Biswas, Mark Dras, Pedro Faustini, Natasha Fernandes, Annabelle McIver, Catuscia Palamidessi, Parastoo Sadeghi
2024 conf
CLeaR
Ruta Binkyte, Carlos Pinzón, Szilvia Lestyan, Kangsoo Jung, Héber Hwang Arcolezi, Catuscia Palamidessi
2024 J jnl
ACM SIGLOG News
Catuscia Palamidessi
2024 J jnl
ACM SIGLOG News
Catuscia Palamidessi
2024 J jnl
Data Min. Knowl. Discov.
Karima Makhlouf, Héber Hwang Arcolezi, Sami Zhioua, Ghassen Ben Brahim, Catuscia Palamidessi
2024 J jnl
Mach. Learn.
Carlos Pinzón, Catuscia Palamidessi, Pablo Piantanida, Frank Valencia
2024 A* conf
AAAI
Filippo Galli, Catuscia Palamidessi, Tommaso Cucinotta
2024 J jnl
Proc. Priv. Enhancing Technol.
Sayan Biswas, Catuscia Palamidessi
2024 A* conf
CCS
Andreas Athanasiou, Kangsoo Jung, Catuscia Palamidessi
2024 J jnl
CoRR
Andreas Athanasiou, Kangsoo Jung, Catuscia Palamidessi
2024 J jnl
CoRR
Andreas Athanasiou, Konstantinos Chatzikokolakis, Catuscia Palamidessi
2024 J jnl
J. Log. Algebraic Methods Program.
Karima Makhlouf, Sami Zhioua, Catuscia Palamidessi
2023 B conf
DBSec
Héber Hwang Arcolezi, Karima Makhlouf, Catuscia Palamidessi
2023 J jnl
CoRR
Héber Hwang Arcolezi, Karima Makhlouf, Catuscia Palamidessi
2023 J jnl
CoRR
Filippo Galli, Kangsoo Jung, Sayan Biswas, Catuscia Palamidessi, Tommaso Cucinotta
2023 J jnl
SN Comput. Sci.
Filippo Galli, Kangsoo Jung, Sayan Biswas, Catuscia Palamidessi, Tommaso Cucinotta
2023 A conf
CSF
Mireya Jurado, Ramon G. Gonze, Mário S. Alvim, Catuscia Palamidessi
2023 J jnl
CoRR
Mireya Jurado, Ramon G. Gonze, Mário S. Alvim, Catuscia Palamidessi
2023 J jnl
CoRR
Ruta Binkyte, Daniele Gorla, Catuscia Palamidessi
2023 A conf
CSF
Konstantinos Chatzikokolakis, Giovanni Cherubin, Catuscia Palamidessi, Carmela Troncoso
2023 J jnl
Neurocomputing
Ganesh Del Grosso, Georg Pichler, Catuscia Palamidessi, Pablo Piantanida
2023 J jnl
CoRR
Ruta Binkyte, Carlos Pinzón, Szilvia Lestyán, Kangsoo Jung, Héber Hwang Arcolezi, Catuscia Palamidessi
2023 J jnl
ACM SIGLOG News
Catuscia Palamidessi
2023 B conf
EDBT
Héber Hwang Arcolezi, Carlos Pinzón, Catuscia Palamidessi, Sébastien Gambs
2023 C conf
ICISSP
Filippo Galli, Sayan Biswas, Kangsoo Jung, Tommaso Cucinotta, Catuscia Palamidessi
2023 conf
CODASPY
Catuscia Palamidessi
2023 C conf
ISPEC
Sebastian Simon, Cezara Petrui, Carlos Pinzón, Catuscia Palamidessi
2023 conf
ICTCS
Daniele Gorla, Louis Jalouzot, Federica Granese, Catuscia Palamidessi, Pablo Piantanida
2023 J jnl
CoRR
Karima Makhlouf, Héber Hwang Arcolezi, Sami Zhioua, Ghassen Ben Brahim, Catuscia Palamidessi
2023 J jnl
Proc. VLDB Endow.
Héber Hwang Arcolezi, Sébastien Gambs, Jean-François Couchot, Catuscia Palamidessi
2023 B conf
DBSec
Héber Hwang Arcolezi, Selene Cerna, Catuscia Palamidessi
2023 J jnl
CoRR
Héber Hwang Arcolezi, Selene Cerna, Catuscia Palamidessi
2023 conf
Tiny Papers @ ICLR
Selene Cerna, Catuscia Palamidessi
2023 J jnl
CoRR
Filippo Galli, Catuscia Palamidessi, Tommaso Cucinotta
2023 conf
FPS (1)
Sayan Biswas, Kangsoo Jung, Catuscia Palamidessi
2023 J jnl
J. Comput. Secur.
Natasha Fernandes, Annabelle McIver, Catuscia Palamidessi, Ming Ding
2022 J jnl
CoRR
Ugur-Ilker Atmaca, Sayan Biswas, Carsten Maple, Catuscia Palamidessi
2022 conf
AFCP
Ruta Binkyte, Karima Makhlouf, Carlos Pinzón, Sami Zhioua, Catuscia Palamidessi
2022 J jnl
CoRR
Ruta Binkyte-Sadauskiene, Karima Makhlouf, Carlos Pinzón, Sami Zhioua, Catuscia Palamidessi
2022 J jnl
CoRR
Héber Hwang Arcolezi, Carlos Pinzón, Catuscia Palamidessi, Sébastien Gambs
2022 J jnl
CoRR
Filippo Galli, Sayan Biswas, Kangsoo Jung, Catuscia Palamidessi, Tommaso Cucinotta
2022 J jnl
CoRR
Karima Makhlouf, Sami Zhioua, Catuscia Palamidessi
2022 J jnl
ACM Trans. Priv. Secur.
Mário S. Alvim, Konstantinos Chatzikokolakis, Yusuke Kawamoto, Catuscia Palamidessi
2022 A* conf
CVPR
Ganesh Del Grosso, Hamid Jalalzai, Georg Pichler, Catuscia Palamidessi, Pablo Piantanida
2022 J jnl
CoRR
Ganesh Del Grosso, Hamid Jalalzai, Georg Pichler, Catuscia Palamidessi, Pablo Piantanida
2022 J jnl
CoRR
Sebastian Simon, Cezara Petrui, Carlos Pinzón, Catuscia Palamidessi
2022 conf
ESORICS (3)
Héber Hwang Arcolezi, Jean-François Couchot, Sébastien Gambs, Catuscia Palamidessi, Majid Zolfaghari
2022 J jnl
CoRR
Héber Hwang Arcolezi, Jean-François Couchot, Sébastien Gambs, Catuscia Palamidessi, Majid Zolfaghari
2022 J jnl
CoRR
Daniele Gorla, Louis Jalouzot, Federica Granese, Catuscia Palamidessi, Pablo Piantanida
2022 A* conf
AAAI
Carlos Pinzón, Catuscia Palamidessi, Pablo Piantanida, Frank Valencia
2022 J jnl
CoRR
Héber Hwang Arcolezi, Sébastien Gambs, Jean-François Couchot, Catuscia Palamidessi
2022 J jnl
CoRR
Ehab ElSalamouny, Catuscia Palamidessi
2022 J jnl
CoRR
Guilherme Alves, Fabien Bernier, Miguel Couceiro, Karima Makhlouf, Catuscia Palamidessi, Sami Zhioua
2022 J jnl
CoRR
Sayan Biswas, Catuscia Palamidessi
2022 J jnl
CoRR
Sayan Biswas, Kangsoo Jung, Catuscia Palamidessi
2022 J jnl
CoRR
Sayan Biswas, Kangsoo Jung, Catuscia Palamidessi
2022 A conf
CSF
Natasha Fernandes, Annabelle McIver, Catuscia Palamidessi, Ming Ding
2022 J jnl
CoRR
Natasha Fernandes, Annabelle McIver, Catuscia Palamidessi, Ming Ding
2021 A conf
CSF
Mireya Jurado, Catuscia Palamidessi, Geoffrey Smith
2021 C conf
ICTAC
Sayan Biswas, Kangsoo Jung, Catuscia Palamidessi
2021 J jnl
CoRR
Sayan Biswas, Kangsoo Jung, Catuscia Palamidessi
2021 J jnl
CoRR
Ganesh Del Grosso, Georg Pichler, Catuscia Palamidessi, Pablo Piantanida
2021 B conf
CONCUR
Nathalie Bertrand, Luca de Alfaro, Rob van Glabbeek, Catuscia Palamidessi, Nobuko Yoshida
2021 A* conf
NeurIPS
Federica Granese, Marco Romanelli, Daniele Gorla, Catuscia Palamidessi, Pablo Piantanida
2021 J jnl
CoRR
Federica Granese, Marco Romanelli, Daniele Gorla, Catuscia Palamidessi, Pablo Piantanida
2021 J jnl
Int. J. Inf. Sec.
Federica Granese, Daniele Gorla, Catuscia Palamidessi
2021 conf
Protocols, Strands, and Logic
Kangsoo Jung, Sayan Biswas, Catuscia Palamidessi
2021 J jnl
CoRR
Kangsoo Jung, Sayan Biswas, Catuscia Palamidessi
2021 J jnl
Inf. Process. Manag.
Karima Makhlouf, Sami Zhioua, Catuscia Palamidessi
2021 J jnl
SIGKDD Explor.
Karima Makhlouf, Sami Zhioua, Catuscia Palamidessi
2021 J jnl
CoRR
Carlos Pinzón, Catuscia Palamidessi, Pablo Piantanida, Frank Valencia
2021 B conf
LCN
Abhishek Kumar Mishra, Aline Carneiro Viana, Nadjib Achir, Catuscia Palamidessi
2020 J jnl
Sci. Comput. Program.
Valentina Castiglioni, Konstantinos Chatzikokolakis, Catuscia Palamidessi
2020 conf
Gabbrielli's Festschrift
Moreno Falaschi, Catuscia Palamidessi, Marco Romanelli
2020 J jnl
Fundam. Informaticae
Moreno Falaschi, Maurizio Gabbrielli, Carlos Olarte, Catuscia Palamidessi
2020 A* conf
CCS
Marco Romanelli, Konstantinos Chatzikokolakis, Catuscia Palamidessi, Pablo Piantanida
2020 J jnl
CoRR
Marco Romanelli, Konstantinos Chatzikokolakis, Catuscia Palamidessi, Pablo Piantanida
2020 J jnl
CoRR
Catuscia Palamidessi, Marco Romanelli
2020 A conf
EuroS&P
Ehab ElSalamouny, Catuscia Palamidessi
2020 J jnl
CoRR
Mário S. Alvim, Konstantinos Chatzikokolakis, Yusuke Kawamoto, Catuscia Palamidessi
2020 B conf
CONCUR
Catuscia Palamidessi, Marco Romanelli
2020 J jnl
CoRR
Karima Makhlouf, Sami Zhioua, Catuscia Palamidessi
2020 A conf
CSF
Marco Romanelli, Konstantinos Chatzikokolakis, Catuscia Palamidessi
2020 J jnl
J. Cybersecur. Priv.
Konstantinos Chatzikokolakis, Natasha Fernandes, Catuscia Palamidessi
2020 J jnl
CoRR
Karima Makhlouf, Sami Zhioua, Catuscia Palamidessi
2020 J jnl
CoRR
Konstantinos Chatzikokolakis, Giovanni Cherubin, Catuscia Palamidessi, Carmela Troncoso
2020 book
Mário S. Alvim, Konstantinos Chatzikokolakis, Annabelle McIver, Carroll Morgan, Catuscia Palamidessi, Geoffrey Smith
2019 J jnl
Theor. Comput. Sci.
Mário S. Alvim, Konstantinos Chatzikokolakis, Annabelle McIver, Carroll Morgan, Catuscia Palamidessi, Geoffrey Smith
2019 conf
LocalRec@SIGSPATIAL
Adriano Di Luzio, Aline Carneiro Viana, Konstantinos Chatzikokolakis, Georgi Dikov, Catuscia Palamidessi, Julinda Stefa
2019 A conf
CSF
Konstantinos Chatzikokolakis, Natasha Fernandes, Catuscia Palamidessi
2019 conf
IEEE Symposium on Security and Privacy Workshops
Ali Kassem, Gergely Ács, Claude Castelluccia, Catuscia Palamidessi
2019 C conf
ICTAC
Daniele Gorla, Federica Granese, Catuscia Palamidessi
2019 A* conf
IEEE Symposium on Security and Privacy
Giovanni Cherubin, Konstantinos Chatzikokolakis, Catuscia Palamidessi
2019 J jnl
CoRR
Giovanni Cherubin, Konstantinos Chatzikokolakis, Catuscia Palamidessi
2019 J jnl
CoRR
Ehab ElSalamouny, Catuscia Palamidessi
2019 J jnl
CoRR
Marco Romanelli, Catuscia Palamidessi, Konstantinos Chatzikokolakis
2019 conf
Models, Languages, and Tools for Concurrent and Distributed Programming
Natasha Fernandes, Lefki Kacem, Catuscia Palamidessi
2019 J jnl
CoRR
Natasha Fernandes, Lefki Kacem, Catuscia Palamidessi
2018 J jnl
CoRR
Mário S. Alvim, Konstantinos Chatzikokolakis, Yusuke Kawamoto, Catuscia Palamidessi
2018 J jnl
Entropy
Mário S. Alvim, Konstantinos Chatzikokolakis, Yusuke Kawamoto, Catuscia Palamidessi
2018 conf
FACS
Valentina Castiglioni, Konstantinos Chatzikokolakis, Catuscia Palamidessi
2018 J jnl
Bull. EATCS
Thomas Eiter, Javier Esparza, Catuscia Palamidessi, Gordon D. Plotkin, Natarajan Shankar
2018 conf
ANNPR
Catuscia Palamidessi, Marco Romanelli
2018 conf
PLAS@CCS
Lefki Kacem, Catuscia Palamidessi
2018 A conf
CSF
Mário S. Alvim, Konstantinos Chatzikokolakis, Catuscia Palamidessi, Anna Pazii
2018 conf
POST
Mário S. Alvim, Konstantinos Chatzikokolakis, Yusuke Kawamoto, Catuscia Palamidessi
2018 J jnl
CoRR
Mário S. Alvim, Konstantinos Chatzikokolakis, Yusuke Kawamoto, Catuscia Palamidessi
2018 J jnl
CoRR
Mário S. Alvim, Konstantinos Chatzikokolakis, Catuscia Palamidessi, Anna Pazii
2017 J jnl
Bull. EATCS
Natarajan Shankar, Catuscia Palamidessi, Gordon D. Plotkin, Moshe Y. Vardi
2017 J jnl
Proc. Priv. Enhancing Technol.
Konstantinos Chatzikokolakis, Ehab ElSalamouny, Catuscia Palamidessi
2017 conf
GameSec
Mário S. Alvim, Konstantinos Chatzikokolakis, Yusuke Kawamoto, Catuscia Palamidessi
2017 J jnl
CoRR
Mário S. Alvim, Konstantinos Chatzikokolakis, Yusuke Kawamoto, Catuscia Palamidessi
2017 J jnl
Found. Trends Priv. Secur.
Konstantinos Chatzikokolakis, Ehab ElSalamouny, Catuscia Palamidessi, Anna Pazii
2017 J jnl
Log. Methods Comput. Sci.
Yusuke Kawamoto, Konstantinos Chatzikokolakis, Catuscia Palamidessi
2017 J jnl
J. Comput. Syst. Sci.
Sardaouna Hamadou, Catuscia Palamidessi, Vladimiro Sassone
2017 conf
VALUETOOLS
Konstantinos Chatzikokolakis, Serge Haddad, Ali Kassem, Catuscia Palamidessi
2017 J jnl
CoRR
Konstantinos Chatzikokolakis, Serge Haddad, Ali Kassem, Catuscia Palamidessi
2016 A conf
CSF
Mário S. Alvim, Konstantinos Chatzikokolakis, Annabelle McIver, Carroll Morgan, Catuscia Palamidessi, Geoffrey Smith
2016 J jnl
Math. Struct. Comput. Sci.
Konstantinos Chatzikokolakis, Catuscia Palamidessi, Christelle Braun
2016 J jnl
CoRR
Yusuke Kawamoto, Konstantinos Chatzikokolakis, Catuscia Palamidessi
2016 J jnl
Theor. Comput. Sci.
Ivan Gazeau, Dale Miller, Catuscia Palamidessi
2016 C conf
LOPSTR
Moreno Falaschi, Maurizio Gabbrielli, Carlos Olarte, Catuscia Palamidessi
2016 J jnl
CoRR
Moreno Falaschi, Maurizio Gabbrielli, Carlos Olarte, Catuscia Palamidessi
2016 B conf
CONCUR
Konstantinos Chatzikokolakis, Catuscia Palamidessi, Valeria Vignudelli
2015 conf
Programming Languages with Applications to Biology and Security
Davide Chiarugi, Moreno Falaschi, Carlos Olarte, Catuscia Palamidessi
2015 J jnl
Theory Pract. Log. Program.
Moreno Falaschi, Carlos Olarte, Catuscia Palamidessi
2015 J jnl
CoRR
Konstantinos Chatzikokolakis, Catuscia Palamidessi, Marco Stronati
2015 J jnl
Proc. Priv. Enhancing Technol.
Konstantinos Chatzikokolakis, Catuscia Palamidessi, Marco Stronati
2015 Misc conf
ICDCIT
Konstantinos Chatzikokolakis, Catuscia Palamidessi, Marco Stronati
2015 C conf
ICTAC
Konstantinos Chatzikokolakis, Catuscia Palamidessi, Marco Stronati
2015 J jnl
ACM SIGLOG News
Konstantinos Chatzikokolakis, Catuscia Palamidessi, Marco Stronati
2015 J jnl
J. Comput. Secur.
Mário S. Alvim, Miguel E. Andrés, Konstantinos Chatzikokolakis, Pierpaolo Degano, Catuscia Palamidessi
2015 J jnl
Math. Struct. Comput. Sci.
Miguel E. Andrés, Catuscia Palamidessi, Geoffrey Smith
2015 conf
POST
Catuscia Palamidessi
2014 A conf
Privacy Enhancing Technologies
Konstantinos Chatzikokolakis, Catuscia Palamidessi, Marco Stronati
2014 A conf
CSF
Mário S. Alvim, Konstantinos Chatzikokolakis, Annabelle McIver, Carroll Morgan, Catuscia Palamidessi, Geoffrey Smith
2014 conf
QEST
Yusuke Kawamoto, Konstantinos Chatzikokolakis, Catuscia Palamidessi
2014 C ed.
FORTE
Erika Ábrahám, Catuscia Palamidessi
2014 J jnl
J. Comput. Secur.
Konstantinos Chatzikokolakis, Sebastian Alexander Mödersheim, Catuscia Palamidessi, Jun Pang
2014 B conf
CONCUR
Konstantinos Chatzikokolakis, Daniel Gebler, Catuscia Palamidessi, Lili Xu
2014 conf
Horizons of the Mind
Ehab ElSalamouny, Konstantinos Chatzikokolakis, Catuscia Palamidessi
2014 ed.
Horizons of the Mind
Franck van Breugel, Elham Kashefi, Catuscia Palamidessi, Jan Rutten
2014 A* conf
CCS
Nicolás Emilio Bordenabe, Konstantinos Chatzikokolakis, Catuscia Palamidessi
2014 J jnl
CoRR
Nicolás Emilio Bordenabe, Konstantinos Chatzikokolakis, Catuscia Palamidessi
2013 conf
POST
Ehab ElSalamouny, Konstantinos Chatzikokolakis, Catuscia Palamidessi
2013 J jnl
CoRR
Konstantinos Chatzikokolakis, Catuscia Palamidessi, Marco Stronati
2013 J jnl
CoRR
Moreno Falaschi, Carlos Olarte, Catuscia Palamidessi
2013 A conf
Privacy Enhancing Technologies
Konstantinos Chatzikokolakis, Miguel E. Andrés, Nicolás Emilio Bordenabe, Catuscia Palamidessi
2013 J jnl
CoRR
Catuscia Palamidessi
2013 A* conf
CCS
Miguel E. Andrés, Nicolás Emilio Bordenabe, Konstantinos Chatzikokolakis, Catuscia Palamidessi
2013 conf
QAPL
Ivan Gazeau, Dale Miller, Catuscia Palamidessi
2013 C conf
WoLLIC
Catuscia Palamidessi
2013 ed.
TGC
Catuscia Palamidessi, Mark Dermot Ryan
2012 conf
QAPL
Ivan Gazeau, Dale Miller, Catuscia Palamidessi
2012 conf
QAPL
Catuscia Palamidessi, Marco Stronati
2012 J jnl
ACM Trans. Comput. Log.
Konstantinos Chatzikokolakis, Sophia Knight, Catuscia Palamidessi, Prakash Panangaden
2012 J jnl
CoRR
Miguel E. Andrés, Nicolás Emilio Bordenabe, Konstantinos Chatzikokolakis, Catuscia Palamidessi
2012 conf
EXPRESS/SOS
Marco Giunti, Catuscia Palamidessi, Frank D. Valencia
2012 A conf
CSF
Mário S. Alvim, Konstantinos Chatzikokolakis, Catuscia Palamidessi, Geoffrey Smith
2012 J jnl
Theor. Comput. Sci.
Samson Abramsky, Michael W. Mislove, Catuscia Palamidessi
2012 J jnl
Dagstuhl Reports
Boris Köpf, Pasquale Malacaria, Catuscia Palamidessi
2012 J jnl
J. Comput. Secur.
Mário S. Alvim, Miguel E. Andrés, Catuscia Palamidessi
2012 B conf
CONCUR
Sophia Knight, Catuscia Palamidessi, Prakash Panangaden, Frank D. Valencia
2012 ed.
TOSCA
Sebastian Mödersheim, Catuscia Palamidessi
2011 B conf
FoSSaCS
Andrés Aristizábal, Filippo Bonchi, Catuscia Palamidessi, Luis Fernando Pino, Frank D. Valencia
2011 conf
Formal Aspects in Security and Trust
Mário S. Alvim, Miguel E. Andrés, Konstantinos Chatzikokolakis, Pierpaolo Degano, Catuscia Palamidessi
2011 J jnl
CoRR
Mário S. Alvim, Miguel E. Andrés, Konstantinos Chatzikokolakis, Pierpaolo Degano, Catuscia Palamidessi
2011 J jnl
Theor. Comput. Sci.
Miguel E. Andrés, Catuscia Palamidessi, Peter van Rossum, Ana Sokolova
2011 conf
ICALP (2)
Mário S. Alvim, Miguel E. Andrés, Konstantinos Chatzikokolakis, Catuscia Palamidessi
2011 J jnl
CoRR
Mário S. Alvim, Miguel E. Andrés, Konstantinos Chatzikokolakis, Catuscia Palamidessi
2011 conf
FOSAD
Mário S. Alvim, Miguel E. Andrés, Konstantinos Chatzikokolakis, Catuscia Palamidessi
2010 conf
BCB
Davide Chiarugi, Moreno Falaschi, Carlos Olarte, Catuscia Palamidessi
2010 B conf
MPC
Catuscia Palamidessi
2010 A conf
TACAS
Miguel E. Andrés, Catuscia Palamidessi, Peter van Rossum, Geoffrey Smith
2010 ch.
25 Years GULP
Maurizio Gabbrielli, Catuscia Palamidessi, Frank D. Valencia
2010 J jnl
CoRR
Mário S. Alvim, Konstantinos Chatzikokolakis, Pierpaolo Degano, Catuscia Palamidessi
2010 conf
IFIP TCS
Mário S. Alvim, Miguel E. Andrés, Catuscia Palamidessi
2010 B conf
CONCUR
Mário S. Alvim, Miguel E. Andrés, Catuscia Palamidessi
2010 conf
QEST
Miguel E. Andrés, Catuscia Palamidessi, Peter van Rossum, Ana Sokolova
2010 conf
ARSPA-WITS
Catuscia Palamidessi, Mário S. Alvim, Miguel E. Andrés
2010 J jnl
Inf. Comput.
Konstantinos Chatzikokolakis, Catuscia Palamidessi
2010 J jnl
J. Comput. Secur.
Daniele Gorla, Catuscia Palamidessi
2010 A* conf
LICS
Mário S. Alvim, Miguel E. Andrés, Catuscia Palamidessi
2010 A* conf
IEEE Symposium on Security and Privacy
Sardaouna Hamadou, Vladimiro Sassone, Catuscia Palamidessi
2010 conf
IFIP TCS
Mário S. Alvim, Miguel E. Andrés, Catuscia Palamidessi, Peter van Rossum
2009 C conf
PPDP
Moreno Falaschi, Carlos Olarte, Catuscia Palamidessi
2009 J jnl
J. Appl. Non Class. Logics
Simon Kramer, Catuscia Palamidessi, Roberto Segala, Andrea Turrini, Christelle Braun
2009 J jnl
Log. Methods Comput. Sci.
Diletta Cacciagrano, Flavio Corradini, Catuscia Palamidessi
2009 J jnl
Theor. Comput. Sci.
Moreno Falaschi, Maurizio Gabbrielli, Catuscia Palamidessi
2009 J jnl
IEEE Trans. Software Eng.
Gethin Norman, Catuscia Palamidessi, David Parker, Peng Wu
2009 B conf
MFPS
Samson Abramsky, Michael W. Mislove, Catuscia Palamidessi
2009 J jnl
Theor. Comput. Sci.
Romain Beauxis, Catuscia Palamidessi
2009 conf
Formal Aspects in Security and Trust
Sardaouna Hamadou, Catuscia Palamidessi, Vladimiro Sassone, Ehab ElSalamouny
2009 B ed.
MFPS
Samson Abramsky, Michael W. Mislove, Catuscia Palamidessi
2009 B conf
MFPS
Christelle Braun, Konstantinos Chatzikokolakis, Catuscia Palamidessi
2009 B ed.
SOFSEM
Mogens Nielsen, Antonín Kucera, Peter Bro Miltersen, Catuscia Palamidessi, Petr Tuma, Frank D. Valencia
2008 J jnl
Inf. Comput.
Konstantinos Chatzikokolakis, Catuscia Palamidessi, Prakash Panangaden
2008 conf
TGC
Abhishek Bhowmick, Catuscia Palamidessi
2008 B conf
FoSSaCS
Christelle Braun, Konstantinos Chatzikokolakis, Catuscia Palamidessi
2008 conf
Concurrency, Graphs and Models
Romain Beauxis, Catuscia Palamidessi, Frank D. Valencia
2008 J jnl
J. Comput. Secur.
Konstantinos Chatzikokolakis, Catuscia Palamidessi, Prakash Panangaden
2008 ed.
LIX
Catuscia Palamidessi, Frank Valencia
2007 B conf
APLAS
Jean Goubault-Larrecq, Catuscia Palamidessi, Angelo Troina
2007 J jnl
Theor. Comput. Sci.
Konstantinos Chatzikokolakis, Catuscia Palamidessi
2007 J jnl
Theor. Comput. Sci.
Yuxin Deng, Catuscia Palamidessi
2007 B conf
ICLP
Moreno Falaschi, Carlos Olarte, Catuscia Palamidessi, Frank Valencia
2007 conf
TGC
Romain Beauxis, Konstantinos Chatzikokolakis, Catuscia Palamidessi, Prakash Panangaden
2007 J jnl
CoRR
Konstantinos Chatzikokolakis, Catuscia Palamidessi
2007 B conf
CONCUR
Konstantinos Chatzikokolakis, Catuscia Palamidessi
2007 conf
QEST
Gethin Norman, Catuscia Palamidessi, David Parker, Peng Wu
2007 conf
SecCO@CONCUR
Daniele Gorla, Catuscia Palamidessi
2007 J jnl
Theor. Comput. Sci.
Giuseppe F. Italiano, Catuscia Palamidessi
2007 A conf
CSF
Konstantinos Chatzikokolakis, Catuscia Palamidessi, Prakash Panangaden
2007 ed.
SecCo@CONCUR
Daniele Gorla, Catuscia Palamidessi
2007 J jnl
Theor. Comput. Sci.
Diletta Cacciagrano, Flavio Corradini, Catuscia Palamidessi
2007 conf
QEST
Peng Wu, Catuscia Palamidessi, Huimin Lin
2007 J jnl
Theor. Comput. Sci.
Maria Grazia Vigliotti, Iain Phillips, Catuscia Palamidessi
2007 B conf
ICLP
Carlos Olarte, Catuscia Palamidessi, Frank Valencia
2006 B conf
ICLP
Hugo A. López, Catuscia Palamidessi, Jorge Andrés Pérez, Camilo Rueda, Frank D. Valencia
2006 conf
TGC
Konstantinos Chatzikokolakis, Catuscia Palamidessi, Prakash Panangaden
2006 conf
QAPL
Sylvain Pradalier, Catuscia Palamidessi
2006 conf
EXPRESS
Diletta Cacciagrano, Flavio Corradini, Catuscia Palamidessi
2006 J jnl
Bull. EATCS
Catuscia Palamidessi, Frank D. Valencia
2006 conf
FMCO
Jesús Aranda, Cinzia Di Giusto, Catuscia Palamidessi, Frank D. Valencia
2006 A* conf
LICS
Catuscia Palamidessi, Vijay A. Saraswat, Frank D. Valencia, Björn Victor
2006 conf
LIX
Catuscia Palamidessi, Frank D. Valencia
2006 J jnl
Theor. Comput. Sci.
Konstantinos Chatzikokolakis, Catuscia Palamidessi
2005 conf
SOS@ICALP
Axelle Ziegler, Dale Miller, Catuscia Palamidessi
2005 conf
TGC
Konstantinos Chatzikokolakis, Catuscia Palamidessi
2005 J jnl
Theor. Comput. Sci.
Catuscia Palamidessi, Oltea Mihaela Herescu
2005 conf
APC 25
Catuscia Palamidessi
2005 A* ed.
ICALP
Luís Caires, Giuseppe F. Italiano, Luís Monteiro, Catuscia Palamidessi, Moti Yung
2005 B conf
FoSSaCS
Yuxin Deng, Catuscia Palamidessi
2005 conf
Processes, Terms and Cycles
Yuxin Deng, Catuscia Palamidessi, Jun Pang
2005 conf
QAPL
Yuxin Deng, Tom Chothia, Catuscia Palamidessi, Jun Pang
2005 B conf
CONCUR
Mohit Bhargava, Catuscia Palamidessi
2005 conf
Foundations of Global Computing
Catuscia Palamidessi, Mohit Bhargava
2005 B conf
MFPS
Catuscia Palamidessi
2005 conf
Formal Aspects in Security and Trust
Konstantinos Chatzikokolakis, Catuscia Palamidessi
2005 J jnl
Bull. EATCS
Catuscia Palamidessi, Frank D. Valencia
2005 conf
FMCO
Maria Grazia Vigliotti, Iain Phillips, Catuscia Palamidessi
2005 conf
EXPRESS
Diletta Cacciagrano, Flavio Corradini, Catuscia Palamidessi
2005 conf
SecCO@CONCUR
Yuxin Deng, Catuscia Palamidessi, Jun Pang
2003 J jnl
Math. Struct. Comput. Sci.
Catuscia Palamidessi
2003 J jnl
Theor. Comput. Sci.
Raymond McDowell, Dale Miller, Catuscia Palamidessi
2003 B ed.
ICLP
Catuscia Palamidessi
2002 conf
IFIP TCS
Catuscia Palamidessi, Oltea Mihaela Herescu
2002 conf
IASTED PDCS
Catuscia Palamidessi, M. Pilquist
2002 C conf
PPDP
Catuscia Palamidessi
2002 conf
EXPRESS
Catuscia Palamidessi
2002 C conf
PPDP
Mogens Nielsen, Catuscia Palamidessi, Frank D. Valencia
2002 J jnl
Nord. J. Comput.
Mogens Nielsen, Catuscia Palamidessi, Frank D. Valencia
2001 A conf
CP
Catuscia Palamidessi, Frank D. Valencia
2001 J jnl
Theor. Comput. Sci.
Catuscia Palamidessi
2001 J jnl
CoRR
Oltea Mihaela Herescu, Catuscia Palamidessi
2001 A* conf
PODC
Oltea Mihaela Herescu, Catuscia Palamidessi
2001 J jnl
CoRR
Oltea Mihaela Herescu, Catuscia Palamidessi
2000 B ed.
CONCUR
Catuscia Palamidessi
2000 ed.
CL
John W. Lloyd, Verónica Dahl, Ulrich Furbach, Manfred Kerber, Kung-Kiu Lau, Catuscia Palamidessi, Luís Moniz Pereira, Yehoshua Sagiv, Peter J. Stuckey
2000 conf
Computational Logic
David R. Gilbert, Catuscia Palamidessi
2000 J jnl
Inf. Comput.
Catuscia Palamidessi, Joachim Parrow, Rob J. van Glabbeek
2000 B conf
FoSSaCS
Oltea Mihaela Herescu, Catuscia Palamidessi
1999 J jnl
J. Funct. Log. Program.
Catuscia Palamidessi
1999 B conf
CONCUR
Catuscia Palamidessi
1999 J jnl
ACM Comput. Surv.
Dale Miller, Catuscia Palamidessi
1999 conf
APPIA-GULP-PRODE
Marco Bertolino, Sandro Etalle, Catuscia Palamidessi
1999 C conf
LOPSTR
Marco Bertolino, Sandro Etalle, Catuscia Palamidessi
1998 J jnl
CoRR
Catuscia Palamidessi
1998 ed.
EXPRESS
Ilaria Castellani, Catuscia Palamidessi
1998 conf
EXPRESS
Ilaria Castellani, Catuscia Palamidessi
1998 ed.
PLILP
Catuscia Palamidessi, Hugh Glaser, Karl Meinke
1997 J jnl
J. Log. Comput.
Frank S. de Boer, Alessandra Di Pierro, Catuscia Palamidessi
1997 A* conf
POPL
Catuscia Palamidessi
1997 J jnl
ACM Trans. Program. Lang. Syst.
Agostino Cortesi, Gilberto Filé, Roberto Giacobazzi, Catuscia Palamidessi, Francesco Ranzato
1997 J jnl
Theor. Comput. Sci.
Moreno Falaschi, Maurizio Gabbrielli, Kim Marriott, Catuscia Palamidessi
1997 J jnl
Inf. Comput.
Moreno Falaschi, Maurizio Gabbrielli, Kim Marriott, Catuscia Palamidessi
1997 conf
JFPLC
Catuscia Palamidessi
1997 conf
EXPRESS
Catuscia Palamidessi, Joachim Parrow
1997 ed.
EXPRESS
Catuscia Palamidessi, Joachim Parrow
1997 C conf
COORDINATION
Eike Best, Frank S. de Boer, Catuscia Palamidessi
1997 J jnl
ACM Trans. Program. Lang. Syst.
Frank S. de Boer, Maurizio Gabbrielli, Elena Marchiori, Catuscia Palamidessi
1996 conf
Linear Logic Tokyo Meeting
Raymond McDowell, Dale Miller, Catuscia Palamidessi
1996 B conf
CONCUR
Eike Best, Catuscia Palamidessi
1996 B conf
SAS
Frank S. de Boer, Maurizio Gabbrielli, Catuscia Palamidessi
1995 B conf
SAS
Agostino Cortesi, Gilberto Filé, Roberto Giacobazzi, Catuscia Palamidessi, Francesco Ranzato
1995 conf
CCP
Frank S. de Boer, Catuscia Palamidessi, Eike Best
1995 conf
AMAST
Moreno Falaschi, Maurizio Gabbrielli, Kim Marriott, Catuscia Palamidessi
1995 J jnl
Inf. Comput.
Alessandra Di Pierro, Maurizio Martelli, Catuscia Palamidessi
1995 J jnl
Theor. Comput. Sci.
Frank S. de Boer, Alessandra Di Pierro, Catuscia Palamidessi
1994 J jnl
Appl. Algebra Eng. Commun. Comput.
Krzysztof R. Apt, Elena Marchiori, Catuscia Palamidessi
1994 A conf
ESOP
Alessandra Di Pierro, Catuscia Palamidessi
1994 conf
ALP
Catuscia Palamidessi
1994 conf
PLILP
Catuscia Palamidessi
1994 conf
GULP-PRODE (1)
Moreno Falaschi, Maurizio Gabbrielli, Kim Marriott, Catuscia Palamidessi
1994 conf
ICLP Workshop: Verification and Analysis of (Concurrent) Logic Languages
Moreno Falaschi, Maurizio Gabbrielli, Kim Marriott, Catuscia Palamidessi
1994 J jnl
Inf. Comput.
Frank S. de Boer, Catuscia Palamidessi
1994 conf
GULP-PRODE (1)
Maurizio Martelli, Alessandro Messora, Catuscia Palamidessi, Alain Hui-Bon-Hoa
1994 A* conf
POPL
Frank S. de Boer, Maurizio Gabbrielli, Elena Marchiori, Catuscia Palamidessi
1994 conf
ICLP Workshop: Verification and Analysis of (Concurrent) Logic Languages
Frank S. de Boer, Maurizio Gabbrielli, Elena Marchiori, Catuscia Palamidessi
1993 J jnl
Inf. Comput.
Moreno Falaschi, Giorgio Levi, Maurizio Martelli, Catuscia Palamidessi
1993 A* conf
LICS
Moreno Falaschi, Maurizio Gabbrielli, Kim Marriott, Catuscia Palamidessi
1993 conf
ILPS
Maurizio Martelli, Alessandro Messora, Catuscia Palamidessi
1993 conf
ILPS
Frank S. de Boer, Joost N. Kok, Catuscia Palamidessi, Jan J. M. M. Rutten
1992 conf
JICSLP
Frank S. de Boer, Catuscia Palamidessi
1992 conf
ALP
Krzysztof R. Apt, Elena Marchiori, Catuscia Palamidessi
1992 A* conf
LICS
Frank S. de Boer, Jan Willem Klop, Catuscia Palamidessi
1992 J jnl
Theor. Comput. Sci.
Frank S. de Boer, Joost N. Kok, Catuscia Palamidessi, Jan J. M. M. Rutten
1992 conf
REX Workshop
Frank S. de Boer, Joost N. Kok, Catuscia Palamidessi, Jan J. M. M. Rutten
1992 conf
ALPUK
Frank S. de Boer, Catuscia Palamidessi
1992 J jnl
Future Gener. Comput. Syst.
Seif Haridi, Sverker Janson, Catuscia Palamidessi
1991 conf
TAPSOFT, Vol.1
Frank S. de Boer, Catuscia Palamidessi
1991 J jnl
J. Log. Program.
Pier Giorgio Bosco, Elio Giovannetti, Corrado Moiso, Catuscia Palamidessi
1991 B conf
CONCUR
Frank S. de Boer, Catuscia Palamidessi
1991 J jnl
J. Comput. Syst. Sci.
Elio Giovannetti, Giorgio Levi, Corrado Moiso, Catuscia Palamidessi
1991 B conf
ICLP
Alessandra Di Pierro, Maurizio Martelli, Catuscia Palamidessi
1991 J jnl
Theor. Comput. Sci.
Frank S. de Boer, Jan J. M. M. Rutten, Joost N. Kok, Catuscia Palamidessi
1991 conf
PARLE (2)
Seif Haridi, Catuscia Palamidessi
1991 B conf
CONCUR
Frank S. de Boer, Joost N. Kok, Catuscia Palamidessi, Jan J. M. M. Rutten
1990 A* conf
ICALP
Catuscia Palamidessi
1990 conf
NACLP
Frank S. de Boer, Catuscia Palamidessi
1990 conf
NACLP
Giorgio Levi, Maurizio Martelli, Catuscia Palamidessi
1990 B conf
CONCUR
Frank S. de Boer, Catuscia Palamidessi
1989 B conf
MFCS
Frank S. de Boer, Joost N. Kok, Catuscia Palamidessi, Jan J. M. M. Rutten
1989 J jnl
Theor. Comput. Sci.
Moreno Falaschi, Giorgio Levi, Catuscia Palamidessi, Maurizio Martelli
1989 B conf
ICLP
Frank S. de Boer, Joost N. Kok, Catuscia Palamidessi, Jan J. M. M. Rutten
1988 conf
ICLP/SLP
Moreno Falaschi, Giorgio Levi, Maurizio Martelli, Catuscia Palamidessi
1988 J jnl
Acta Informatica
Giorgio Levi, Catuscia Palamidessi
1987 conf
SLP
Giorgio Levi, Catuscia Palamidessi, Pier Giorgio Bosco, Elio Giovannetti, Corrado Moiso
1987 conf
PARLE (1)
Marco Bellia, Pier Giorgio Bosco, Elio Giovannetti, Giorgio Levi, Corrado Moiso, Catuscia Palamidessi
1987 B conf
ICLP
Giorgio Levi, Catuscia Palamidessi
1985 conf
SLP
Giorgio Levi, Catuscia Palamidessi
1984 J jnl
Inf. Control.
Moreno Falaschi, Giorgio Levi, Catuscia Palamidessi
1983 B conf
Logic Programming Workshop
Moreno Falaschi, Giorgio Levi, Catuscia Palamidessi
redb/extractors/decompiler/DecompileBinja.py
← Index redb/extractors/decompiler/DecompileBinja.py python
import hashlib
import inspect
import json
import logging
import os
import signal
import time
from datetime import datetime, timezone
from typing import Dict, Any, Optional
from pathlib import Path
import subprocess
import sys

from redb.extractors.enum import Tag
from redb.extractors.extractor import Extractor
import magic
import pefile
from elftools.elf.elffile import ELFFile

# Import our BinjaDecompiler (conditional)
from redb.extractors.decompiler.bninja.decompiler import BinaryNinjaDecompiler

class DecompileBinja(Extractor):
    def __init__(
        self,
        filepath,
        log,
        exporters=None,
        index_prefix=None,
        elastic_index=None,
        known_benign=False,
        known_malicious=False,
        filetype=None,
        decompile_modules=None,
    ):
        super().__init__(
            filepath,
            log,
            exporters,
            index_prefix,
            elastic_index,
            known_benign,
            known_malicious,
        )
        self.log.debug(inspect.currentframe().f_code.co_name)

        # Check if Binary Ninja is available
       # if not BINARYNINJA_AVAILABLE:
        #     self.log.error("Binary Ninja is not available in this container")
        #    raise ImportError(
        #        "Binary Ninja module not found - not available in feature extraction container"
        #    )
        self.analysis_results = None
        self.binja_decompiler = None
        self.filetype = filetype
        self.decompile_modules = decompile_modules or {"all"}
        self.goresym_data = None
        self.goresym_output_path = None

        # Convert TIMEOUT to integer with a default of 1200 seconds (20 minutes)
        try:
            self.BINJA_TIMEOUT = int(os.getenv("BINJA_TIMEOUT", "1200"))
        except ValueError:
            self.log.warning(
                "Invalid BINJA_TIMEOUT value, using default of 1200 seconds"
            )
            self.BINJA_TIMEOUT = 1200

        # Convert TIMEOUT to integer with a default of 1200 seconds (20 minutes)
        try:
            self.DECOMPILE_EXTRACTOR_TIMEOUT = int(
                os.getenv("DECOMPILE_EXTRACTOR_TIMEOUT", "2580")
            )
        except ValueError:
            self.log.warning(
                "Invalid DECOMPILE_EXTRACTOR_TIMEOUT value, using default of 2580 seconds"
            )
            self.DECOMPILE_EXTRACTOR_TIMEOUT = 2580

    def __enter__(self):
        return self

    def __exit__(self, exc_type, exc_val, exc_tb):
        self.cleanup_run()

    def calculate_md5(self, input_str):
        """Calculate MD5 hash of a string."""
        return hashlib.md5(input_str.encode("utf-8")).hexdigest()

    def is_dotnet(self):
        """Check if the binary is a .NET assembly.

        Returns:
            bool: True if the file is a .NET assembly, False otherwise
        """
        try:
            if self.filetype == "pebin":
                file_type = magic.from_buffer(self.binary)
                if ".Net" in file_type:
                    return True
                pe = pefile.PE(self.filepath)
                for entry in pe.OPTIONAL_HEADER.DATA_DIRECTORY:
                    # IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR is typically 14
                    if (
                        entry.name == "IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR"
                        and entry.Size > 0
                    ):
                        return True
                return False
            return False
        except AttributeError as e:
            self.log.error(
                f"AttributeError error dotnet file {self.hash.sha256} Full error : {e}"
            )
            return False

    def is_golang(self):
        """Check if the binary is a Go-compiled binary (heuristic).

        Supports PE and ELF binaries.
        """
        try:
            if self.filetype == "pebin":
                pe = pefile.PE(self.filepath)
                signatures = [b"Go build ID:", b"runtime.main", b"main.main"]

                for section in pe.sections:
                    data = section.get_data()
                    if any(sig in data for sig in signatures):
                        return True

                return False

            elif self.filetype == "elf":
                with open(self.filepath, "rb") as f:
                    elf = ELFFile(f)

                    # 1. Section-based checks
                    section_names = [sec.name for sec in elf.iter_sections()]
                    if any(
                        s in section_names
                        for s in (".note.go.buildid", ".gopclntab")
                    ):
                        return True

                    # 2. String scan in loadable sections
                    signatures = [
                        b"Go build ID:",
                        b"runtime.main",
                        b"runtime.goexit",
                        b"runtime.morestack",
                        b"main.main",
                    ]

                    for sec in elf.iter_sections():
                        if sec["sh_flags"] & 0x2:  # SHF_ALLOC
                            data = sec.data()
                            if any(sig in data for sig in signatures):
                                return True

                return False

            return False

        except Exception as e:
            self.log.error(
                f"Golang detection error {self.hash.sha256}: {e}"
            )
            return False

    def cleanup_run(self):
        """Clean up after analysis."""
        try:
            # BinaryNinjaDecompiler uses context manager pattern (__enter__/__exit__)
            # Cleanup happens automatically when exiting the 'with' block
            self.binja_decompiler = None

            # Clean up goresym temp file if it exists (keep in debug mode)
            if self.goresym_output_path and os.path.exists(self.goresym_output_path):
                if self.log.isEnabledFor(logging.DEBUG):
                    self.log.debug(f"Debug mode: keeping goresym output at {self.goresym_output_path}")
                else:
                    os.remove(self.goresym_output_path)
                    self.goresym_output_path = None

            # Force garbage collection
            import gc

            gc.collect()

        except Exception as e:
            self.log.error(f"Error in cleanup: {e}")

    def run_goresym(self, binary_path, output_json_path):
        """
            Run goresym on a Go binary and export its JSON output to a file.
            binary_path: path to the Go binary to analyze
            output_json_path: path where the JSON output will be saved
            """
        binary_path = str(Path(binary_path).resolve())
        output_json_path = str(Path(output_json_path).resolve())
        goresym_path = os.getenv("GORESYM_PATH", "GoReSym")

        try:
            # Example: goresym -t json /path/to/binary
            self.log.info("DEBUG: starting GoReSym")
            result = subprocess.run(
                [goresym_path, binary_path],
                stdout=subprocess.PIPE,
                stderr=subprocess.PIPE,
                text=True,
            )
        except FileNotFoundError:
            self.log.error("Error: 'goresym' not found in PATH. Make sure it is installed.")
            raise
        except subprocess.CalledProcessError as e:
            self.log.error("Error during goresym execution:")
            self.log.error(e.stderr)


        # Assuming goresym emits valid JSON to stdout.
        try:
            parsed = json.loads(result.stdout)
            # Store parsed JSON for later export to ClickHouse
            self.goresym_data = parsed
        except json.JSONDecodeError:
            # If it's not valid JSON, save the raw output instead.
            self.log.error("Warning: goresym output is not valid JSON; saving raw.")
            with open(output_json_path, "w", encoding="utf-8") as f:
                f.write(result.stdout)
            return

        # Save pretty-printed JSON for readability and debugging (used by BinaryNinja)
        with open(output_json_path, "w", encoding="utf-8") as f:
            json.dump(parsed, f, ensure_ascii=False, indent=2)
        self.goresym_output_path = output_json_path

        self.log.debug(f"goresym output saved to: {output_json_path}")

    def analyze_binary(self) -> Optional[Dict[str, Any]]:
        """Run Binary Ninja analysis and return results."""
        self.log.debug("Starting binary analysis")
        # if the binary is dotnet (only PE)
        if self.is_dotnet():
            self.log.debug("Skipping .NET binary - decompilation not supported")
            return None

        output_json_path = None
        ## if golang: run goresym
        try:
            if self.is_golang():
                output_json_path = "./goResym.json"
                self.run_goresym(self.filepath, output_json_path)
        except Exception as e:
            self.log.error(f"Error on GoReSym extraction: {e}")

        try:
            # Use BinaryNinjaDecompiler as a context manager to ensure proper setup/cleanup
            with BinaryNinjaDecompiler(
                filepath=self.filepath,
                timeout=self.BINJA_TIMEOUT,
                log=self.log,
                exporters=self.exporters,
                index_prefix=self.index_prefix,
                filetype=self.filetype,
                goresym=output_json_path,
                decompile_modules=self.decompile_modules,
            ) as decompiler:
                self.binja_decompiler = decompiler

                if decompiler.extract():
                    # Store results before context manager exits
                    results = decompiler.analysis_results
                    return results
                else:
                    self.log.error("BinaryNinjaDecompiler extraction failed")
                    return None

        except Exception as e:
            self.log.error(f"Error in Binary Ninja analysis: {e}")
            import traceback
            self.log.error(f"Traceback: {traceback.format_exc()}")
            return None

        finally:
            self.cleanup_run()

    def extract(self):
        """Extract and process all analysis results."""
        self.log.debug(inspect.currentframe().f_code.co_name)

        # Create a flag to track if extraction completed
        extraction_completed = False
        extraction_result = False
        extraction_error = None

        # Define the extraction process as a separate function
        def do_extraction():
            nonlocal extraction_completed, extraction_result, extraction_error
            try:
                results = self.analyze_binary()
                if not results:
                    extraction_result = False
                else:
                    self.analysis_results = results
                    # Add file hashes from parent Extractor class to analysis results
                    self.analysis_results["sha256"] = self.sha256
                    self.analysis_results["sha1"] = self.sha1
                    self.analysis_results["md5"] = self.md5
                    extraction_result = True
            except Exception as e:
                extraction_error = e
                extraction_result = False
            finally:
                extraction_completed = True

        # Run extraction directly with signal-based timeout (no thread overhead).
        # SIGALRM is delivered by the OS, so there's no GIL contention or polling.
        old_handler = signal.getsignal(signal.SIGALRM)
        def _timeout_handler(signum, frame):
            raise TimeoutError("Extraction timed out")

        signal.signal(signal.SIGALRM, _timeout_handler)
        signal.alarm(self.DECOMPILE_EXTRACTOR_TIMEOUT)
        try:
            do_extraction()
        except TimeoutError:
            self.log.error(
                f"Extraction timed out after {self.DECOMPILE_EXTRACTOR_TIMEOUT} seconds"
            )
            self.cleanup_run()
            return None
        finally:
            signal.alarm(0)
            signal.signal(signal.SIGALRM, old_handler)

        if extraction_error:
            self.log.error(f"Error in extraction: {extraction_error}")
            return None

        # Return the actual analysis results, not just a boolean
        return self.analysis_results if extraction_result else None

    def prepare_export_data(self, exporter_type: str) -> Any:
        """Prepare data for database export."""
        self.log.debug(inspect.currentframe().f_code.co_name)
        if not self.analysis_results:
            return None

        # # Delegate to the BinjaDecompiler for consistent export formatting
        # if self.binja_decompiler:
        #     return self.binja_decompiler.prepare_export_data(exporter_type)
        # else:
        #     self.log.error("BinjaDecompiler not available for export preparation")
        #     return None

        if exporter_type == "ClickHouseExporter":
            now = datetime.now(timezone.utc)

            def prepare_array_field(value, array_type):
                """Helper to prepare array fields with proper null handling"""
                if value is None:
                    return []
                return value

            # Add a helper function to handle empty strings
            def ensure_not_empty(value, default="UNKNOWN"):
                """Ensure a string value is not empty"""
                if value is None or value == "":
                    return default
                return value

            def prepare_register_usage_map(register_dict):
                """Convert register usage dict to Map format with tuples
                Input: {"rbx": {"reads": 3, "writes": 1}, ...}
                Output: {"rbx": (3, 1), ...}
                """
                if not register_dict:
                    return {}
                return {
                    reg: (info.get("reads", 0), info.get("writes", 0))
                    for reg, info in register_dict.items()
                }


            decompile_modules = getattr(self, "decompile_modules", {"all"})
            run_all = "all" in decompile_modules
            run_decompilation = run_all or "decompilation" in decompile_modules
            run_disassembly = run_all or "disassembly" in decompile_modules
            run_llil = run_all or "llil" in decompile_modules
            run_cfg = run_all or "cfg" in decompile_modules
            run_strings = run_all or "strings" in decompile_modules

            export = {"multi_table": True}

            # Decompilation tables
            if run_decompilation:
                export["decompiled_content"] = {
                    "table": "code_binja_decompiled_functions_content",
                    "data": [
                        [
                            f["decompiled_function_hash"],
                            f["decompiled_function"],
                            f["function_type"],
                            f.get("flattened_score"),
                            f.get("mba_score"),
                            now,
                        ]
                        for f in self.analysis_results["decompiled"]
                    ],
                    "column_names": [
                        "decompiled_function_hash",
                        "decompiled_function",
                        "function_type",
                        "flattened_score",
                        "mba_score",
                        "analysis_date",
                    ],
                    "column_type_names": [
                        "FixedString(64)",
                        "String",
                        "Enum8('USER'=1, 'LIBRARY'=2, 'THUNK'=3, 'EXTERNAL'=4, 'UNKNOWN'=5)",
                        "Nullable(Float64)",
                        "Nullable(Float64)",
                        "DateTime64(3, 'UTC')",
                    ],
                }
                export["decompiled_refs"] = {
                    "table": "code_binja_decompiled_functions_references",
                    "data": [
                        [
                            self.analysis_results["sha256"],
                            self.analysis_results["sha1"],
                            self.analysis_results["md5"],
                            f["decompiled_function_hash"],
                            f.get("disassembled_function_hash"),
                            f["decompiled_function_name"],
                            f["decompiled_function_prototype"],
                            f["decompiled_function_address"],
                            prepare_array_field(f.get("functions_caller"), "Array(String)"),
                            prepare_array_field(f.get("functions_call"), "Array(String)"),
                            now,
                        ]
                        for f in self.analysis_results["decompiled"]
                    ],
                    "column_names": [
                        "sha256",
                        "sha1",
                        "md5",
                        "decompiled_function_hash",
                        "disassembled_function_hash",
                        "decompiled_function_name",
                        "decompiled_function_prototype",
                        "decompiled_function_address",
                        "functions_caller",
                        "functions_call",
                        "analysis_date",
                    ],
                    "column_type_names": [
                        "FixedString(64)",
                        "FixedString(40)",
                        "FixedString(32)",
                        "FixedString(64)",
                        "Nullable(FixedString(64))",
                        "LowCardinality(String)",
                        "LowCardinality(String)",
                        "UInt64",
                        "Array(String)",
                        "Array(String)",
                        "DateTime64(3, 'UTC')",
                    ],
                }

            # Disassembly tables
            if run_disassembly:
                export["disassembled_content"] = {
                    "table": "code_binja_disassembled_functions_content",
                    "data": [
                        [
                            f["disassembled_function_hash"],
                            f.get("disassembled_function", ""),
                            f.get("disassembled_function_no_addresses", ""),
                            f.get("function_type", "UNKNOWN"),
                            f.get("instructions_count", 0),
                            prepare_array_field(
                                f.get("instructions_types"), "LowCardinality(String)"
                            ),
                            f.get("control_flow_count", 0),
                            prepare_array_field(
                                f.get("memory_access_pattern"), "LowCardinality(String)"
                            ),
                            prepare_array_field(
                                f.get("register_usage"), "LowCardinality(String)"
                            ),
                            f.get("data_references_count", 0),
                            f.get("max_block_size"),
                            f.get("num_calls"),
                            f.get("stack_size"),
                            now,
                        ]
                        for f in self.analysis_results["disassembled"]
                    ],
                    "column_names": [
                        "disassembled_function_hash",
                        "disassembled_function",
                        "disassembled_function_no_addresses",
                        "function_type",
                        "instructions_count",
                        "instructions_types",
                        "control_flow_count",
                        "memory_access_pattern",
                        "register_usage",
                        "data_references_count",
                        "max_block_size",
                        "num_calls",
                        "stack_size",
                        "analysis_date",
                    ],
                    "column_type_names": [
                        "FixedString(64)",
                        "String",
                        "String",
                        "Enum8('USER'=1, 'LIBRARY'=2, 'THUNK'=3, 'EXTERNAL'=4, 'UNKNOWN'=5)",
                        "UInt32",
                        "Array(LowCardinality(String))",
                        "UInt32",
                        "Array(LowCardinality(String))",
                        "Array(LowCardinality(String))",
                        "UInt32",
                        "Nullable(UInt32)",
                        "Nullable(UInt32)",
                        "Nullable(Int32)",
                        "DateTime64(3, 'UTC')",
                    ],
                }
                export["disassembled_refs"] = {
                    "table": "code_binja_disassembled_functions_references",
                    "data": [
                        [
                            self.analysis_results["sha256"],
                            self.analysis_results["sha1"],
                            self.analysis_results["md5"],
                            f["disassembled_function_hash"],
                            f.get("decompiled_function_hash"),
                            f["disassembled_function_name"],
                            f["disassembled_function_address"],
                            f.get("tlsh_disassembly"),
                            f.get("tlsh_llil"),
                            now,
                        ]
                        for f in self.analysis_results["disassembled"]
                    ],
                    "column_names": [
                        "sha256",
                        "sha1",
                        "md5",
                        "disassembled_function_hash",
                        "decompiled_function_hash",
                        "disassembled_function_name",
                        "disassembled_function_address",
                        "tlsh_disassembly",
                        "tlsh_llil",
                        "analysis_date",
                    ],
                    "column_type_names": [
                        "FixedString(64)",
                        "FixedString(40)",
                        "FixedString(32)",
                        "FixedString(64)",
                        "Nullable(FixedString(64))",
                        "LowCardinality(String)",
                        "UInt64",
                        "Nullable(FixedString(72))",
                        "Nullable(FixedString(72))",
                        "DateTime64(3, 'UTC')",
                    ],
                }
                # Function similarity metrics table (derived from disassembly data)
                # Lookup maps to join LLIL/MLIL features by disassembled_function_hash
                llil_by_hash = {
                    l.get("disassembled_function_hash"): l
                    for l in self.analysis_results.get("llil", [])
                    if l and l.get("disassembled_function_hash")
                }
                mlil_by_hash = {
                    m.get("disassembled_function_hash"): m
                    for m in self.analysis_results.get("mlil", [])
                    if m and m.get("disassembled_function_hash")
                }

                export["function_similarity_metrics"] = {
                    "table": "code_binja_function_similarity_metrics",
                    "data": [
                        [
                            f["disassembled_function_hash"],
                            f.get("cyclomatic_complexity"),
                            f.get("tlsh_disassembly"),
                            f.get("tlsh_llil"),
                            prepare_array_field(f.get("minhash"), "Array(UInt8)"),
                            (llil_by_hash.get(f["disassembled_function_hash"]) or {}).get("tlsh_llil"),
                            (llil_by_hash.get(f["disassembled_function_hash"]) or {}).get(
                                "tlsh_instruction_typed_llil"),
                            prepare_array_field(
                                (llil_by_hash.get(f["disassembled_function_hash"]) or {}).get("minhash_llil_skeleton"),
                                "Array(UInt8)",
                            ),
                            prepare_array_field(
                                (llil_by_hash.get(f["disassembled_function_hash"]) or {}).get("minhash_llil_typed"),
                                "Array(UInt8)",
                            ),
                            (mlil_by_hash.get(f["disassembled_function_hash"]) or {}).get("tlsh_mlil_skeleton"),
                            (mlil_by_hash.get(f["disassembled_function_hash"]) or {}).get("tlsh_mlil_typed"),
                            prepare_array_field(
                                (mlil_by_hash.get(f["disassembled_function_hash"]) or {}).get("minhash_mlil_skeleton"),
                                "Array(UInt8)",
                            ),
                            prepare_array_field(
                                (mlil_by_hash.get(f["disassembled_function_hash"]) or {}).get("minhash_mlil_typed"),
                                "Array(UInt8)",
                            ),
                            now,
                        ]
                        for f in self.analysis_results.get("disassembled", [])
                    ],
                    "column_names": [
                        "disassembled_function_hash",
                        "cyclomatic_complexity",
                        "tlsh_disassembly",
                        "tlsh_llil",
                        "minhash",
                        "tlsh_llil_new",
                        "tlsh_instruction_typed_llil",
                        "minhash_llil_skeleton",
                        "minhash_llil_typed",
                        "tlsh_mlil_skeleton",
                        "tlsh_mlil_typed",
                        "minhash_mlil_skeleton",
                        "minhash_mlil_typed",
                        "analysis_date",
                    ],
                    "column_type_names": [
                        "FixedString(64)",
                        "Nullable(UInt16)",
                        "Nullable(FixedString(72))",
                        "Nullable(FixedString(72))",
                        "Array(UInt8)",
                        # new
                        "Nullable(FixedString(72))",
                        "Nullable(FixedString(72))",
                        "Array(UInt8)",
                        "Array(UInt8)",
                        "Nullable(FixedString(72))",
                        "Nullable(FixedString(72))",
                        "Array(UInt8)",
                        "Array(UInt8)",
                        "DateTime64(3, 'UTC')",
                    ],
                }


            # LLIL tables
            if run_llil:
                export["llil_content"] = {
                    "table": "code_binja_llil_functions_content",
                    "data": [
                        [
                            f["sha256_llil"],
                            f["function_type"],
                            prepare_array_field(
                                f.get("instructions_types_llil"), "LowCardinality(String)"
                            ),
                            f.get("control_flow_count_llil", 0),
                            prepare_array_field(
                                f.get("memory_access_pattern_llil"), "LowCardinality(String)"
                            ),
                            prepare_register_usage_map(f.get("register_usage", {})),
                            f.get("total_reg_reads", 0),
                            f.get("total_reg_written", 0),
                            f.get("data_references_count", 0),
                            f.get("max_block_size"),
                            f.get("num_calls"),
                            f.get("stack_size"),
                            prepare_array_field(f.get("body_llil_vector"), "Array(Tuple(UInt32, Array(UInt16)))"),
                            now,
                        ]
                        for f in self.analysis_results.get("llil", [])
                    ],
                    "column_names": [
                        "llil_function_hash",
                        "function_type",
                        "instructions_types_llil",
                        "control_flow_count_llil",
                        "memory_access_pattern_llil",
                        "register_usage_llil",
                        "total_reg_reads",
                        "total_reg_written",
                        "data_references_count",
                        "max_block_size",
                        "num_calls",
                        "stack_size",
                        "body_llil_vector",
                        "analysis_date",
                    ],
                    "column_type_names": [
                        "FixedString(64)",
                        "Enum8('USER'=1, 'LIBRARY'=2, 'THUNK'=3, 'EXTERNAL'=4, 'UNKNOWN'=5)",
                        "Array(LowCardinality(String))",
                        "UInt32",
                        "Array(LowCardinality(String))",
                        "Map(LowCardinality(String), Tuple(UInt32, UInt32))",
                        "UInt32",
                        "UInt32",
                        "UInt32",
                        "Nullable(UInt32)",
                        "Nullable(UInt32)",
                        "Nullable(Int32)",
                        "Array(Tuple(UInt32, Array(UInt16)))",
                        "DateTime64(3, 'UTC')",
                    ],
                }
                export["llil_refs"] = {
                    "table": "code_binja_llil_functions_references",
                    "data": [
                        [
                            self.analysis_results["sha256"],
                            self.analysis_results["sha1"],
                            self.analysis_results["md5"],
                            f.get("sha256_llil"),
                            f.get("disassembled_function_hash"),
                            f.get("function_address"),
                            f.get("tlsh_disassembly"),
                            f.get("tlsh_llil"),
                            now,
                        ]
                        for f in self.analysis_results.get("llil", [])
                    ],
                    "column_names": [
                        "sha256",
                        "sha1",
                        "md5",
                        "llil_function_hash",
                        "disassembled_function_hash",
                        "function_address",
                        "tlsh_disassembly",
                        "tlsh_llil",
                        "analysis_date",
                    ],
                    "column_type_names": [
                        "FixedString(64)",
                        "FixedString(40)",
                        "FixedString(32)",
                        "Nullable(FixedString(64))",
                        "FixedString(64)",
                        "UInt64",
                        "Nullable(FixedString(72))",
                        "Nullable(FixedString(72))",
                        "DateTime64(3, 'UTC')",
                    ],
                }

            # Errors table (always include if per-function loop ran)
            if run_decompilation or run_disassembly or run_llil or run_cfg:
                export["function_analysis_errors"] = {
                    "table": "new_function_analysis_errors_binja",
                    "data": [
                        [
                            self.analysis_results["sha256"],
                            f["function_name"],
                            f["function_address"],
                            f.get("error_location", "unknown"),
                            f.get("error_message", ""),
                            f.get("error_details", ""),
                            f.get("error_type", "unknown"),
                            self.calculate_md5(
                                f"{f.get('error_message', '')}{f['function_name']}{f['function_address']}{f.get('error_location', 'unknown')}"
                            ),
                            "new",
                            now,
                        ]
                        for f in self.analysis_results.get("errors", [])
                    ],
                    "column_names": [
                        "sha256",
                        "function_name",
                        "function_address",
                        "error_location",
                        "error_message",
                        "error_details",
                        "error_type",
                        "error_hash",
                        "status",
                        "analysis_date",
                    ],
                    "column_type_names": [
                        "FixedString(64)",
                        "Nullable(String)",
                        "UInt64",
                        "LowCardinality(String)",
                        "Nullable(String)",
                        "Nullable(String)",
                        "Nullable(String)",
                        "FixedString(32)",
                        "Enum8('new'=1, 'investigating'=2, 'fixed'=3, 'wontfix'=4)",
                        "DateTime64(3, 'UTC')",
                    ],
                }

            # Strings table
            if run_strings:
                export["strings_raw"] = {
                    "table": "code_binja_strings_raw",
                    "data": [
                        [
                            self.analysis_results["sha256"],
                            s["string"],
                            s["string_raw"],
                            s["string_encoding"],
                            s["string_offset"],
                            s["string_length"],
                            s["string_raw_length"],
                            s["string_entropy"],
                        ]
                        for s in self.analysis_results.get("strings", [])
                    ],
                    "column_names": [
                        "sha256",
                        "string",
                        "string_raw",
                        "string_encoding",
                        "string_offset",
                        "string_length",
                        "string_raw_length",
                        "string_entropy",
                    ],
                    "column_type_names": [
                        "FixedString(64)",
                        "String",
                        "String",
                        "LowCardinality(String)",
                        "UInt64",
                        "UInt32",
                        "UInt32",
                        "Float32",
                    ],
                }

            # CFG function-level features table
            if run_cfg:
                export["cfg_functions"] = {
                    "table": "code_binja_cfg_functions",
                    "data": [
                        [
                            cfg.get("disassembled_function_hash"),
                            cfg["cfg_topology_hash"],
                            cfg["block_count"],
                            cfg["edge_count"],
                            cfg.get("llil_total_operations", 0),
                            cfg.get("call_count", 0),
                            cfg["cyclomatic_complexity"],
                            cfg.get("loop_count", 0),
                            cfg.get("max_depth", 0),
                            cfg.get("max_fan_out", 0),
                            cfg.get("md_index_topdown", 0),
                            cfg.get("md_index_bottomup", 0),
                            cfg.get("prime_product_llil", 0),
                            cfg.get("cfg_feature_tlsh"),
                            cfg.get("wl_minhash", []),
                            cfg.get("bb_features", []),
                            cfg.get("cfg_adjacency", []),
                            now,
                        ]
                        for cfg in self.analysis_results.get("cfg", [])
                        if cfg is not None
                    ],
                    "column_names": [
                        "disassembled_function_hash",
                        "cfg_topology_hash",
                        "block_count",
                        "edge_count",
                        "llil_total_operations",
                        "call_count",
                        "cyclomatic_complexity",
                        "loop_count",
                        "max_depth",
                        "max_fan_out",
                        "md_index_topdown",
                        "md_index_bottomup",
                        "prime_product_llil",
                        "cfg_feature_tlsh",
                        "wl_minhash",
                        "bb_features",
                        "cfg_adjacency",
                        "analysis_date",
                    ],
                    "column_type_names": [
                        "FixedString(64)",
                        "FixedString(16)",
                        "UInt16",
                        "UInt16",
                        "UInt32",
                        "UInt16",
                        "UInt16",
                        "UInt8",
                        "UInt16",
                        "UInt8",
                        "UInt64",
                        "UInt64",
                        "UInt64",
                        "Nullable(FixedString(72))",
                        "Array(UInt8)",
                        "Array(Array(UInt16))",
                        "Array(UInt32)",
                        "DateTime64(3, 'UTC')",
                    ],
                }

            # GoReSym metadata table (only if goresym data exists)
            if self.goresym_data:
                export["golang_metadata"] = {
                    "table": "redb_golang_metadata",
                    "data": [
                        [
                            self.analysis_results["sha256"],
                            json.dumps(self.goresym_data),
                            now,
                        ]
                    ],
                    "column_names": [
                        "sha256",
                        "goresym",
                        "analysis_date",
                    ],
                    "column_type_names": [
                        "FixedString(64)",
                        "JSON",
                        "DateTime64(3, 'UTC')",
                    ],
                }

            return export

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

    def get_clickhouse_table(self) -> str:
        """Not used directly as we're handling multiple tables."""
        pass


if __name__ == "__main__":
    # Setup basic logging
    import logging
    import time

    logging.basicConfig(level=logging.INFO)
    logger = logging.getLogger("DecompileBinja")

    # Parse command line arguments
    import argparse

    parser = argparse.ArgumentParser(description="Binary Ninja Decompiler Wrapper")
    parser.add_argument("filepath", help="Path to the binary file to analyze")
    parser.add_argument(
        "--output", "-o", help="Output JSON file path (default: stdout)"
    )
    parser.add_argument(
        "--timeout",
        "-t",
        type=int,
        default=1200,
        help="Analysis timeout in seconds (default: 1200)",
    )
    args = parser.parse_args()
    start = time.perf_counter()
    # Create and run the extractor
    with DecompileBinja(args.filepath, logger) as extractor:
        success = extractor.extract()
        end = time.perf_counter()
        if not success:
            logger.error("Analysis failed")
            exit(1)

        # Output results
        if args.output:
            with open(args.output, "w") as f:
                json.dump(extractor.analysis_results, f)
            logger.info(f"Results written to {args.output}")
        else:
            print((extractor.analysis_results))
            with open("diff", "w") as f:
                f.write(str(f"{end - start:.3f} seconds"))