Iordanis Koutsopoulos

211 papers A* 16A 3B 36C 3Misc 12Journal 69Unranked 71
YearRankTypeTitle / Venue / Authors
2026 J jnl
Appl. Intell.
Sotirios Nikoloutsopoulos, Iordanis Koutsopoulos, Michalis K. Titsias
2026 J jnl
CoRR
Yiannis Papageorgiou, Yannis Thomas, Ramin Khalili, Iordanis Koutsopoulos
2025 conf
AIAI (2)
Yiannis Papageorgiou, Yannis Thomas, Alexios Filippakopoulos, Ramin Khalili, Iordanis Koutsopoulos
2025 J jnl
CoRR
Yiannis Papageorgiou, Yannis Thomas, Alexios Filippakopoulos, Ramin Khalili, Iordanis Koutsopoulos
2025 B conf
WiOpt
Thomas Tsouparopoulos, Iordanis Koutsopoulos
2025 J jnl
CoRR
Thomas Tsouparopoulos, Iordanis Koutsopoulos
2025 J jnl
IEEE Trans. Netw. Serv. Manag.
Yiannis Papageorgiou, Merkouris Karaliopoulos, Kostas Choumas, Iordanis Koutsopoulos
2025 J jnl
CoRR
Foivos Charalampakos, Thomas Tsouparopoulos, Iordanis Koutsopoulos
2025 B conf
WiOpt
Dimitrios Kafetzis, Ramin Khalili, Iordanis Koutsopoulos
2025 J jnl
CoRR
Dimitrios Kafetzis, Ramin Khalili, Iordanis Koutsopoulos
2025 J jnl
Appl. Intell.
Sotirios Nikoloutsopoulos, Iordanis Koutsopoulos, Michalis K. Titsias
2025 conf
e-Energy
Spiros Chadoulos, Iordanis Koutsopoulos, George C. Polyzos, Nikolaos Ipiotis
2025 conf
MeditCom
Dimitrios Kafetzis, Nikos Fotiou, Savvas Argyropoulos, Jad Nasreddine, Iordanis Koutsopoulos
2025 J jnl
CoRR
Dimitrios Kafetzis, Nikos Fotiou, Savvas Argyropoulos, Jad Nasreddine, Iordanis Koutsopoulos
2024 conf
EuCNC/6G Summit
Dimitrios Kafetzis, Iordanis Koutsopoulos
2024 B conf
MobiHoc
Dimitrios Kafetzis, Iordanis Koutsopoulos
2024 conf
SmartGridComm
Spiros Chadoulos, Odyssefs Diamantopoulos, Iordanis Koutsopoulos, George C. Polyzos, Nikolaos Ipiotis
2024 conf
MILCOM
Iordanis Koutsopoulos
2024 J jnl
CoRR
Iordanis Koutsopoulos
2023 B conf
TrustCom
Nikos Fotiou, Spiros Chadoulos, Iordanis Koutsopoulos, Vasilios A. Siris, George C. Polyzos
2023 conf
ICC
Yiannis Papageorgiou, Merkouris Karaliopoulos, Iordanis Koutsopoulos
2023 conf
ICMCIS
Yiannis Papageorgiou, Johannes F. Loevenich, Merkouris Karaliopoulos, Paulo H. L. Rettore, Roberto Rigolin Ferreira Lopes, Iordanis Koutsopoulos
2023 conf
ECAI Workshops (1)
Foivos Charalampakos, Iordanis Koutsopoulos
2023 conf
INFOCOM Workshops
Eleftherios Charteros, Iordanis Koutsopoulos
2023 conf
MILCOM
Iordanis Koutsopoulos
2023 conf
PKDD/ECML Workshops (5)
Thomas Tsouparopoulos, Iordanis Koutsopoulos
2023 conf
ICC
Iordanis Koutsopoulos
2023 conf
EuCNC/6G Summit
Foivos Charalampakos, Thomas Tsouparopoulos, Yiannis Papageorgiou, Guido Bologna, André Panisson, Alan Perotti, Iordanis Koutsopoulos
2023 conf
MILCOM
Ioannis Fourfouris, Merkouris Karaliopoulos, Dimitrios Kafetzis, Georgios Vardoulias, Apostolos Georgiadis, Spyridon Vassilaras, Iordanis Koutsopoulos
2023 J jnl
IEEE Trans. Netw. Serv. Manag.
Merkouris Karaliopoulos, Georgios Cheirmpos, Iordanis Koutsopoulos
2022 conf
CCNC
Felix Freitag, Pedro Vilchez, Lu Wei, Chun-Hung Liu, Mennan Selimi, Iordanis Koutsopoulos
2022 B conf
WiOpt
George Darzanos, Iordanis Koutsopoulos, Katia Papakonstantinopoulou, George D. Stamoulis
2022 conf
Q2SWinet
Merkouris Karaliopoulos, Iordanis Koutsopoulos
2022 B conf
IFIP Networking
Thomas Tsouparopoulos, Iordanis Koutsopoulos
2022 conf
MILCOM
Yiannis Papageorgiou, Merkouris Karaliopoulos, Iordanis Koutsopoulos
2022 conf
SPAWC
Konstantinos Ntougias, Constantinos Psomas, Eleni Demarchou, Ioannis Krikidis, Iordanis Koutsopoulos
2022 B conf
WiOpt
Livia Elena Chatzieleftheriou, Iordanis Koutsopoulos
2022 C conf
WoWMoM
Iordanis Koutsopoulos
2022 conf
MeditCom
Livia Elena Chatzieleftheriou, Chen-Feng Liu, Iordanis Koutsopoulos, Mehdi Bennis, Mérouane Debbah
2022 J jnl
CoRR
Sotirios Nikoloutsopoulos, Iordanis Koutsopoulos, Michalis K. Titsias
2022 J jnl
IEEE Access
Dimitrios Kafetzis, Spyridon Vassilaras, Georgios Vardoulias, Iordanis Koutsopoulos
2021 A* conf
INFOCOM
Livia Elena Chatzieleftheriou, Apostolos Destounis, Georgios S. Paschos, Iordanis Koutsopoulos
2021 J jnl
CoRR
Livia Elena Chatzieleftheriou, Apostolos Destounis, Georgios S. Paschos, Iordanis Koutsopoulos
2021 conf
e-Energy
Angeliki Anastopoulou, George D. Stamoulis, Iordanis Koutsopoulos
2021 conf
ICC
Spiros Chadoulos, Iordanis Koutsopoulos
2021 conf
e-Energy
Spiros Chadoulos, Iordanis Koutsopoulos, George C. Polyzos
2021 Misc conf
AIAI
Iordanis Koutsopoulos, Maria Halkidi
2021 A conf
ITC
Georgios Cheirmpos, Merkouris Karaliopoulos, Iordanis Koutsopoulos
2021 A* conf
INFOCOM
Iordanis Koutsopoulos
2020 C conf
WoWMoM
Merkouris Karaliopoulos, Iordanis Koutsopoulos
2020 B conf
WiOpt
George Darzanos, Livia Elena Chatzieleftheriou, Merkourios Karaliopoulos, Iordanis Koutsopoulos
2020 conf
ICC Workshops
Eleftherios Charteros, Iordanis Koutsopoulos
2020 J jnl
IEEE Access
Spiros Chadoulos, Iordanis Koutsopoulos, George C. Polyzos
2020 conf
ICC Workshops
Merkourios Karaliopoulos, Livia Elena Chatzieleftheriou, George Darzanos, Iordanis Koutsopoulos
2020 J jnl
IEEE Access
George Koutitas, Shashwat Vyas, Chaitanya Vyas, Shivesh Singh Jadon, Iordanis Koutsopoulos
2020 J jnl
Knowl. Inf. Syst.
Maria Halkidi, Iordanis Koutsopoulos
2019 J jnl
IEEE/ACM Trans. Netw.
George Darzanos, Iordanis Koutsopoulos, George D. Stamoulis
2019 J jnl
IEEE Trans. Mob. Comput.
Konstantinos Poularakis, George Iosifidis, Antonios Argyriou, Iordanis Koutsopoulos, Leandros Tassiulas
2019 conf
INFOCOM Workshops
Iordanis Koutsopoulos, Angeliki Anastopoulou, Merkourios Karaliopoulos
2019 B conf
MobiHoc
Merkouris Karaliopoulos, Iordanis Koutsopoulos
2019 J jnl
IEEE Trans. Mob. Comput.
Livia Elena Chatzieleftheriou, Merkourios Karaliopoulos, Iordanis Koutsopoulos
2019 A* conf
INFOCOM
Merkouris Karaliopoulos, Iordanis Koutsopoulos, Leonidas Spiliopoulos
2019 conf
ECIR (2)
Maria Halkidi, Iordanis Koutsopoulos
2019 B conf
MobiHoc
Georgios Papaioannou, Iordanis Koutsopoulos
2018 conf
EuCNC
Leonardo Maccari, Merkourios Karaliopoulos, Iordanis Koutsopoulos, Leandro Navarro, Felix Freitag, R. LoCigno
2018 conf
GIIS
Esmerald Aliaj, Georgia Dimaki, Petros Getsopoulos, Yannis Thomas, Nikos Fotiou, Stavros Toumpis, Iordanis Koutsopoulos, Vasilios A. Siris, George C. Polyzos
2018 conf
COMPLEX NETWORKS (2)
Iftah Gamzu, Iordanis Koutsopoulos
2018 Misc conf
AIAI
Panagiotis Spentzouris, Iordanis Koutsopoulos, Kasper Grud Madsen, Tommy Vestergaard Hansen
2018 J jnl
IEEE Commun. Surv. Tutorials
Panagiota Micholia, Merkourios Karaliopoulos, Iordanis Koutsopoulos, Leandro Navarro, Roger Baig Viñas, Dimitris Boucas, Maria Michalis, Panayotis Antoniadis
2018 conf
WiNTECH
Esmerald Aliaj, Georgia Dimaki, Petros Getsopoulos, Yannis Thomas, Nikos Fotiou, Stavros Toumpis, Vasilios A. Siris, Iordanis Koutsopoulos, George C. Polyzos
2018 conf
DASC/PiCom/DataCom/CyberSciTech
Iordanis Koutsopoulos, Maria Halkidi
2018 conf
DASC/PiCom/DataCom/CyberSciTech
Iordanis Koutsopoulos
2018 J jnl
SIGMETRICS Perform. Evaluation Rev.
Livia Elena Chatzieleftheriou, George Darzanos, Merkourios Karaliopoulos, Iordanis Koutsopoulos
2018 conf
SPAWC
Merkourios Karaliopoulos, Iordanis Koutsopoulos
2018 J jnl
IEEE Trans. Smart Grid
Thanasis G. Papaioannou, Vassiliki Hatzi, Iordanis Koutsopoulos
2018 C conf
WOWMOM
Iordanis Koutsopoulos
2018 conf
ISWCS
Livia Elena Chatzieleftheriou, Georgios Iosifidis, Iordanis Koutsopoulos, Douglas J. Leith
2017 B conf
WiOpt
Panagiotis Spentzouris, Iordanis Koutsopoulos
2017 A* conf
INFOCOM
Livia Elena Chatzieleftheriou, Merkourios Karaliopoulos, Iordanis Koutsopoulos
2017 J jnl
CoRR
Panagiota Micholia, Merkourios Karaliopoulos, Iordanis Koutsopoulos, Leandro Navarro, Roger Baig, Dimitris Boucas, Maria Michalis, Panayotis Antoniadis
2017 J jnl
Comput. Commun.
Paolo Giaccone, Marco Pretti, Dimitris Syrivelis, Iordanis Koutsopoulos, Leandros Tassiulas
2017 J jnl
IEEE/ACM Trans. Netw.
George Iosifidis, Iordanis Koutsopoulos, Georgios Smaragdakis
2017 J jnl
Int. J. Hum. Comput. Stud.
Panagiota Micholia, Merkourios Karaliopoulos, Iordanis Koutsopoulos, Luca Maria Aiello, Gianmarco De Francisci Morales, Daniele Quercia
2017 J jnl
Comput. Networks
Lazaros Gkatzikis, Vasilis Sourlas, Carlo Fischione, Iordanis Koutsopoulos
2017 J jnl
IEEE Trans. Control. Netw. Syst.
Angeliki Anastopoulou, Iordanis Koutsopoulos, George D. Stamoulis
2017 conf
ICC Workshops
Iordanis Koutsopoulos
2016 A* conf
INFOCOM
Konstantinos Poularakis, George Iosifidis, Antonios Argyriou, Iordanis Koutsopoulos, Leandros Tassiulas
2016 B conf
Networking
George Darzanos, Iordanis Koutsopoulos, George D. Stamoulis
2016 B conf
MobiHoc
Merkourios Karaliopoulos, Iordanis Koutsopoulos, Michalis K. Titsias
2016 J jnl
Comput. Commun.
Konstantinos Pelechrinis, Iordanis Koutsopoulos, Ioannis Broustis, Srikanth V. Krishnamurthy
2016 conf
MSCC@MobiHoc
Panagiota Micholia, Merkourios Karaliopoulos, Iordanis Koutsopoulos
2016 J jnl
Found. Trends Netw.
Iordanis Koutsopoulos, Thanasis G. Papaioannou, Vassiliki Hatzi
2016 conf
ECML/PKDD (1)
Iordanis Koutsopoulos, Panagiotis Spentzouris
2016 J jnl
IEEE Trans. Mob. Comput.
Ömer Korçak, George Iosifidis, Tansu Alpcan, Iordanis Koutsopoulos
2016 J jnl
IEEE J. Sel. Areas Commun.
Vassiliki Hatzi, Berkant Barla Cambazoglu, Iordanis Koutsopoulos
2016 conf
HOTPOST@MobiHoc
Iordanis Koutsopoulos
2016 A conf
DATE
Kostas Katrinis, Dimitris Syrivelis, Dionisios N. Pnevmatikatos, Georgios Zervas, Dimitris Theodoropoulos, Iordanis Koutsopoulos, K. Hasharoni, Daniel Raho, Christian Pinto, Felix Espina, Sergio López-Buedo, Qianqiao Chen, Mario Nemirovsky, Damian Roca, H. Klos, T. Berends
2016 J jnl
CoRR
Apostolos Destounis, Georgios S. Paschos, Iordanis Koutsopoulos
2016 A* conf
INFOCOM
Apostolos Destounis, Georgios S. Paschos, Iordanis Koutsopoulos
2015 B conf
SECON
Apostolos Apostolaras, Navid Nikaein, Raymond Knopp, Antonio Maria Cipriano, Thanasis Korakis, Iordanis Koutsopoulos, Leandros Tassiulas
2015 conf
CloudNet
George Darzanos, Iordanis Koutsopoulos, George D. Stamoulis
2015 conf
ICDM Workshops
Iordanis Koutsopoulos, Aristides Gionis, Maria Halkidi
2015 conf
ICC
Lazaros Gkatzikis, Vasilis Sourlas, Carlo Fischione, Iordanis Koutsopoulos, György Dán
2015 A conf
CIKM
Hossein Vahabi, Iordanis Koutsopoulos, Francesco Gullo, Maria Halkidi
2015 B conf
SECON
Apostolos Apostolaras, Navid Nikaein, Raymond Knopp, Antonio Maria Cipriano, Thanasis Korakis, Iordanis Koutsopoulos, Leandros Tassiulas
2015 J jnl
IEEE Trans. Wirel. Commun.
Nestor D. Chatzidiamantis, Evangelia Matskani, Leonidas Georgiadis, Iordanis Koutsopoulos, Leandros Tassiulas
2015 A* conf
INFOCOM
Merkourios Karaliopoulos, Orestis Telelis, Iordanis Koutsopoulos
2014 J jnl
Comput. Networks
Iordanis Koutsopoulos, Leandros Tassiulas, Lazaros Gkatzikis
2014 conf
SmartGridComm
Lazaros Gkatzikis, George Iosifidis, Iordanis Koutsopoulos, Leandros Tassiulas
2014 A* conf
MobiCom
Stratos Keranidis, Kostas Chounos, Thanasis Korakis, Iordanis Koutsopoulos, Leandros Tassiulas
2014 J jnl
Comput. Commun.
Iordanis Koutsopoulos, Maria Halkidi
2014 conf
SmartGridComm
Angeliki Anastopoulou, Iordanis Koutsopoulos, George D. Stamoulis
2014 B conf
WCNC
Mahmoud Hadef, Apostolos Apostolaras, Jim O'Reilly, Alain Mourad, Belkacem Mouhouche, Iordanis Koutsopoulos, Thanasis Korakis, Leandros Tassiulas
2014 conf
e-Energy
Stratos Keranidis, Giannis Kazdaridis, Nikos Makris, Thanasis Korakis, Iordanis Koutsopoulos, Leandros Tassiulas
2014 J jnl
Comput. Networks
Stratos Keranidis, Dimitris Giatsios, Thanasis Korakis, Iordanis Koutsopoulos, Leandros Tassiulas, Thierry Rakotoarivelo, Max Ott, Thierry Parmentelat
2014 conf
CloudNet
Lazaros Gkatzikis, Iordanis Koutsopoulos
2014 J jnl
ACM SIGMOBILE Mob. Comput. Commun. Rev.
Stratos Keranidis, Giannis Kazdaridis, Virgilios Passas, Thanasis Korakis, Iordanis Koutsopoulos, Leandros Tassiulas
2014 conf
e-Energy
Stratos Keranidis, Giannis Kazdaridis, Virgilios Passas, Giannis Igoumenos, Thanasis Korakis, Iordanis Koutsopoulos, Leandros Tassiulas
2014 conf
SimuTools
Dimitris Syrivelis, Paolo Giaccone, Iordanis Koutsopoulos, Marco Pretti, Leandros Tassiulas
2014 conf
WiNTECH
Stratos Keranidis, Virgilios Passas, Kostas Chounos, Wei Liu, Thanasis Korakis, Iordanis Koutsopoulos, Ingrid Moerman, Leandros Tassiulas
2014 conf
SmartGridComm
Thanasis G. Papaioannou, Vassiliki Hatzi, Iordanis Koutsopoulos
2014 J jnl
IEEE Commun. Mag.
David Saad, Chi Ho Yeung, Georgios Rodolakis, Dimitris Syrivelis, Iordanis Koutsopoulos, Leandros Tassiulas, Rüdiger L. Urbanke, Paolo Giaccone, Emilio Leonardi
2014 conf
NetGCooP
Dimitris Giatsios, Thanasis Korakis, Leandros Tassiulas, Iordanis Koutsopoulos
2014 B conf
WiOpt
Evangelia Matskani, Nestor D. Chatzidiamantis, Leonidas Georgiadis, Iordanis Koutsopoulos, Leandros Tassiulas
2014 Misc conf
SoftCOM
Vassiliki Hatzi, Berkant Barla Cambazoglu, Iordanis Koutsopoulos
2013 conf
ICC
Dimitris M. Hatzopoulos, Iordanis Koutsopoulos, George Koutitas, Ward Van Heddeghem
2013 conf
SimuTools
Mahmoud Hadef, Apostolos Apostolaras, Alain Mourad, Jim O'Reilly, Iordanis Koutsopoulos, Thanasis Korakis, Leandros Tassiulas
2013 J jnl
CoRR
Stratos Keranidis, Giannis Kazdaridis, Nikos Makris, Thanasis Korakis, Iordanis Koutsopoulos, Leandros Tassiulas
2013 J jnl
Ad Hoc Networks
Iordanis Koutsopoulos, Leandros Tassiulas
2013 J jnl
IEEE Wirel. Commun.
Lazaros Gkatzikis, Iordanis Koutsopoulos
2013 B conf
PIMRC
Apostolos Apostolaras, Kostas Choumas, Ilias Syrigos, Iordanis Koutsopoulos, Thanasis Korakis, Antonios Argyriou, Leandros Tassiulas
2013 conf
WiNTECH
Stratos Keranidis, Giannis Kazdaridis, Virgilios Passas, Thanasis Korakis, Iordanis Koutsopoulos, Leandros Tassiulas
2013 conf
WiNTECH
Stratos Keranidis, Giannis Kazdaridis, Virgilios Passas, Thanasis Korakis, Iordanis Koutsopoulos, Leandros Tassiulas
2013 A* conf
MobiCom
Virgilios Passas, Kostas Chounos, Stratos Keranidis, Wei Liu, Lieven Hollevoet, Thanasis Korakis, Iordanis Koutsopoulos, Ingrid Moerman, Leandros Tassiulas
2013 J jnl
CoRR
Evangelia Matskani, Nestor D. Chatzidiamantis, Leonidas Georgiadis, Iordanis Koutsopoulos, Leandros Tassiulas
2013 A* conf
INFOCOM
Iordanis Koutsopoulos
2013 J jnl
IEEE J. Sel. Areas Commun.
Lazaros Gkatzikis, Iordanis Koutsopoulos, Theodoros Salonidis
2012 Misc conf
TRIDENTCOM
Kostas Choumas, Thanasis Korakis, Iordanis Koutsopoulos, Leandros Tassiulas
2012 Misc conf
TRIDENTCOM
Apostolos Apostolaras, Kostas Choumas, Ilias Syrigos, Giannis Kazdaridis, Thanasis Korakis, Iordanis Koutsopoulos, Antonios Argyriou, Leandros Tassiulas
2012 Misc conf
TRIDENTCOM
Virgilios Passas, Stratos Keranidis, Thanasis Korakis, Iordanis Koutsopoulos, Leandros Tassiulas
2012 Misc conf
TRIDENTCOM
Giannis Kazdaridis, Stratos Keranidis, Harris Niavis, Thanasis Korakis, Iordanis Koutsopoulos, Leandros Tassiulas
2012 B conf
WCNC
Lazaros Gkatzikis, Tryfonas Tryfonopoulos, Iordanis Koutsopoulos
2012 conf
NetGCooP
Ömer Korçak, George Iosifidis, Tansu Alpcan, Iordanis Koutsopoulos
2012 Misc conf
TRIDENTCOM
Nikos Makris, Stratos Keranidis, Dimitris Giatsios, Thanasis Korakis, Iordanis Koutsopoulos, Leandros Tassiulas, Thierry Rakotoarivelo, Thierry Parmentelat
2012 B conf
IWQoS
Dimitris Giatsios, Iordanis Koutsopoulos, Thanasis Korakis
2012 Misc conf
TRIDENTCOM
Stratos Keranidis, Dimitris Giatsios, Thanasis Korakis, Iordanis Koutsopoulos, Leandros Tassiulas, Thierry Rakotoarivelo, Thierry Parmentelat
2012 Misc conf
TRIDENTCOM
Kostas Choumas, Thanasis Korakis, Iordanis Koutsopoulos, Leandros Tassiulas
2012 conf
NetGCooP
George Iosifidis, Anil Kumar Chorppath, Tansu Alpcan, Iordanis Koutsopoulos
2012 Misc conf
TRIDENTCOM
Vasilis Maglogiannis, Dimitris Giatsios, Giannis Kazdaridis, Thanasis Korakis, Iordanis Koutsopoulos, Leandros Tassiulas
2012 J jnl
IEEE J. Sel. Areas Commun.
Iordanis Koutsopoulos, Leandros Tassiulas
2012 J jnl
IEEE Commun. Mag.
Konstantinos Choumas, Stratos Keranidis, Iordanis Koutsopoulos, Thanasis Korakis, Leandros Tassiulas, Felix Juraschek, Mesut Günes, Emmanuel Baccelli, Pawel Misiorek, Andrzej Szwabe, Theodoros Salonidis, Henrik Lundgren
2012 J jnl
IEEE Trans. Wirel. Commun.
Iordanis Koutsopoulos, Slawomir Stanczak
2011 Misc conf
TRIDENTCOM
Georgios Kyriakou, Donatos Stavropoulos, Iordanis Koutsopoulos, Thanasis Korakis, Leandros Tassiulas
2011 conf
ECML/PKDD (1)
Maria Halkidi, Iordanis Koutsopoulos
2011 conf
WiNTECH
Stratos Keranidis, Iordanis Koutsopoulos, Thanasis Korakis, Leandros Tassiulas
2011 J jnl
IEEE Commun. Mag.
George Iosifidis, Iordanis Koutsopoulos
2011 J jnl
IEEE Netw.
Iordanis Koutsopoulos, Leandros Tassiulas
2011 J jnl
CoRR
Ömer Korçak, George Iosifidis, Tansu Alpcan, Iordanis Koutsopoulos
2011 B conf
WiOpt
Iordanis Koutsopoulos
2011 B conf
WiOpt
Stratos Keranidis, Thanasis Korakis, Iordanis Koutsopoulos, Leandros Tassiulas
2011 conf
e-Energy
Iordanis Koutsopoulos, Leandros Tassiulas
2011 J jnl
CoRR
George Iosifidis, Anil Kumar Chorppath, Tansu Alpcan, Iordanis Koutsopoulos
2011 conf
NetGCoop
Lazaros Gkatzikis, Georgios S. Paschos, Iordanis Koutsopoulos
2011 conf
WiNTECH
Giannis Kazdaridis, Stratos Keranidis, Adamantios Fiamegkos, Thanasis Korakis, Iordanis Koutsopoulos, Leandros Tassiulas
2011 B conf
Mobile Data Management (1)
Maria Halkidi, Iordanis Koutsopoulos
2011 conf
SmartGridComm
Iordanis Koutsopoulos, Vassiliki Hatzi, Leandros Tassiulas
2011 J jnl
CoRR
Lazaros Gkatzikis, Georgios S. Paschos, Iordanis Koutsopoulos
2011 A* conf
INFOCOM
George Iosifidis, Iordanis Koutsopoulos, Georgios Smaragdakis
2010 J jnl
Perform. Evaluation
Iordanis Koutsopoulos, George Iosifidis
2010 B conf
WiOpt
Iordanis Koutsopoulos, George Iosifidis
2010 J jnl
CoRR
Iordanis Koutsopoulos, Leandros Tassiulas
2010 J jnl
IEEE J. Sel. Areas Commun.
George Iosifidis, Iordanis Koutsopoulos
2010 B conf
WiOpt
Lazaros Gkatzikis, Iordanis Koutsopoulos
2010 J jnl
IEEE Trans. Veh. Technol.
Rodolfo Oliveira, Iordanis Koutsopoulos
2010 B conf
WiOpt
Iordanis Koutsopoulos, Maria Halkidi
2010 J jnl
IEEE Trans. Mob. Comput.
Mingyan Li, Iordanis Koutsopoulos, Radha Poovendran
2010 J jnl
IEEE Trans. Autom. Control.
Iordanis Koutsopoulos, Leandros Tassiulas
2010 B conf
GLOBECOM
Iordanis Koutsopoulos, Slawomir Stanczak, Angela Feistel
2009 B conf
IWQoS
Iordanis Koutsopoulos, Leandros Tassiulas, Lazaros Gkatzikis
2009 conf
WTS
Christos Papathanasiou, Iordanis Koutsopoulos, Leandros Tassiulas
2009 B conf
GLOBECOM
Iordanis Koutsopoulos, Maria Halkidi
2009 B conf
GLOBECOM
Konstantinos Pelechrinis, Iordanis Koutsopoulos, Ioannis Broustis, Srikanth V. Krishnamurthy
2009 conf
VTC Fall
Christos Papathanasiou, Iordanis Koutsopoulos, Leandros Tassiulas
2009 B conf
WCNC
Rodolfo Oliveira, Iordanis Koutsopoulos
2008 J jnl
ACM Trans. Inf. Syst. Secur.
Svetlana Radosavac, George V. Moustakides, John S. Baras, Iordanis Koutsopoulos
2008 J jnl
IEEE Trans. Commun.
Iordanis Koutsopoulos, Leandros Tassiulas
2008 conf
VALUETOOLS
Iordanis Koutsopoulos, George Iosifidis
2008 conf
ISWCS
Rodolfo Oliveira, Luís Bernardo, Paulo Pinto, Iordanis Koutsopoulos
2008 B conf
IWQoS
George Iosifidis, Iordanis Koutsopoulos
2008 J jnl
IEEE Trans. Commun.
Iordanis Koutsopoulos, Leandros Tassiulas
2007 J jnl
IEEE/ACM Trans. Netw.
Iordanis Koutsopoulos, Leandros Tassiulas
2007 A* conf
INFOCOM
Mingyan Li, Iordanis Koutsopoulos, Radha Poovendran
2006 J jnl
Signal Process.
Iordanis Koutsopoulos, Leandros Tassiulas
2006 J jnl
IEEE Trans. Wirel. Commun.
Ulas C. Kozat, Iordanis Koutsopoulos, Leandros Tassiulas
2006 J jnl
IEEE/ACM Trans. Netw.
Iordanis Koutsopoulos, Leandros Tassiulas
2006 J jnl
IEEE Trans. Mob. Comput.
Iordanis Koutsopoulos, Ulas C. Kozat, Leandros Tassiulas
2006 J jnl
IEEE Commun. Lett.
Iordanis Koutsopoulos, Konstantinos P. Tsoukatos, Konstantinos Aggelis
2005 conf
Workshop on Wireless Security
Svetlana Radosavac, John S. Baras, Iordanis Koutsopoulos
2004 A* conf
INFOCOM
Ulas C. Kozat, Iordanis Koutsopoulos, Leandros Tassiulas
2004 B conf
NETWORKING
Iordanis Koutsopoulos, Leandros Tassiulas
2003 B conf
WCNC
Tianmin Ren, Iordanis Koutsopoulos, Leandros Tassiulas
2003 A* conf
INFOCOM
Iordanis Koutsopoulos, Tianmin Ren, Leandros Tassiulas
2002 A* conf
INFOCOM
Iordanis Koutsopoulos, Leandros Tassiulas
2002 J jnl
IEEE Trans. Wirel. Commun.
Iordanis Koutsopoulos, Leandros Tassiulas
2002 B conf
GLOBECOM
Tianmin Ren, Iordanis Koutsopoulos, Leandros Tassiulas
2002
Iordanis Koutsopoulos
2001 conf
ICC
Iordanis Koutsopoulos, Leandros Tassiulas
2001 A* conf
INFOCOM
Iordanis Koutsopoulos, Leandros Tassiulas
2001 B conf
GLOBECOM
Iordanis Koutsopoulos, Leandros Tassiulas
2000 conf
ICC (3)
Iordanis Koutsopoulos, Dennis Connors, Andreas Savvides, Son K. Dao
2000 conf
ICC (3)
Iordanis Koutsopoulos, Leandros Tassiulas
redb/extractors/hashes.py
← Index redb/extractors/hashes.py python
from dataclasses import asdict
from typing import Any
from datetime import datetime, timezone

