Victor R. Basili

259 papers A* 27A 16B 10C 8Misc 1Journal 131Unranked 59
YearRankTypeTitle / Venue / Authors
2025 J jnl
IEEE Trans. Software Eng.
Victor R. Basili, David M. Weiss, Hans Dieter Rombach
2022 J jnl
Empir. Softw. Eng.
Victor R. Basili, Lionel C. Briand
2018 J jnl
IEEE Softw.
Victor R. Basili, Lionel C. Briand, Domenico Bianculli, Shiva Nejati, Fabrizio Pastore, Mehrdad Sabetzadeh
2014 J jnl
ACM Trans. Softw. Eng. Methodol.
Lucas Layman, Victor R. Basili, Marvin V. Zelkowitz
2014 book
Victor R. Basili, Adam Trendowicz, Martin Kowalczyk, Jens Heidrich, Carolyn B. Seaman, Jürgen Münch, H. Dieter Rombach
2014 J jnl
CoRR
Victor R. Basili, Jens Heidrich, Mikael Lindvall, Jürgen Münch, Myrna Regardie, H. Dieter Rombach, Carolyn B. Seaman, Adam Trendowicz
2013 conf
Perspectives on the Future of Software Engineering
Victor R. Basili
2013 B conf
PROFES
Victor R. Basili, Constanza Lampasona, Alexis Eduardo Ocampo Ramírez
2013 J jnl
CoRR
Adnan Al Bar, Victor R. Basili, Wajdi Al Jedaibi, Abdul Jawad Chaudhry
2013 J jnl
CoRR
Victor R. Basili, Jens Heidrich, Mikael Lindvall, Jürgen Münch, Myrna Regardie, H. Dieter Rombach, Carolyn B. Seaman, Adam Trendowicz
2012 J jnl
IEICE Trans. Inf. Syst.
Akito Monden, Tomoko Matsumura, Mike Barker, Koji Torii, Victor R. Basili
2012 A conf
ESEM
Constanza Lampasona, Jens Heidrich, Victor R. Basili, Alexis Ocampo
2012 conf
ISSRE Workshops
Lucas Layman, Marvin V. Zelkowitz, Victor R. Basili, Allen P. Nikora
2011 A* conf
ICSE
Lucas Layman, Victor R. Basili, Marvin V. Zelkowitz, Karen L. Fisher
2011 J jnl
J. Syst. Softw.
W. Eric Wong, T. H. Tse, Robert L. Glass, Victor R. Basili, Tsong Yueh Chen
2011 J jnl
J. Softw. Maintenance Res. Pract.
Gerardo Canfora, Darren Dalcher, David Raffo, Victor R. Basili, Juan Fernández-Ramil, Václav Rajlich, Keith H. Bennett, Liz Burd, Malcolm Munro, Sophia Drossopoulou, Barry W. Boehm, Susan Eisenbach, Greg Michaelson, Peter Ross, Paul Wernick, Dewayne E. Perry
2011 ch.
Making Software
Victor R. Basili
2010 A conf
ESEM
Nico Zazworka, Kai Stapel, Eric Knauss, Forrest Shull, Victor R. Basili, Kurt Schneider
2010 J jnl
Computer
Victor R. Basili, Mikael Lindvall, Myrna Regardie, Carolyn B. Seaman, Jens Heidrich, Jürgen Münch, H. Dieter Rombach, Adam Trendowicz
2010 conf
JISBD
Sira Vegas, Natalia Juristo Juzgado, Victor R. Basili
2010 A conf
ESEM
Victor R. Basili, Marvin V. Zelkowitz, Lucas Layman, Kathleen Coleman Dangle, Madeline Diep
2010 conf
EUROMICRO-SEAA
Vladimir Mandic, Victor R. Basili, Markku Oivo, Lasse Harjumaa, Jouni Markkula
2010 A conf
ESEM
Vladimir Mandic, Victor R. Basili, Lasse Harjumaa, Markku Oivo, Jouni Markkula
2009 J jnl
J. Syst. Softw.
W. Eric Wong, T. H. Tse, Robert L. Glass, Victor R. Basili, Tsong Yueh Chen
2009 conf
Wirtschaftsinformatik (1)
Victor R. Basili, Jens Heidrich, Mikael Lindvall, Jürgen Münch, Carolyn Seanian, Myrna Regardie, Adam Trendowicz
2009 J jnl
IEEE Trans. Software Eng.
Sira Vegas, Natalia Juristo Juzgado, Victor R. Basili
2009 A conf
ESEM
Salvatore Alessandro Sarcià, Victor R. Basili, Giovanni Cantone
2009 A conf
ESEM
Steffen M. Olbrich, Daniela S. Cruzes, Victor R. Basili, Nico Zazworka
2009 A conf
ESEM
Nico Zazworka, Victor R. Basili, Forrest Shull
2009 conf
PROMISE
Salvatore Alessandro Sarcià, Victor R. Basili, Giovanni Cantone
2008 B conf
ICECCS
Manoel G. Mendonça, José Carlos Maldonado, Maria Cristina Ferreira de Oliveira, Jeffrey C. Carver, Sandra Camargo Pinto Ferraz Fabbri, Forrest Shull, Guilherme Horta Travassos, Erika Nina Höhn, Victor R. Basili
2008 J jnl
J. Syst. Softw.
Lorin Hochstein, Victor R. Basili, Uzi Vishkin, John Gilbert
2008 A conf
EASE
Salvatore Alessandro Sarcià, Giovanni Cantone, Victor R. Basili
2008 J jnl
Adv. Comput.
Lorin Hochstein, Taiga Nakamura, Forrest Shull, Nico Zazworka, Victor R. Basili, Marvin V. Zelkowitz
2008 J jnl
J. Syst. Softw.
W. Eric Wong, T. H. Tse, Robert L. Glass, Victor R. Basili, Tsong Yueh Chen
2008 J jnl
Empir. Softw. Eng.
Lionel C. Briand, Victor R. Basili
2008 J jnl
Empir. Softw. Eng.
Lionel C. Briand, Victor R. Basili
2008 J jnl
Empir. Softw. Eng.
Lionel C. Briand, Victor R. Basili
2008 J jnl
Computer
Lorin Hochstein, Victor R. Basili
2008 A* conf
ICSE
Nachiappan Nagappan, Brendan Murphy, Victor R. Basili
2008 J jnl
IEEE Softw.
Victor R. Basili, Jeffrey C. Carver, Daniela S. Cruzes, Lorin Hochstein, Jeffrey K. Hollingsworth, Forrest Shull, Marvin V. Zelkowitz
2008 A conf
ISSRE
Victor R. Basili
2007 conf
ICSOFT (SE)
Salvatore Alessandro Sarcià, Giovanni Cantone, Victor R. Basili
2007 A conf
ESEM
Daniela S. Cruzes, Victor R. Basili, Forrest Shull, Mário Jino
2007 C conf
ICIS
Victor R. Basili, Jens Heidrich, Mikael Lindvall, Jürgen Münch, Myrna Regardie, H. Dieter Rombach, Carolyn B. Seaman, Adam Trendowicz
2007 ed.
Empirical Software Engineering Issues
Victor R. Basili, H. Dieter Rombach, Kurt Schneider, Barbara A. Kitchenham, Dietmar Pfahl, Richard W. Selby
2007 J jnl
Commun. ACM
Victor R. Basili, Marvin V. Zelkowitz
2007 J jnl
Empir. Softw. Eng.
Mikael Lindvall, Ioana Rus, Paolo Donzelli, Atif M. Memon, Marvin V. Zelkowitz, Aysu Betin-Can, Tevfik Bultan, Christopher Ackermann, Bettina Anders, Sima Asgari, Victor R. Basili, Lorin Hochstein, Jörg Fellmann, Forrest Shull, Roseanne Tesoriero Tvedt, Daniel Pech, Daniel Hirschbach
2007 conf
SCCC
Daniela S. Cruzes, Manoel G. Mendonça, Victor R. Basili, Forrest Shull, Mário Jino
2007 A conf
ESEM
Victor R. Basili, Jens Heidrich, Mikael Lindvall, Jürgen Münch, Myrna Regardie, Adam Trendowicz
2007 conf
ICSE Companion
Victor R. Basili, Frank Bomarius, Raimund L. Feldmann
2007 J jnl
Empir. Softw. Eng.
Lionel C. Briand, Victor R. Basili
2007 J jnl
Empir. Softw. Eng.
Lionel C. Briand, Victor R. Basili
2007 J jnl
Empir. Softw. Eng.
Lionel C. Briand, Victor R. Basili
2007 J jnl
Empir. Softw. Eng.
Lionel C. Briand, Victor R. Basili
2007 J jnl
Empir. Softw. Eng.
Lionel C. Briand, Victor R. Basili
2007 J jnl
Empir. Softw. Eng.
Lionel C. Briand, Victor R. Basili
2007 J jnl
Empir. Softw. Eng.
Victor R. Basili, Marvin V. Zelkowitz, Dag I. K. Sjøberg, Philip Johnson, Anthony J. Cowling
2007 A conf
ESEM
Daniela S. Cruzes, Victor R. Basili, Forrest Shull, Mário Jino
2006 J jnl
J. Syst. Softw.
Paolo Donzelli, Victor R. Basili
2006 B conf
SPAA
Lorin Hochstein, Victor R. Basili
2006 J jnl
Empir. Softw. Eng.
Jeffrey C. Carver, Forrest Shull, Victor R. Basili
2006 A* conf
ICSE
Victor R. Basili, Sebastian G. Elbaum
2006 conf
ISESE
Taiga Nakamura, Lorin Hochstein, Victor R. Basili
2006 J jnl
Empir. Softw. Eng.
Lionel C. Briand, Victor R. Basili
2006 conf
ISESE
Victor R. Basili
2006 conf
Empirical Software Engineering Issues
Victor R. Basili
2006 conf
Empirical Software Engineering Issues
Sira Vegas, Victor R. Basili
2006 J jnl
J. Syst. Softw.
Sira Vegas, Natalia Juristo Juzgado, Victor R. Basili
2006 J jnl
Empir. Softw. Eng.
José Carlos Maldonado, Jeffrey C. Carver, Forrest Shull, Sandra Camargo Pinto Ferraz Fabbri, Emerson Dória, Luciana Andréia Fondazzi Martimiano, Manoel G. Mendonça, Victor R. Basili
2006 conf
CSEE&T
Patricia A. Basili, Victor R. Basili
2006 J jnl
J. Braz. Comput. Soc.
Victor R. Basili
2006 conf
Empirical Software Engineering Issues
Victor R. Basili
2006 C conf
SEW
Victor R. Basili
2005 J jnl
Empir. Softw. Eng.
Sira Vegas, Victor R. Basili
2005 J jnl
Innov. Syst. Softw. Eng.
Mikael Lindvall, Ioana Rus, Forrest Shull, Marvin V. Zelkowitz, Paolo Donzelli, Atif M. Memon, Victor R. Basili, Patricia Costa, Roseanne Tesoriero Tvedt, Lorin Hochstein, Sima Asgari, Christopher Ackermann, Daniel Pech
2005 conf
ESEC/SIGSOFT FSE
Lorin Hochstein, Victor R. Basili, Marvin V. Zelkowitz, Jeffrey K. Hollingsworth, Jeffrey C. Carver
2005 conf
ISESE
Forrest Shull, Jeffrey C. Carver, Lorin Hochstein, Victor R. Basili
2005 J jnl
IEEE Softw.
Paolo Donzelli, Marvin V. Zelkowitz, Victor R. Basili, Dan Allard, Kenneth N. Meyer
2005 conf
ISPW
Victor R. Basili, Forrest Shull
2005 J jnl
Empir. Softw. Eng.
Lionel C. Briand, Victor R. Basili
2005 conf
IEEE METRICS
Marvin V. Zelkowitz, Victor R. Basili, Sima Asgari, Lorin Hochstein, Jeffrey K. Hollingsworth, Taiga Nakamura
2005 conf
IEEE METRICS
Taiga Nakamura, Victor R. Basili
2005 A conf
SC
Lorin Hochstein, Jeffrey C. Carver, Forrest Shull, Sima Asgari, Victor R. Basili
2005 J jnl
Inf. Softw. Technol.
Forrest Shull, Daniela S. Cruzes, Victor R. Basili, Manoel G. Mendonça
2005 conf
IEEE METRICS
Mikael Lindvall, Paolo Donzelli, Sima Asgari, Victor R. Basili
2005 C conf
SEW
Paolo Donzelli, Daniel Hirschbach, Victor R. Basili
2004 J jnl
IEEE Softw.
Victor R. Basili, Paolo Donzelli, Sima Asgari
2004 conf
ICCBSS
Donald J. Reifer, Victor R. Basili, Barry W. Boehm, Betsy Clark
2004 conf
ICSM
Victor R. Basili
2004 J jnl
J. Braz. Comput. Soc.
Jeffrey C. Carver, Victor R. Basili
2004 J jnl
Empir. Softw. Eng.
Forrest Shull, Manoel G. Mendonça, Victor R. Basili, Jeffrey C. Carver, José Carlos Maldonado, Sandra Camargo Pinto Ferraz Fabbri, Guilherme Horta Travassos, Maria Cristina Ferreira de Oliveira
2004 J jnl
IEEE Softw.
Victor R. Basili, Barry W. Boehm, Al Davis, Watts S. Humphrey, Nancy G. Leveson, Nancy R. Mead, John D. Musa, David Lorge Parnas, Shari Lawrence Pfleeger, Elaine J. Weyuker
2004 conf
ISESE
Jeffrey C. Carver, John Van Voorhis, Victor R. Basili
2003 J jnl
IEEE Softw.
Donald J. Reifer, Victor R. Basili, Barry W. Boehm, Betsy Clark
2003 conf
SBES
Jeff Carver, Victor R. Basili
2003 book
Identifying relevant information for testing technique selection - an instatiated characterization schema.
Sira Vegas, Natalia Juristo, Victor R. Basili
2003 J jnl
Computer
Craig Larman, Victor R. Basili
2003 conf
ISESE
Jeffrey C. Carver, Forrest Shull, Victor R. Basili
2003 ch.
Lecture Notes on Empirical Software Engineering
Forrest Shull, Jeffrey C. Carver, Guilherme H. Travassos, José Carlos Maldonado, Reidar Conradi, Victor R. Basili
2003 J jnl
IEEE Trans. Software Eng.
Carolyn B. Seaman, Manoel G. Mendonça, Victor R. Basili, Yong-Mi Kim
2002 B conf
ICECCS
Victor R. Basili, Mikael Lindvall, Forrest Shull
2002 J jnl
IEEE Trans. Software Eng.
Lionel C. Briand, Sandro Morasca, Victor R. Basili
2002 J jnl
J. Syst. Softw.
Maurizio Morisio, Carolyn B. Seaman, Victor R. Basili, Amy T. Parra, Steve E. Kraft, Steven E. Condon
2002 conf
XP/Agile Universe
Mikael Lindvall, Victor R. Basili, Barry W. Boehm, Patricia Costa, Kathleen Coleman Dangle, Forrest Shull, Roseanne Tesoriero Tvedt, Laurie A. Williams, Marvin V. Zelkowitz
2002 J jnl
IEEE Softw.
Kurt Schneider, Jan-Peter von Hunnius, Victor R. Basili
2002 J jnl
Empir. Softw. Eng.
Warren Harrison, Victor R. Basili
2002 A* conf
ICSE
Victor R. Basili, Frank E. McGarry, Rose Pajerski, Marvin V. Zelkowitz
2002 conf
ISESE
Forrest Shull, Victor R. Basili, Jeffrey C. Carver, José Carlos Maldonado, Guilherme Horta Travassos, Manoel G. Mendonça, Sandra Camargo Pinto Ferraz Fabbri
2002 J jnl
Int. J. Softw. Eng. Knowl. Eng.
Sira Vegas, Natalia Juristo Juzgado, Victor R. Basili
2002 conf
IEEE METRICS
Forrest Shull, Victor R. Basili, Barry W. Boehm, A. Winsor Brown, Patricia Costa, Mikael Lindvall, Daniel Port, Ioana Rus, Roseanne Tesoriero, Marvin V. Zelkowitz
2001 C conf
SEKE
Manoel Gomes de Mendonça Neto, Carolyn B. Seaman, Victor R. Basili, Yong-Mi Kim
2001 B conf
PROFES
Victor R. Basili
2001 B conf
PROFES
Victor R. Basili, Roseanne Tesoriero, Patricia Costa, Mikael Lindvall, Ioana Rus, Forrest Shull, Marvin V. Zelkowitz
2001 J jnl
Computer
Victor R. Basili, Barry W. Boehm
2001 C conf
SEKE
Victor R. Basili
2001 A* conf
ICSE
Forrest Shull, Ioana Rus, Victor R. Basili
2001 J jnl
Computer
Barry W. Boehm, Victor R. Basili
2000 J jnl
Computer
Barry W. Boehm, Victor R. Basili
2000 J jnl
Computer
Forrest Shull, Ioana Rus, Victor R. Basili
2000 A* conf
ICSE
Victor R. Basili, Oliver Laitenberger, Forrest Shull, Ioana Rus
2000 J jnl
IEEE Trans. Software Eng.
Forrest Shull, Filippo Lanubile, Victor R. Basili
2000 A* conf
ICSE
Maurizio Morisio, Carolyn B. Seaman, Amy T. Parra, Victor R. Basili, Steve E. Kraft, Steven E. Condon
2000 conf
EWSPT
Victor R. Basili
2000 J jnl
ACM SIGSOFT Softw. Eng. Notes
Forrest Shull, Victor R. Basili, Marvin V. Zelkowitz
2000 J jnl
IEEE Trans. Software Eng.
Manoel G. Mendonça, Victor R. Basili
1999 J jnl
IEEE Trans. Software Eng.
Victor R. Basili, Forrest Shull, Filippo Lanubile
1999 J jnl
IEEE Trans. Software Eng.
Lionel C. Briand, Sandro Morasca, Victor R. Basili
1999 A conf
OOPSLA
Guilherme Travassos, Forrest Shull, Michael Fredericks, Victor R. Basili
1999 J jnl
ACM SIGSOFT Softw. Eng. Notes
Victor R. Basili, Laszlo A. Belady, Barry W. Boehm, Frederick P. Brooks Jr., James Browne, Richard A. DeMillo, Stuart I. Feldman, Cordell Green, Butler W. Lampson, Duncan H. Lawrie, Nancy G. Leveson, Nancy A. Lynch, Mark D. Weiser, Jeannette M. Wing
1999 J jnl
Empir. Softw. Eng.
Zhijun Zhang, Victor R. Basili, Ben Shneiderman
1999 conf
SSR
Mansour Zand, Victor R. Basili, Ira D. Baxter, Martin L. Griss, Even-André Karlsson, Dewayne E. Perry
1999 A* conf
ICSE
Victor R. Basili, Tom DeMarco, Ali Mili
1999 A* conf
ICSE
Daniil Yakimovich, James M. Bieman, Victor R. Basili
1999 conf
ECOOP Workshops
Forrest Shull, Guilherme Travassos, Victor R. Basili
1999 conf
Ershov Memorial Conference
Victor R. Basili, Forrest Shull, Filippo Lanubile
1998 J jnl
IBM Syst. J.
Manoel G. Mendonça, Victor R. Basili, Inderpal S. Bhandari, Jack Dawson
1998 J jnl
IEEE Trans. Software Eng.
Carolyn B. Seaman, Victor R. Basili
1998 conf
IEEE METRICS
Filippo Lanubile, Forrest Shull, Victor R. Basili
1998 conf
ICSM
Victor R. Basili, Filippo Lanubile, Forrest Shull
1998 J jnl
J. Softw. Maintenance Res. Pract.
Lionel C. Briand, Yong-Mi Kim, Walcélio L. Melo, Carolyn B. Seaman, Victor R. Basili
1997 A* conf
ICSE
Carolyn B. Seaman, Victor R. Basili
1997 J jnl
J. Syst. Softw.
William M. Thomas, Alex Delis, Victor R. Basili
1997 conf
ICSM
Victor R. Basili
1997 A* conf
ICSE
Victor R. Basili, Steven E. Condon, Khaled El Emam, Robert B. Hendrick, Walcélio L. Melo
1997 J jnl
IEEE Trans. Software Eng.
Sandro Morasca, Lionel C. Briand, Victor R. Basili, Elaine J. Weyuker, Marvin V. Zelkowitz
1997 J jnl
IBM Syst. J.
Carolyn B. Seaman, Victor R. Basili
1997 J jnl
J. Syst. Softw.
Victor R. Basili
1997 J jnl
IEEE Trans. Software Eng.
Lionel C. Briand, Sandro Morasca, Victor R. Basili
1997 A* conf
ICSE
Victor R. Basili, Frank E. McGarry
1997 J jnl
Empir. Softw. Eng.
Carolyn B. Seaman, Victor R. Basili
1997 J jnl
J. Syst. Softw.
Yasuhiro Mashiko, Victor R. Basili
1996 J jnl
IEEE Trans. Software Eng.
Salwa K. Abd-El-Hafiz, Victor R. Basili
1996 J jnl
IEEE Trans. Software Eng.
Victor R. Basili, Lionel C. Briand, Walcélio L. Melo
1996 J jnl
J. Syst. Softw.
Victor R. Basili, Salwa K. Abd-El-Hafiz
1996 conf
CASCON
Jyrki Kontio, Gianluigi Caldiera, Victor R. Basili
1996 J jnl
Empir. Softw. Eng.
Victor R. Basili
1996 J jnl
Commun. ACM
Victor R. Basili, Lionel C. Briand, Walcélio L. Melo
1996 J jnl
Empir. Softw. Eng.
Warren Harrison, Victor R. Basili
1996 J jnl
IEEE Trans. Software Eng.
Lionel C. Briand, Sandro Morasca, Victor R. Basili
1996 A* conf
ICSE
Victor R. Basili
1996 J jnl
Empir. Softw. Eng.
Victor R. Basili, Scott Green, Oliver Laitenberger, Filippo Lanubile, Forrest Shull, Lars Sivert Sørumgård, Marvin V. Zelkowitz
1996 A* conf
ICSE
Victor R. Basili, Lionel C. Briand, Steven E. Condon, Yong-Mi Kim, Walcélio L. Melo, Jon D. Valett
1995 A* conf
ICSE
Lionel C. Briand, Walcélio L. Melo, Carolyn B. Seaman, Victor R. Basili
1995 J jnl
IEEE Trans. Software Eng.
Adam A. Porter, Lawrence G. Votta, Victor R. Basili
1995 C conf
SEKE
Robert G. Reynolds, Victor R. Basili, Václav Rajlich, Nikolaos G. Bourbakis
1995 J jnl
IEEE Softw.
Victor R. Basili, Marvin V. Zelkowitz, Frank E. McGarry, Gerald T. Page, Sharon Waligora, Rose Pajerski
1995 J jnl
Adv. Comput.
Victor R. Basili
1994 conf
ICSM
Lionel C. Briand, Victor R. Basili, Yong-Mi Kim, Donald R. Squier
1994 C conf
SEKE
Salwa K. Abd-El-Hafiz, Victor R. Basili
1994 conf
Business Process Re-Engineering
D. Ross Jeffery, Victor R. Basili, Michael Berry
1994 A* conf
ICSE
Victor R. Basili
1994 conf
ISPW
Carolyn B. Seaman, Victor R. Basili
1994 J jnl
IEEE Softw.
Victor R. Basili, Scott Green
1994 J jnl
IBM Syst. J.
Stephen H. Kan, Victor R. Basili, L. N. Shapiro
1994 J jnl
IEEE Softw.
Victor R. Basili, Michael Daskalantonakis, Robert H. Yacobellis
1993 J jnl
Int. J. Softw. Eng. Knowl. Eng.
Alex Delis, Victor R. Basili
1993 J jnl
IEEE Trans. Software Eng.
Lionel C. Briand, Victor R. Basili, Christopher J. Hetmanski
1993 conf
ICSM
Salwa K. Abd-El-Hafiz, Victor R. Basili
1993 ed.
Experimental Software Engineering Issues
H. Dieter Rombach, Victor R. Basili, Richard W. Selby
1993 conf
ICSM
Lionel C. Briand, Sandro Morasca, Victor R. Basili
1993 A* ed.
ICSE
Victor R. Basili, Richard A. DeMillo, Takuya Katayama
1993 C conf
SEKE
Bruce I. Blum, Victor R. Basili, S. K. Chang, Michael Evangelist, C. V. Ramamoorthy, Raymond T. Yeh
1993 ch.
Formal Methods in Systems Engineering
Victor R. Basili
1993 conf
ESEC
Victor R. Basili
1992 J jnl
IEEE Trans. Software Eng.
Lionel C. Briand, Victor R. Basili, William M. Thomas
1992 J jnl
ACM Trans. Softw. Eng. Methodol.
Victor R. Basili, Gianluigi Caldiera, Giovanni Cantone
1992 conf
ICSM
Lionel C. Briand, Victor R. Basili
1992 Misc conf
Ada-Europe
William M. Thomas, Alex Delis, Victor R. Basili
1992 A conf
ISSRE
Lionel C. Briand, Victor R. Basili, Christopher J. Hetmanski
1992 J jnl
IEEE Trans. Software Eng.
Markku Oivo, Victor R. Basili
1992 conf
Experimental Software Engineering Issues
Victor R. Basili
1992 A* conf
ICSE
Victor R. Basili, Gianluigi Caldiera, Frank E. McGarry, Rose Pajerski, Gerald T. Page, Sharon Waligora
1991 J jnl
IEEE Trans. Software Eng.
Richard W. Selby, Victor R. Basili
1991 J jnl
Computer
Gianluigi Caldiera, Victor R. Basili
1991 J jnl
Softw. Eng. J.
Victor R. Basili, H. Dieter Rombach
1991 J jnl
Computer
Victor R. Basili, John D. Musa
1991 conf
TRI-Ada
John W. Bailey, Victor R. Basili
1991 conf
ICSM
Salwa K. Abd-El-Hafiz, Victor R. Basili, Gianluigi Caldiera
1990 A* conf
ICSE
Victor R. Basili
1990 J jnl
IEEE Softw.
Victor R. Basili
1989 J jnl
IEEE Trans. Software Eng.
Connie Loggia Ramsey, Victor R. Basili
1989 J jnl
IEEE Trans. Software Eng.
Harlan D. Mills, Victor R. Basili, John D. Gannon, Richard G. Hamlet
1989 B conf
COMPSAC
Victor R. Basili
1988 conf
ICSM
Richard W. Selby, Victor R. Basili
1988 J jnl
IEEE Trans. Software Eng.
Victor R. Basili, H. Dieter Rombach
1988 A* conf
ICSE
D. Ross Jeffery, Victor R. Basili
1987 conf
WADAS
Liqun Wu, Victor R. Basili, Karl Reed
1987 J jnl
IEEE Trans. Software Eng.
Richard W. Selby, Victor R. Basili, F. Terry Baker
1987 J jnl
IEEE Trans. Software Eng.
Victor R. Basili, Richard W. Selby
1987 conf
WADAS
Elizabeth E. Katz, Victor R. Basili
1987 J jnl
IEEE Softw.
Victor R. Basili, H. Dieter Rombach
1987 conf
WADAS
Carolyn E. Brophy, William W. Agresti, Victor R. Basili
1987 J jnl
Inform. Spektrum
H. Dieter Rombach, Victor R. Basili
1987 conf
WADAS
Victor R. Basili, H. Dieter Rombach
1987 A* conf
ICSE
Victor R. Basili, H. Dieter Rombach
1987 conf
ACM Conference on Computer Science
Harlan D. Mills, Victor R. Basili, John D. Gannon, Richard G. Hamlet
1986 J jnl
IEEE Trans. Software Eng.
Victor R. Basili, Richard W. Selby, David H. Hutchens
1986 J jnl
Commun. ACM
John D. Gannon, Elizabeth E. Katz, Victor R. Basili
1985 A* conf
ICSE
J. Ramsey, Victor R. Basili
1985 A* conf
ICSE
Victor R. Basili, Richard W. Selby
1985 J jnl
Computer
Victor R. Basili, Elizabeth E. Katz, Nora Monina Panlilio-Yap, Connie Loggia Ramsey, Shih Chang
1985 J jnl
IEEE Trans. Software Eng.
David M. Weiss, Victor R. Basili
1985 J jnl
ACM Trans. Program. Lang. Syst.
Douglas D. Dunlop, Victor R. Basili
1985 J jnl
IEEE Trans. Software Eng.
Carl W. Doerflinger, Victor R. Basili
1985 J jnl
IEEE Trans. Software Eng.
David H. Hutchens, Victor R. Basili
1984 J jnl
IEEE Trans. Software Eng.
Douglas D. Dunlop, Victor R. Basili
1984 J jnl
IEEE Trans. Software Eng.
Victor R. Basili, David M. Weiss
1984 J jnl
Computer
Marvin V. Zelkowitz, Raymond T. Yeh, Richard G. Hamlet, John D. Gannon, Victor R. Basili
1984 J jnl
Commun. ACM
Victor R. Basili, Barry T. Perricone
1983 J jnl
IEEE Trans. Software Eng.
Victor R. Basili, David H. Hutchens
1983 J jnl
IEEE Trans. Software Eng.
Victor R. Basili, Richard W. Selby, Tsai-Yun Phillips
1982 J jnl
ACM Comput. Surv.
Douglas D. Dunlop, Victor R. Basili
1982 A* ed.
ICSE
Yutaka Ohno, Victor R. Basili, Hajime Enomoto, Koji Kobayashi, Raymond T. Yeh
1982 J jnl
ACM SIGSOFT Softw. Eng. Notes
William E. Riddle, Victor R. Basili, Les Belady, Carl Davis, Susan L. Gerhart, William E. Howden, John D. Musa, Leon G. Stucki
1982 J jnl
IEEE Trans. Software Eng.
Victor R. Basili, Harlan D. Mills
1981 J jnl
IEEE Trans. Software Eng.
Victor R. Basili, Robert W. Reiter Jr.
1981 A* conf
ICSE
John W. Bailey, Victor R. Basili
1981 J jnl
J. Syst. Softw.
Victor R. Basili, John Beane
1981 conf
Measurement and evaluation of software quality
Victor R. Basili, Tsai-Yun Phillips
1981 A* conf
ICSE
Victor R. Basili, David M. Weiss
1981 J jnl
J. Syst. Softw.
Victor R. Basili, Karl Freburger
1981 J jnl
Computer
Stephen A. Sutton, Victor R. Basili
1980 J jnl
IEEE Trans. Software Eng.
Victor R. Basili, Robert E. Noonan
1980 J jnl
J. Syst. Softw.
Victor R. Basili
1980 J jnl
J. Syst. Softw.
Victor R. Basili, John G. Perry Jr.
1979 J jnl
Computer
Victor R. Basili, Robert W. Reiter Jr.
1978 A* conf
ICSE
Victor R. Basili, Marvin V. Zelkowitz
1977 conf
SIGCPR
Victor R. Basili, Marvin V. Zelkowitz
1976 J jnl
Comput. Lang.
Victor R. Basili
1975 conf
Programming Languages and Compilers for Parallel and Vector Machines
Victor R. Basili, John C. Knight
1975 J jnl
IEEE Trans. Software Eng.
Victor R. Basili, Albert J. Turner
1975 B conf
WG
Victor R. Basili
1975 B conf
WG
Victor R. Basili
1975 B conf
WG
Victor R. Basili
1974 A conf
SIGCSE
Victor R. Basili, Albert J. Turner
1974 conf
ACM Annual Conference (1)
Victor R. Basili
1973 conf
SIGPLAN-SIGOPS Interface Meeting
Robert E. Noonan, Victor R. Basili, Richard G. Hamlet, M. Lay, Harlan D. Mills, Albert J. Turner, Marvin V. Zelkowitz
1973 conf
HLLCA
Victor R. Basili, Albert J. Turner
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