import hashlib
import inspect
from struct import pack

from magika import Magika
from signify.fingerprinter import AuthenticodeFingerprinter
import ppdeep
import tlsh

import pefile
from elftools.elf.elffile import ELFFile
from elftools.common.exceptions import ELFError

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


class HashExtractor(Extractor):

    def __init__(
        self,
        filepath,
        log,
        exporters=None,
        index_prefix=None,
        elastic_index=None,
        known_benign=False,
        known_malicious=False,
        macho=None,
    ):
        super().__init__(
            filepath, log, exporters, index_prefix, elastic_index, known_benign, known_malicious
        )
        self.hashes = None
        self.elastic_index = self.index_prefix + "-hashes"
        self.filetype = Magika().identify_bytes(self.binary).output.label
        self.pe = None
        self.elf = None
        self.macho = macho
        if self.filetype == "pebin":  # else None
            try:
                self.pe = pefile.PE(self.filepath)
            except Exception as e:
                self.log.error(f"Failed to initialize PE file object: {e}")
                self.pe = None
        elif self.filetype == "elf":
            # ELF file will be created when needed in _extract_elf_hashes
            pass

    def _extract_hashes(self):
        self.log.debug(inspect.currentframe().f_code.co_name)
        
        # Initialize hash values with None
        md5 = None
        sha1 = None
        sha256 = None
        ssdeep_hash = None
        tlsh_hash = None
        
        # Calculate basic hashes with error handling
        try:
            md5 = hashlib.md5(self.binary).hexdigest()
        except Exception as e:
            self.log.error(f"Failed to calculate MD5 hash: {e}")
            
        try:
            sha1 = hashlib.sha1(self.binary).hexdigest()
        except Exception as e:
            self.log.error(f"Failed to calculate SHA1 hash: {e}")
            
        try:
            sha256 = hashlib.sha256(self.binary).hexdigest()
        except Exception as e:
            self.log.error(f"Failed to calculate SHA256 hash: {e}")
            
        try:
            ssdeep_hash = ppdeep.hash_from_file(self.filepath)
        except Exception as e:
            self.log.error(f"Failed to calculate ssdeep hash: {e}")
            
        try:
            tlsh_hash = tlsh.hash(self.binary)
        except Exception as e:
            self.log.error(f"Failed to calculate TLSH hash: {e}")
        
        # Create Hashes object with available values
        self.hashes = Hashes(
            md5 or "",
            sha1 or "",
            sha256 or "",
            ssdeep_hash or "",
            tlsh_hash or "",
        )

        if self.filetype == "pebin" and self.pe is not None:
            self.log.debug("Computing PEBIN related hash values")
            
            # Authentihash
            try:
                with open(self.filepath, 'rb') as f:
                    fingerprinter = AuthenticodeFingerprinter(f)
                    fingerprinter.add_authenticode_hashers(hashlib.sha256)
                    self.hashes.authentihash = fingerprinter.hash()['sha256'].hex()
            except Exception as e:
                self.log.error(f"Failed to calculate Authentihash: {e}")
                self.hashes.authentihash = None
                
            # Imphash
            try:
                self.hashes.imphash = self.pe.get_imphash()
            except Exception as e:
                self.log.error(f"Failed to calculate Imphash: {e}")
                self.hashes.imphash = None
                
            # Rich header hashes
            try:
                if self.pe.parse_rich_header():
                    self.log.debug("Computing RichHeader related hash values")
                    
                    richhash = self._compute_richhash()
                    if richhash:
                        self.hashes.richhash = richhash
                        
                    richpe_hash = self._compute_richpe_hash()
                    if richpe_hash:
                        self.hashes.richpe_hash = richpe_hash
                        
                    richpv_result = self._compute_richpv_hash()
                    if richpv_result:
                        self.hashes.richpv_hash, self.hashes.richpv_hash_sorted = richpv_result
            except Exception as e:
                self.log.error(f"Failed to calculate Rich header hashes: {e}")
        elif self.filetype == "pebin" and self.pe is None:
            self.log.warning("PE file type detected but PE object initialization failed - skipping PE-specific hashes")

        elif self.filetype == "elf":
            self.log.debug("Computing ELF related hash values")
            self._extract_elf_hashes()
        elif self.filetype == "macho":
            self.log.debug("Computing Mach-O related hash values")
            self._extract_macho_hashes()
        elif self.filetype == "apk":
            self.log.debug("Computing APK related hash values")
            self._extract_apk_hashes()
        else:
            pass
        self.log.debug(f"Hashes dump: {asdict(self.hashes)}")
        return self.hashes

    def _compute_richhash(self):
        self.log.debug(inspect.currentframe().f_code.co_name)
        try:
            rich_header = self.pe.parse_rich_header()
            if not rich_header:
                return ""
            data = rich_header["clear_data"]
            return hashlib.md5(data).hexdigest().lower()
        except:
            return ""

    def _compute_richpe_hash(self):
        """
        Computes the RichPE hash given a file path or PE object.

        RichPE hash is includes RichHeader CompID and count, as well as
        fields from IMAGE_FILE_HEADER and IMAGE_OPTIONAL_HEADER

        Parameters:
        input: it can be either a file path or a PE object

        Returns:
        richpe_hash: md5 hash of the RichPE value
        None: if no Rich Header present
        """
        try:
            # Attempt to parse Rich header
            self.log.debug(inspect.currentframe().f_code.co_name)
            rich_header = self.pe.parse_rich_header()
            if rich_header is None:
                return None

            # Get list of @Comp.IDs and counts from Rich header
            # Elements in rich_fields at even indices are @Comp.IDs
            # Elements in rich_fields at odd indices are counts
            rich_fields = rich_header.get("values", None)
            if not rich_fields or len(rich_fields) % 2 != 0:
                return None

            md5 = hashlib.md5()

            # Update hash using @Comp.IDs and masked counts from Rich header
            while len(rich_fields):
                compid = rich_fields.pop(0)
                count = rich_fields.pop(0)
                mask = 2 ** (count.bit_length() // 2 + 1) - 1
                count |= mask
                md5.update(pack("<L", compid))
                md5.update(pack("<L", count))

            # Update hash using metadata from the PE header
            md5.update(pack("<L", self.pe.FILE_HEADER.Machine))
            md5.update(pack("<L", self.pe.FILE_HEADER.Characteristics))
            md5.update(pack("<L", self.pe.OPTIONAL_HEADER.Subsystem))
            md5.update(pack("<B", self.pe.OPTIONAL_HEADER.MajorLinkerVersion))
            md5.update(pack("<B", self.pe.OPTIONAL_HEADER.MinorLinkerVersion))
            md5.update(pack("<L", self.pe.OPTIONAL_HEADER.MajorOperatingSystemVersion))
            md5.update(pack("<L", self.pe.OPTIONAL_HEADER.MinorOperatingSystemVersion))
            md5.update(pack("<L", self.pe.OPTIONAL_HEADER.MajorImageVersion))
            md5.update(pack("<L", self.pe.OPTIONAL_HEADER.MinorImageVersion))
            md5.update(pack("<L", self.pe.OPTIONAL_HEADER.MajorSubsystemVersion))
            md5.update(pack("<L", self.pe.OPTIONAL_HEADER.MinorSubsystemVersion))

            return md5.hexdigest()
        except Exception as e:
            self.log.error(f"Failed to compute RichPE hash: {e}")
            return None

    def _compute_richpv_hash(self):
        """
        Compute the RichPV hash values, sorted and unsorted.
        RichPV excludes the most volatile Rich Header field from the MD5 input data,
        the Product Count (pC) field.

        Returns:
        richpv_hash_unsorted: md5 hash of the RichPV value unsorted
        richpv_hash_sorted: md5 hash of the RichPV value sorted
        None: if no Rich Header present
        """
        try:
            self.log.debug(inspect.currentframe().f_code.co_name)
            # Attempt to parse Rich header
            rich_header = self.pe.parse_rich_header()
            if rich_header is None:
                return None

            # Get list of @Comp.IDs and counts from Rich header
            # Elements in rich_fields at even indices are @Comp.IDs
            # Elements in rich_fields at odd indices are counts
            rich_fields = rich_header.get("values", None)
            if not rich_fields or len(rich_fields) % 2 != 0:
                return None

            md5 = hashlib.md5()
            md5_sorted = hashlib.md5()
            sorted_vector = []

            # Update hash using @Comp.IDs only
            for i in range(0, len(rich_fields), 2):
                compid = rich_fields[i]
                md5.update(pack("<L", compid))
                sorted_vector.append(compid)

            sorted_vector.sort()
            for compid in sorted_vector:
                md5_sorted.update(pack("<L", compid))

            return md5.hexdigest(), md5_sorted.hexdigest()
        except Exception as e:
            self.log.error(f"Failed to compute RichPV hash: {e}")
            return None

    def _extract_elf_hashes(self):
        """Extract ELF specific similarity hashes."""
        self.log.debug(inspect.currentframe().f_code.co_name)

        try:
            with open(self.filepath, 'rb') as f:
                elf = ELFFile(f)
                if not elf:
                    return

                # Generate all similarity hashes
                import_hash = self._generate_elf_import_hash(elf)
                export_hash = self._generate_elf_export_hash(elf)
                section_hash = self._generate_elf_section_hash(elf)
                symbol_hash = self._generate_elf_symbol_hash(elf)
                dynamic_hash = self._generate_elf_dynamic_hash(elf)

                # Only set hashes if they have meaningful values
                if import_hash:
                    self.hashes.import_hash = import_hash
                if export_hash:
                    self.hashes.export_hash = export_hash
                if section_hash:
                    self.hashes.section_hash = section_hash
                if symbol_hash:
                    self.hashes.symhash = symbol_hash
                if dynamic_hash:
                    self.hashes.dynamic_hash = dynamic_hash

        except Exception as e:
            self.log.error(f"Failed to extract ELF hashes: {e}")

    def _generate_elf_import_hash(self, elf) -> str:
        """Generate MD5 hash of sorted, deduplicated imported symbol names."""
        try:
            imported_symbols = set()

            # Get dynamic symbol table
            dynsym_section = elf.get_section_by_name('.dynsym')
            if dynsym_section and hasattr(dynsym_section, 'iter_symbols'):
                for symbol in dynsym_section.iter_symbols():
                    # Look for undefined symbols (imports)
                    if (symbol.entry.get('st_shndx', 0) == 'SHN_UNDEF' and
                        symbol.name and
                        symbol.entry.get('st_info', {}).get('bind') in ['STB_GLOBAL', 'STB_WEAK']):
                        imported_symbols.add(symbol.name)

            # Also check relocations for additional imports
            for section in elf.iter_sections():
                if hasattr(section, 'iter_relocations'):
                    try:
                        for relocation in section.iter_relocations():
                            if hasattr(relocation, 'symbol') and relocation.symbol and relocation.symbol.name:
                                imported_symbols.add(relocation.symbol.name)
                    except:
                        pass

            # Sort and concatenate
            sorted_imports = sorted(list(imported_symbols))

            # Return None if no imports found
            if not sorted_imports:
                return None

            imports_string = '|'.join(sorted_imports)

            # Generate MD5 hash
            return hashlib.md5(imports_string.encode('utf-8')).hexdigest()

        except Exception as e:
            self.log.error(f"Error generating ELF import hash: {e}")
            return None

    def _generate_elf_export_hash(self, elf) -> str:
        """Generate MD5 hash of sorted, deduplicated exported symbol names."""
        try:
            exported_symbols = set()

            # Check both static and dynamic symbol tables
            symbol_sections = ['.symtab', '.dynsym']

            for section_name in symbol_sections:
                section = elf.get_section_by_name(section_name)
                if not section or not hasattr(section, 'iter_symbols'):
                    continue

                for symbol in section.iter_symbols():
                    # Check if symbol is exported (defined and globally visible)
                    if (symbol.name and
                        symbol.entry.get('st_shndx', 0) != 'SHN_UNDEF' and
                        symbol.entry.get('st_info', {}).get('bind') in ['STB_GLOBAL', 'STB_WEAK'] and
                        symbol.entry.get('st_info', {}).get('type') in ['STT_FUNC', 'STT_OBJECT']):
                        exported_symbols.add(symbol.name)

            # Sort and concatenate
            sorted_exports = sorted(list(exported_symbols))

            # Return None if no exports found
            if not sorted_exports:
                return None

            exports_string = '|'.join(sorted_exports)

            # Generate MD5 hash
            return hashlib.md5(exports_string.encode('utf-8')).hexdigest()

        except Exception as e:
            self.log.error(f"Error generating ELF export hash: {e}")
            return None

    def _generate_elf_section_hash(self, elf) -> str:
        """Generate MD5 hash of section layout (names, types, flags sequence)."""
        try:
            section_info = []

            for section in elf.iter_sections():
                header = section.header
                section_name = section.name or "<unnamed>"
                section_type = header.get('sh_type', 'SHT_NULL')
                section_flags = header.get('sh_flags', 0)

                # Create a consistent representation
                section_repr = f"{section_name}:{section_type}:{section_flags}"
                section_info.append(section_repr)

            # Return None if no meaningful sections found
            if not section_info:
                return None

            # Join all section info
            sections_string = '|'.join(section_info)

            # Generate MD5 hash
            return hashlib.md5(sections_string.encode('utf-8')).hexdigest()

        except Exception as e:
            self.log.error(f"Error generating ELF section hash: {e}")
            return None

    def _generate_elf_symbol_hash(self, elf) -> str:
        """Generate MD5 hash of sorted symbol names and types."""
        try:
            symbol_info = set()

            # Check both static and dynamic symbol tables
            symbol_sections = ['.symtab', '.dynsym']

            for section_name in symbol_sections:
                section = elf.get_section_by_name(section_name)
                if not section or not hasattr(section, 'iter_symbols'):
                    continue

                for symbol in section.iter_symbols():
                    if symbol.name:
                        symbol_type = symbol.entry.get('st_info', {}).get('type', 'STT_NOTYPE')
                        symbol_bind = symbol.entry.get('st_info', {}).get('bind', 'STB_LOCAL')

                        # Create a consistent representation
                        symbol_repr = f"{symbol.name}:{symbol_type}:{symbol_bind}"
                        symbol_info.add(symbol_repr)

            # Sort and concatenate
            sorted_symbols = sorted(list(symbol_info))

            # Return None if no symbols found
            if not sorted_symbols:
                return None

            symbols_string = '|'.join(sorted_symbols)

            # Generate MD5 hash
            return hashlib.md5(symbols_string.encode('utf-8')).hexdigest()

        except Exception as e:
            self.log.error(f"Error generating ELF symbol hash: {e}")
            return None

    def _generate_elf_dynamic_hash(self, elf) -> str:
        """Generate MD5 hash of dynamic section entries (DT_* tags)."""
        try:
            dynamic_info = []

            # Get the dynamic section
            dynamic_section = elf.get_section_by_name('.dynamic')
            if not dynamic_section:
                return None

            # Extract dynamic tags and their values
            for tag in dynamic_section.iter_tags():
                dt_tag = tag.entry.d_tag

                # Create a representation based on tag type
                if dt_tag == 'DT_NEEDED':
                    dynamic_info.append(f"DT_NEEDED:{tag.needed}")
                elif dt_tag == 'DT_SONAME':
                    dynamic_info.append(f"DT_SONAME:{tag.soname}")
                elif dt_tag == 'DT_RPATH':
                    dynamic_info.append(f"DT_RPATH:{tag.rpath}")
                elif dt_tag == 'DT_RUNPATH':
                    dynamic_info.append(f"DT_RUNPATH:{tag.runpath}")
                else:
                    # For other tags, use the tag name and value
                    dt_value = tag.entry.d_val if hasattr(tag.entry, 'd_val') else 0
                    dynamic_info.append(f"{dt_tag}:{dt_value}")

            # Sort to ensure consistent ordering
            dynamic_info.sort()
            dynamics_string = '|'.join(dynamic_info)

            # Generate MD5 hash
            return hashlib.md5(dynamics_string.encode('utf-8')).hexdigest()

        except Exception as e:
            self.log.error(f"Error generating ELF dynamic hash: {e}")
            return None

    def _extract_macho_hashes(self):
        """Extract Mach-O specific similarity hashes using machofile API.

        For FAT binaries, this extracts hashes for the current file being processed
        (either the FAT container or an individual slice). The machofile library
        handles the architecture-specific extraction when an arch parameter is provided.

        For slices: We parse the slice file directly since it's a standalone Mach-O.
        For FAT container: We use the provided macho object with combined/fat hashes.
        """
        self.log.debug(inspect.currentframe().f_code.co_name)

        try:
            # If we have a pre-parsed macho object (FAT container or single-arch with passed object)
            if self.macho:
                architectures = self.macho.get_architectures()
                is_fat = len(architectures) > 1

                if is_fat:
                    # For FAT container, get combined hashes (key may be 'fat' or 'combined')
                    all_hashes = self.macho.get_similarity_hashes()
                    if all_hashes:
                        # Try 'fat' first, then 'combined' for backwards compatibility
                        similarity_hashes = all_hashes.get('fat', all_hashes.get('combined', {}))
                    else:
                        similarity_hashes = {}
                else:
                    # Single-arch with pre-parsed object
                    similarity_hashes = self.macho.get_similarity_hashes(arch=architectures[0]) if architectures else {}
            else:
                # No pre-parsed object - parse the file (slice case)
                import machofile
                macho = machofile.UniversalMachO(self.filepath)
                macho.parse()

                architectures = macho.get_architectures()
                if architectures:
                    # For a slice, there's only one architecture
                    similarity_hashes = macho.get_similarity_hashes(arch=architectures[0]) or {}
                else:
                    similarity_hashes = {}

            # Set the hash values on the Hashes object
            if similarity_hashes:
                if similarity_hashes.get('dylib_hash'):
                    self.hashes.macho_dylib_hash = similarity_hashes['dylib_hash']
                if similarity_hashes.get('import_hash'):
                    self.hashes.macho_import_hash = similarity_hashes['import_hash']
                if similarity_hashes.get('export_hash'):
                    self.hashes.macho_export_hash = similarity_hashes['export_hash']
                if similarity_hashes.get('entitlement_hash'):
                    self.hashes.macho_entitlement_hash = similarity_hashes['entitlement_hash']
                if similarity_hashes.get('symhash'):
                    self.hashes.macho_symhash = similarity_hashes['symhash']

        except Exception as e:
            self.log.error(f"Failed to extract Mach-O hashes: {e}")

    def _extract_apk_hashes(self):
        """Extract APK specific similarity hashes (permhash)."""
        self.log.debug(inspect.currentframe().f_code.co_name)
        try:
            from permhash.functions import permhash_apk
            ph = permhash_apk(self.filepath)
            if ph:
                self.hashes.permhash = ph
        except Exception as e:
            self.log.error(f"Failed to extract APK hashes: {e}")

    def extract(self):
        try:
            self.log.debug(inspect.currentframe().f_code.co_name)
            self._extract_hashes()
            return self.hashes
        except Exception as e:
            self.log.error(f"Error extracting hashes: {e}")
            return None

    def prepare_export_data(self, exporter_type: str) -> Any:
        if exporter_type == "ElasticsearchExporter":
            return self.hashes
        elif exporter_type == "ClickHouseExporter":
            # Safely get hash values with fallbacks for None values
            sha256 = getattr(self.hashes, 'sha256', None) or ""
            md5 = getattr(self.hashes, 'md5', None) or ""
            sha1 = getattr(self.hashes, 'sha1', None) or ""
            ssdeep_hash = getattr(self.hashes, 'ssdeep_hash', None) or ""
            tlsh_hash = getattr(self.hashes, 'tlsh_hash', None) or ""
            authentihash = getattr(self.hashes, 'authentihash', None)
            imphash = getattr(self.hashes, 'imphash', None)
            impfuzzy = getattr(self.hashes, 'impfuzzy', None)
            typerefhash = getattr(self.hashes, 'typerefhash', None)
            richhash = getattr(self.hashes, 'richhash', None)
            richpe_hash = getattr(self.hashes, 'richpe_hash', None)
            richpv_hash = getattr(self.hashes, 'richpv_hash', None)
            richpv_hash_sorted = getattr(self.hashes, 'richpv_hash_sorted', None)
            # ELF hashes
            import_hash = getattr(self.hashes, 'import_hash', None)
            export_hash = getattr(self.hashes, 'export_hash', None)
            section_hash = getattr(self.hashes, 'section_hash', None)
            symbol_hash = getattr(self.hashes, 'symhash', None)
            dynamic_hash = getattr(self.hashes, 'dynamic_hash', None)
            # Mach-O hashes
            macho_dylib_hash = getattr(self.hashes, 'macho_dylib_hash', None)
            macho_import_hash = getattr(self.hashes, 'macho_import_hash', None)
            macho_export_hash = getattr(self.hashes, 'macho_export_hash', None)
            macho_entitlement_hash = getattr(self.hashes, 'macho_entitlement_hash', None)
            macho_symhash = getattr(self.hashes, 'macho_symhash', None)
            # APK hashes
            permhash = getattr(self.hashes, 'permhash', None)

            data = [[
                sha256,
                md5,
                sha1,
                ssdeep_hash,
                tlsh_hash,
                authentihash,
                imphash,
                impfuzzy,
                typerefhash,
                richhash,
                richpe_hash,
                richpv_hash,
                richpv_hash_sorted,
                import_hash,
                export_hash,
                section_hash,
                symbol_hash,
                dynamic_hash,
                macho_dylib_hash,
                macho_import_hash,
                macho_export_hash,
                macho_entitlement_hash,
                macho_symhash,
                permhash,
                datetime.now(timezone.utc)
            ]]

            column_names = [
                'sha256', 'md5', 'sha1', 'ssdeep_hash', 'tlsh_hash',
                'authentihash', 'imphash', 'impfuzzy', 'typerefhash',
                'richhash', 'richpe_hash', 'richpv_hash', 'richpv_hash_sorted',
                'import_hash', 'export_hash', 'section_hash', 'symbol_hash', 'dynamic_hash',
                'macho_dylib_hash', 'macho_import_hash', 'macho_export_hash',
                'macho_entitlement_hash', 'macho_symhash',
                'permhash',
                'analysis_date'
            ]

            column_type_names = [
                # sha256, md5, sha1
                'String', 'String', 'String',
                # ssdeep_hash, tlsh_hash
                'Nullable(String)', 'Nullable(String)',
                # authentihash, imphash, impfuzzy, typerefhash
                'Nullable(String)', 'Nullable(String)',
                'Nullable(String)', 'Nullable(String)',
                # richhash, richpe_hash, richpv_hash, richpv_hash_sorted
                'Nullable(String)', 'Nullable(String)',
                'Nullable(String)', 'Nullable(String)',
                # import_hash, export_hash, section_hash, symbol_hash, dynamic_hash
                'Nullable(FixedString(32))', 'Nullable(FixedString(32))',
                'Nullable(FixedString(32))', 'Nullable(FixedString(32))',
                'Nullable(FixedString(32))',
                # macho_dylib_hash, macho_import_hash, macho_export_hash, macho_entitlement_hash, macho_symhash
                'Nullable(FixedString(32))', 'Nullable(FixedString(32))',
                'Nullable(FixedString(32))', 'Nullable(FixedString(32))',
                'Nullable(FixedString(32))',
                # permhash (APK)
                'Nullable(FixedString(64))',
                # analysis_date
                'DateTime64(3, \'UTC\')'
            ]

            return (data, column_names, column_type_names)

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

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