Ioannis Pratikakis

159 papers A 14B 18C 4Misc 1Journal 73Unranked 40
YearRankTypeTitle / Venue / Authors
2026 J jnl
IEEE Trans. Intell. Veh.
Ilias Papadeas, Lazaros T. Tsochatzidis, Ioannis Pratikakis
2026 J jnl
Comput. Graph.
Ioannis Pratikakis, Niloy J. Mitra, Paul Guerrero, Remco C. Veltkamp
2025 ed.
3DOR (Short Papers)
Paul Guerrero, Ioannis Pratikakis, Remco C. Veltkamp
2025 conf
3DOR (Short Papers)
Dimitrios Antonarakos, Georgios Zamanakos, Ilias Papadeas, Ioannis Pratikakis
2024 J jnl
Robotics Auton. Syst.
Georgios Zamanakos, Lazaros T. Tsochatzidis, Angelos Amanatiadis, Ioannis Pratikakis
2024 J jnl
J. Imaging
Nikolaos Detsikas, Nikolaos Mitianoudis, Ioannis Pratikakis
2024 conf
SETN
Panagiota Moraiti, Lazaros T. Tsochatzidis, Ilias Papadeas, Ioannis Pratikakis
2023 J jnl
IEEE Trans. Intell. Veh.
Athanasios Chalvatzaras, Ioannis Pratikakis, Angelos A. Amanatiadis
2023 conf
COINS
Maria Siopi, Dimitrios Ellinoudis, Ioannis Pratikakis, Angelos Amanatiadis
2023 J jnl
IEEE Trans. Inf. Forensics Secur.
Matej Vitek, Abhijit Das, Diego Rafael Lucio, Luiz Antonio Zanlorensi, David Menotti, Jalil Nourmohammadi-Khiarak, Mohsen Akbari Shahpar, Meysam Asgari-Chenaghlu, Farhang Jaryani, Juan E. Tapia, Andres Valenzuela, Caiyong Wang, Yunlong Wang, Zhaofeng He, Zhenan Sun, Fadi Boutros, Naser Damer, Jonas Henry Grebe, Arjan Kuijper, Kiran B. Raja, Gourav Gupta, Georgios Zampoukis, Lazaros T. Tsochatzidis, Ioannis Pratikakis, S. V. Aruna Kumar, B. S. Harish, Umapada Pal, Peter Peer, Vitomir Struc
2023 J jnl
IEEE Access
Zois Tsakiris, Lazaros T. Tsochatzidis, Ioannis Pratikakis
2023 conf
DSP
Efstathios Karypidis, Georgios Zamanakos, Lazaros T. Tsochatzidis, Ioannis Pratikakis
2023 J jnl
Comput. Graph.
Yang Gao, Honglin Yuan, Tao Ku, Remco C. Veltkamp, Georgios Zamanakos, Lazaros T. Tsochatzidis, Angelos Amanatiadis, Ioannis Pratikakis, Aliki Panou, Ioannis Romanelis, Vlassis Fotis, Gerasimos Arvanitis, Konstantinos Moustakas
2022 conf
IVMSP
Georgios Zamanakos, Lazaros T. Tsochatzidis, Angelos Amanatiadis, Ioannis Pratikakis
2022 J jnl
Comput. Graph.
Vazgken Vanian, Georgios Zamanakos, Ioannis Pratikakis
2021 J jnl
Comput. Graph.
Georgios Zamanakos, Lazaros T. Tsochatzidis, Angelos Amanatiadis, Ioannis Pratikakis
2021 J jnl
J. Imaging
Lazaros T. Tsochatzidis, Symeon Symeonidis, Alexandros Papazoglou, Ioannis Pratikakis
2021 J jnl
Comput. Methods Programs Biomed.
Lazaros T. Tsochatzidis, Panagiota Koutla, Lena Costaridou, Ioannis Pratikakis
2021 C conf
ICCE
Angelos Amanatiadis, Konstantinos Zagoris, Ioannis Pratikakis
2021 J jnl
J. Imaging
Konstantinos Zagoris, Angelos Amanatiadis, Ioannis Pratikakis
2020 ed.
3DOR
Tobias Schreck, Theoharis Theoharis, Ioannis Pratikakis, Michela Spagnuolo, Remco C. Veltkamp
2020 conf
ICPR Workshops (7)
Kleopatra Markou, Lazaros T. Tsochatzidis, Konstantinos Zagoris, Alexandros Papazoglou, Xenofon Karagiannis, Symeon Symeonidis, Ioannis Pratikakis
2020 J jnl
Comput. Graph.
Tobias Schreck, Theoharis Theoharis, Ioannis Pratikakis, Michela Spagnuolo, Remco C. Veltkamp
2020 J jnl
Comput. Graph.
Silvia Biasotti, Bianca Falcidieno, Guillaume Lavoué, Ioannis Pratikakis
2020 B conf
IJCB
Matej Vitek, Abhijit Das, Yann Pourcenoux, Alexandre Missler, C. Paumier, Sumanta Das, Ishita De Ghosh, Diego Rafael Lucio, Luiz Antonio Zanlorensi, David Menotti, Fadi Boutros, Naser Damer, Jonas Henry Grebe, Arjan Kuijper, Junxing Hu, Yong He, Caiyong Wang, H. Liu, Yunlong Wang, Zhenan Sun, Dailé Osorio Roig, Christian Rathgeb, Christoph Busch, Juan E. Tapia, Andres Valenzuela, Georgios Zampoukis, Lazaros T. Tsochatzidis, Ioannis Pratikakis, Sabari Nathan, Ramamoorthy Suganya, Vineet Mehta, Abhinav Dhall, Kiran B. Raja, Gourav Gupta, Jalil Nourmohammadi-Khiarak, Mohsen Akbari-Shahper, Farhang Jaryani, Meysam Asgari-Chenaghlu, Ritesh Vyas, Sristi Dakshit, Peter Peer, Umapada Pal, Vitomir Struc
2019 J jnl
J. Imaging
Lazaros T. Tsochatzidis, Lena Costaridou, Ioannis Pratikakis
2019 J jnl
Int. J. Image Graph.
Christos Veinidis, Antonios Danelakis, Ioannis Pratikakis, Theoharis Theoharis
2019 A conf
ICDAR
Ioannis Pratikakis, Konstantinos Zagoris, Xenofon Karagiannis, Lazaros T. Tsochatzidis, Tanmoy Mondal, Isabelle Marthot-Santaniello
2019 J jnl
J. Documentation
Günter Mühlberger, Louise Seaward, Melissa Terras, Sofia Ares Oliveira, Vicente Bosch, Maximilian Bryan, Sebastian Colutto, Hervé Déjean, Markus Diem, Stefan Fiel, Basilis Gatos, Albert Greinoecker, Tobias Grüning, Günter Hackl, Vili Haukkovaara, Gerhard Heyer, Lauri Hirvonen, Tobias Hodel, Matti Jokinen, Philip Kahle, Mario Kallio, Frédéric Kaplan, Florian Kleber, Roger Labahn, Eva Maria Lang, Sören Laube, Gundram Leifert, Georgios Louloudis, Rory McNicholl, Jean-Luc Meunier, Johannes Michael, Elena Mühlbauer, Nathanael Philipp, Ioannis Pratikakis, Joan Puigcerver Pérez, Hannelore Putz, George Retsinas, Verónica Romero, Robert Sablatnig, Joan-Andreu Sánchez, Philip Schofield, Giorgos Sfikas, Christian Sieber, Nikolaos Stamatopoulos, Tobias Strauß, Tamara Terbul, Alejandro H. Toselli, Berthold Ulreich, Mauricio Villegas, Enrique Vidal, Johanna Walcher, Max Weidemann, Herbert Wurster, Konstantinos Zagoris
2019 J jnl
Multim. Tools Appl.
Christos Veinidis, Ioannis Pratikakis, Theoharis Theoharis
2018 J jnl
Multim. Tools Appl.
Antonios Danelakis, Theoharis Theoharis, Ioannis Pratikakis
2018 J jnl
Comput. Graph.
Konstantinos Sfikas, Ioannis Pratikakis, Theoharis Theoharis
2018 J jnl
Comput. Graph.
Guillaume Lavoué, Ioannis Pratikakis, Florent Dupont, Maks Ovsjanikov, Michela Spagnuolo
2018 B conf
ICFHR
Ioannis Pratikakis, Konstantinos Zagoris, Panagiotis Kaddas, Basilis Gatos
2018 J jnl
Multim. Tools Appl.
Ioannis Pratikakis, Michalis A. Savelonas, Pavlos Mavridis, Georgios Papaioannou, Konstantinos Sfikas, Fotis Arnaoutoglou, Dirk Rieke-Zapp
2018 J jnl
IEEE Trans. Multim.
George Ioannakis, Anestis Koutsoudis, Ioannis Pratikakis, Christodoulos Chamzas
2018 J jnl
Comput. Vis. Image Underst.
Michalis A. Savelonas, Ioannis Pratikakis, Theoharis Theoharis, Georgios Thanellas, Frédéric Abad, Rémy Bendahan
2017 ed.
3DOR@Eurographics
Ioannis Pratikakis, Florent Dupont, Maks Ovsjanikov
2017 A conf
ICDAR
Konstantinos Zagoris, Ioannis Pratikakis
2017 J jnl
Pattern Recognit.
Lazaros T. Tsochatzidis, Konstantinos Zagoris, Nikolaos Arikidis, Anna Karahaliou, Lena Costaridou, Ioannis Pratikakis
2017 conf
3DOR@Eurographics
Konstantinos Sfikas, Theoharis Theoharis, Ioannis Pratikakis
2017 A conf
ICDAR
Ioannis Pratikakis, Konstantinos Zagoris, George Barlas, Basilis Gatos
2017 J jnl
Multim. Tools Appl.
Christos Veinidis, Ioannis Pratikakis, Theoharis Theoharis
2017 J jnl
Comput. Vis. Image Underst.
Panagiotis Theologou, Ioannis Pratikakis, Theoharis Theoharis
2017 J jnl
IEEE Trans. Pattern Anal. Mach. Intell.
Panagiotis Theologou, Ioannis Pratikakis, Theoharis Theoharis
2017 J jnl
IEEE Trans. Image Process.
Konstantinos Zagoris, Ioannis Pratikakis, Basilis Gatos
2016 J jnl
Vis. Comput.
Antonios Danelakis, Theoharis Theoharis, Ioannis Pratikakis
2016 J jnl
Vis. Comput.
Antonios Danelakis, Theoharis Theoharis, Ioannis Pratikakis
2016 J jnl
Pattern Recognit.
Antonios Danelakis, Theoharis Theoharis, Ioannis Pratikakis, Panagiotis Perakis
2016 conf
DMIAF
George Ioannakis, Christodoulos Chamzas, Anestis Koutsoudis, Nikolaos Papamarkos, Ioannis Pratikakis, Fotis Arnaoutoglou, Nikolaos Mitianoudis, Thomas Sgouros
2016 J jnl
Pattern Recognit.
Michalis A. Savelonas, Ioannis Pratikakis, Konstantinos Sfikas
2016 B conf
ICFHR
Ioannis Pratikakis, Konstantinos Zagoris, George Barlas, Basilis Gatos
2016 B conf
ICFHR
Ioannis Pratikakis, Konstantinos Zagoris, Basilis Gatos, Joan Puigcerver, Alejandro H. Toselli, Enrique Vidal
2016 conf
3DOR@Eurographics
Ioannis Pratikakis, Michalis A. Savelonas, Fotis Arnaoutoglou, George Ioannakis, Anestis Koutsoudis, Theoharis Theoharis, Minh-Triet Tran, Vinh-Tiep Nguyen, Viet-Khoi Pham, Hai-Dang Nguyen, Hoang-An Le, Ba-Huu Tran, Huu-Quan To, Minh-Bao Truong, Thuyen V. Phan, Minh-Duc Nguyen, Thanh-An Than, Khoi-Nguyen C. Mac, Minh N. Do, Anh Duc Duong, Takahiko Furuya, Ryutarou Ohbuchi, Masaki Aono, Shoki Tashiro, David Pickup, Xianfang Sun, Paul L. Rosin, Ralph R. Martin
2016 J jnl
Multim. Tools Appl.
Konstantinos Sfikas, Ioannis Pratikakis, Anestis Koutsoudis, Michalis A. Savelonas, Theoharis Theoharis
2015 ed.
3DOR@Eurographics
Ioannis Pratikakis, Theoharis Theoharis, Michela Spagnuolo, Luc Van Gool, Remco C. Veltkamp, Afzal Godil
2015 conf
HIP@ICDAR
Konstantinos Zagoris, Ioannis Pratikakis, Basilis Gatos
2015 conf
3DOR@Eurographics
Antonios Danelakis, Theoharis Theoharis, Ioannis Pratikakis
2015 J jnl
Comput. Vis. Image Underst.
Panagiotis Theologou, Ioannis Pratikakis, Theoharis Theoharis
2015 J jnl
Multim. Tools Appl.
Antonios Danelakis, Theoharis Theoharis, Ioannis Pratikakis
2015 J jnl
Multim. Tools Appl.
Michalis A. Savelonas, Ioannis Pratikakis, Konstantinos Sfikas
2015 J jnl
Multim. Tools Appl.
Antonios Danelakis, Theoharis Theoharis, Ioannis Pratikakis
2015 conf
3DOR@Eurographics
Michalis A. Savelonas, Ioannis Pratikakis, Konstantinos Sfikas
2015 conf
3DOR@Eurographics
Anestis Koutsoudis, George Ioannakis, Ioannis Pratikakis, Christos Chamzas
2014 J jnl
Pattern Recognit. Lett.
Konstantinos Ntirogiannis, Basilis Gatos, Ioannis Pratikakis
2014 J jnl
Pattern Recognit.
Konstantinos Zagoris, Ioannis Pratikakis, Apostolos Antonacopoulos, Basilis Gatos, Nikos Papamarkos
2014 conf
3DOR@Eurographics
Michalis A. Savelonas, Ioannis Pratikakis, Konstantinos Sfikas
2014 conf
3DOR@Eurographics
Antonios Danelakis, Theoharis Theoharis, Ioannis Pratikakis
2014 B conf
ICFHR
Ioannis Pratikakis, Konstantinos Zagoris, Basilis Gatos, Georgios Louloudis, Nikolaos Stamatopoulos
2014 B conf
ICFHR
Konstantinos Ntirogiannis, Basilis Gatos, Ioannis Pratikakis
2014 J jnl
Vis. Comput.
Konstantinos Sfikas, Theoharis Theoharis, Ioannis Pratikakis
2014 conf
3DV (Workshops)
Christos Veinidis, Ioannis Pratikakis, Theoharis Theoharis
2014 conf
AI-AM/NetMed@ECAI
Lazaros T. Tsochatzidis, Konstantinos Zagoris, Michalis A. Savelonas, Ioannis Pratikakis
2014 B conf
ICFHR
Konstantinos Zagoris, Ioannis Pratikakis, Basilis Gatos
2014 J jnl
J. Cell. Autom.
Konstantinos Zagoris, Ioannis Pratikakis
2013 conf
ICIAP Workshops
Konstantinos Sfikas, Ioannis Pratikakis, Anestis Koutsoudis, Michalis A. Savelonas, Theoharis Theoharis
2013 J jnl
Vis. Comput.
Konstantinos Sfikas, Theoharis Theoharis, Ioannis Pratikakis
2013 ed.
3DOR@Eurographics
Umberto Castellani, Tobias Schreck, Silvia Biasotti, Ioannis Pratikakis, Afzal Godil, Remco C. Veltkamp
2013 J jnl
Pattern Recognit.
Anastasia Bolovinou, Ioannis Pratikakis, Stavros J. Perantonis
2013 J jnl
Pattern Anal. Appl.
Marios Anthimopoulos, Basilios Gatos, Ioannis Pratikakis
2013 A conf
ICDAR
Ioannis Pratikakis, Basilis Gatos, Konstantinos Ntirogiannis
2013 J jnl
IEEE Trans. Image Process.
Konstantinos Ntirogiannis, Basilios Gatos, Ioannis Pratikakis
2013 conf
3DOR@Eurographics
Konstantinos Sfikas, Ioannis Pratikakis, Theoharis Theoharis
2013 A conf
ICDAR
Konstantinos Zagoris, Ioannis Pratikakis
2012 conf
3DOR@Eurographics
Konstantinos Sfikas, Ioannis Pratikakis, Theoharis Theoharis
2012 conf
3DTV-Conference
Antonios Danelakis, Theoharis Theoharis, Ioannis Pratikakis
2012 B conf
ICFHR
Konstantinos Zagoris, Ioannis Pratikakis, Apostolos Antonacopoulos, Basilios Gatos, Nikos Papamarkos
2012 B conf
ICFHR
Ioannis Pratikakis, Basilios Gatos, Konstantinos Ntirogiannis
2012 J jnl
Vis. Comput.
Konstantinos Sfikas, Theoharis Theoharis, Ioannis Pratikakis
2012 conf
ACRI
Konstantinos Zagoris, Ioannis Pratikakis
2011 ed.
3DOR@Eurographics
Hamid Laga, Tobias Schreck, Alfredo Ferreira, Afzal Godil, Ioannis Pratikakis, Remco C. Veltkamp
2011 J jnl
Int. J. Document Anal. Recognit.
Anastasios L. Kesidis, Eleni Galiotou, Basilios Gatos, Ioannis Pratikakis
2011 A conf
ICDAR
Konstantinos Ntirogiannis, Basilios Gatos, Ioannis Pratikakis
2011 conf
3DOR@Eurographics
Konstantinos Sfikas, Ioannis Pratikakis, Theoharis Theoharis
2011 J jnl
Int. J. Document Anal. Recognit.
Basilios Gatos, Konstantinos Ntirogiannis, Ioannis Pratikakis
2011 J jnl
Comput. Graph. Forum
Hamid Laga, Tobias Schreck, Alfredo Ferreira, Afzal Godil, Ioannis Pratikakis, Remco C. Veltkamp
2011 J jnl
IEEE Trans. Image Process.
Nikolaos Stamatopoulos, Basilios Gatos, Ioannis Pratikakis, Stavros J. Perantonis
2011 A conf
ICDAR
Ioannis Pratikakis, Basilios Gatos, Konstantinos Ntirogiannis
2011 J jnl
Vis. Comput.
Ioannis Pratikakis, Tobias Schreck, Theoharis Theoharis, Remco C. Veltkamp
2011 J jnl
Int. J. Comput. Vis.
Konstantinos Sfikas, Theoharis Theoharis, Ioannis Pratikakis
2011 ch.
Knowledge-Driven Multimedia Information Extraction and Ontology Evolution
Ioannis Pratikakis, Anastasia Bolovinou, Basilios Gatos, Stavros J. Perantonis
2010 J jnl
Vis. Comput.
Alexander Agathos, Ioannis Pratikakis, Panagiotis Papadakis, Stavros J. Perantonis, Phillip N. Azariadis, Nickolas S. Sapidis
2010 ed.
3DOR@Eurographics
Mohamed Daoudi, Tobias Schreck, Michela Spagnuolo, Ioannis Pratikakis, Remco C. Veltkamp, Theoharis Theoharis
2010 J jnl
Image Vis. Comput.
Marios Anthimopoulos, Basilios Gatos, Ioannis Pratikakis
2010 B conf
ICFHR
Ioannis Pratikakis, Basilios Gatos, Konstantinos Ntirogiannis
2010 J jnl
Int. J. Comput. Vis.
Theoharis Theoharis, Ioannis Pratikakis, Michela Spagnuolo
2010 J jnl
Int. J. Comput. Vis.
Panagiotis Papadakis, Ioannis Pratikakis, Theoharis Theoharis, Stavros J. Perantonis
2010 J jnl
Vis. Comput.
Ioannis Pratikakis, Michela Spagnuolo, Theoharis Theoharis, Remco C. Veltkamp
2010 J jnl
Vis. Comput.
Alexander Agathos, Ioannis Pratikakis, Stavros J. Perantonis, Nickolas S. Sapidis
2009 ed.
3DOR@Eurographics
Michela Spagnuolo, Ioannis Pratikakis, Remco C. Veltkamp, Theoharis Theoharis
2009 A conf
ICDAR
Nikolaos Stamatopoulos, Basilios Gatos, Ioannis Pratikakis
2009 A conf
ICDAR
Konstantinos Ntirogiannis, Basilios Gatos, Ioannis Pratikakis
2009 conf
AND
Anastasios L. Kesidis, Eleni Galiotou, Basilios Gatos, Aristomenis S. Lampropoulos, Ioannis Pratikakis, Ioanna Manolessou, Angela Ralli
2009 A conf
ICDAR
Basilios Gatos, Konstantinos Ntirogiannis, Ioannis Pratikakis
2009 conf
3DOR@Eurographics
Alexander Agathos, Ioannis Pratikakis, Panagiotis Papadakis, Stavros J. Perantonis, Phillip N. Azariadis, Nickolas S. Sapidis
2009 J jnl
Int. J. Comput. Vis.
Iris Vanhamel, Cosmin Mihai, Hichem Sahli, Antonis Katartzis, Ioannis Pratikakis
2009 A conf
ICDAR
Basilios Gatos, Ioannis Pratikakis
2009 J jnl
Pattern Recognit.
Georgios Louloudis, Basilios Gatos, Ioannis Pratikakis, Constantin Halatsis
2008 conf
3DOR@Eurographics
Panagiotis Papadakis, Ioannis Pratikakis, Theoharis Theoharis, Georgios Passalis, Stavros J. Perantonis
2008 B conf
Document Analysis Systems
Marios Anthimopoulos, Basilios Gatos, Ioannis Pratikakis
2008 B conf
Document Analysis Systems
Nikolaos Stamatopoulos, Basilios Gatos, Ioannis Pratikakis, Stavros J. Perantonis
2008 B conf
Document Analysis Systems
Konstantinos Ntirogiannis, Basilios Gatos, Ioannis Pratikakis
2008 conf
DIMEA
Panagiotis Papadakis, Ioannis Pratikakis, Stavros J. Perantonis, Theoharis Theoharis
2008 B conf
Document Analysis Systems
Basilios Gatos, Ioannis Pratikakis, Stavros J. Perantonis
2008 B conf
ICPR
Basilios Gatos, Ioannis Pratikakis, Stavros J. Perantonis
2008 conf
Shape Modeling International
Panagiotis Papadakis, Ioannis Pratikakis, Stavros J. Perantonis, Theoharis Theoharis, Georgios Passalis
2008 J jnl
Pattern Recognit.
Georgios Louloudis, Basilios Gatos, Ioannis Pratikakis, Constantin Halatsis
2007 J jnl
Int. J. Document Anal. Recognit.
Kostas Ntzios, Basilios Gatos, Ioannis Pratikakis, Thomas Konidaris, Stavros J. Perantonis
2007 J jnl
Pattern Recognit.
Panagiotis Papadakis, Ioannis Pratikakis, Stavros J. Perantonis, Theoharis Theoharis
2007 J jnl
Int. J. Document Anal. Recognit.
Thomas Konidaris, Basilios Gatos, Kostas Ntzios, Ioannis Pratikakis, Sergios Theodoridis, Stavros J. Perantonis
2007 conf
VISAPP (2)
Marios Anthimopoulos, Basilios Gatos, Ioannis Pratikakis
2007 conf
SSVM
Cosmin Mihai, Iris Vanhamel, Hichem Sahli, Antonis Katartzis, Ioannis Pratikakis
2007 A conf
ICDAR
Basilios Gatos, Ioannis Pratikakis, Konstantinos Ntirogiannis
2007 conf
WEBIST (3)
Ioannis Pratikakis, Vassilis Virvilis, Dimitrios I. Kosmopoulos, Stavros J. Perantonis, A. Damianakis, D. Tsatsos
2006 conf
SETN
Basilios Gatos, Thomas Konidaris, Ioannis Pratikakis, Stavros J. Perantonis
2006 J jnl
Pattern Recognit.
Basilios Gatos, Ioannis Pratikakis, Stavros J. Perantonis
2006 J jnl
Pattern Anal. Appl.
Basilios Gatos, Kostas Ntzios, Ioannis Pratikakis, Sergios Petridis, Thomas Konidaris, Stavros J. Perantonis
2006 conf
ICPR (2)
Basilios Gatos, Ioannis Pratikakis, Stavros J. Perantonis
2006 conf
TRECVID
Ioannis Pratikakis, I. Dounis, Basilios Gatos, Stavros J. Perantonis
2006 Misc conf
AIAI
Dimitrios I. Kosmopoulos, Sergios Petridis, Ioannis Pratikakis, V. Gatos, Stavros J. Perantonis, Vangelis Karkaletsis, Georgios Paliouras
2006 B conf
ICIP
Iris Vanhamel, Ioannis Pratikakis, Hichem Sahli
2006 conf
ICPR (2)
Iris Vanhamel, Hichem Sahli, Ioannis Pratikakis
2005 A conf
ICDAR
Basilios Gatos, Thomas Konidaris, Kostas Ntzios, Ioannis Pratikakis, Stavros J. Perantonis
2005 A conf
ICDAR
Kostas Ntzios, Basilios Gatos, Ioannis Pratikakis, Thomas Konidaris, Stavros J. Perantonis
2005 conf
ICAPR (1)
Basilios Gatos, Dimitrios Danatsas, Ioannis Pratikakis, Stavros J. Perantonis
2005 C conf
ISMM
Ioannis Pratikakis, Iris Vanhamel, Hichem Sahli, Basilios Gatos, Stavros J. Perantonis
2004 B conf
Document Analysis Systems
Basilios Gatos, Kostas Ntzios, Ioannis Pratikakis, Sergios Petridis, Thomas Konidaris, Stavros J. Perantonis
2004 B conf
Document Analysis Systems
Basilios Gatos, Ioannis Pratikakis, Stavros J. Perantonis
2004 conf
SETN
Basilios Gatos, Ioannis Pratikakis, Stavros J. Perantonis
2004 conf
EWIMT
Ioannis Pratikakis, Z. Efremedis, Basilios Gatos, Stavros J. Perantonis, Iris Vanhamel, Hichem Sahli
2003 J jnl
IEEE Trans. Image Process.
Iris Vanhamel, Ioannis Pratikakis, Hichem Sahli
2003 J jnl
Int. J. Image Graph.
Ioannis Pratikakis, Christian Barillot, Pierre Hellier, Étienne Mémin
2001 conf
Scale-Space
Iris Vanhamel, Ioannis Pratikakis, Hichem Sahli
2001 conf
Scale-Space
Ioannis Pratikakis, Christian Barillot, Pierre Hellier
2000 C conf
ISMM
Iris Vanhamel, Hichem Sahli, Ioannis Pratikakis
2000 J jnl
Pattern Anal. Appl.
Kui Zhang, Ioannis Pratikakis, Jan Cornelis, Edgard Nyssen
1999 J jnl
Signal Process.
Ioannis Pratikakis, Hichem Sahli, Jan Cornelis
1996 J jnl
Image Vis. Comput.
Xin Yang, Bart Truyen, Ioannis Pratikakis, Jan Cornelis
1996 C conf
ISMM
Ioannis Pratikakis, Hichem Sahli, Jan Cornelis
tests/unit/test_apk_strings_ioc.py
← Index tests/unit/test_apk_strings_ioc.py python
"""Tests for APK string extraction and IOC extraction integration.

Covers:
- APKCodeAnalyzer._extract_strings() — string extraction from DEX objects
- APKCodeAnalyzer._string_entropy() — Shannon entropy computation
- DecompileAPK strings export table schema
- IOCExtractorFromResults with APK-format analysis_results
- Worker IOC wiring for APK
"""
import os
import tempfile
from dataclasses import asdict
from unittest.mock import MagicMock, patch

import pytest

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

pytestmark = [pytest.mark.unit, pytest.mark.apk]


# ---------------------------------------------------------------------------
# Helpers
# ---------------------------------------------------------------------------

def _make_analyzer(min_instructions=1):
    """Create an APKCodeAnalyzer with mocked dependencies."""
    with patch(
        "redb.extractors.decompiler.apk.analyzer.JADXDecompiler"
    ), patch(
        "redb.extractors.decompiler.apk.analyzer.ApktoolDisassembler"
    ):
        from redb.extractors.decompiler.apk.analyzer import APKCodeAnalyzer
        analyzer = APKCodeAnalyzer("/fake/path.apk")
        analyzer.min_instructions = min_instructions
        return analyzer


def _make_mock_dex(strings):
    """Create a mock DEX object that returns the given strings."""
    dex = MagicMock()
    dex.get_strings.return_value = strings
    return dex


def _create_fake_apk_file():
    """Create a temporary file to act as a fake APK."""
    fd, path = tempfile.mkstemp(suffix=".apk")
    os.write(fd, b"PK\x03\x04fake apk content for hashing")
    os.close(fd)
    return path


# ---------------------------------------------------------------------------
# Tests: _string_entropy
# ---------------------------------------------------------------------------

class TestStringEntropy:
    """Tests for Shannon entropy computation."""

    def test_empty_string(self):
        analyzer = _make_analyzer()
        assert analyzer._string_entropy("") == 0.0

    def test_single_char(self):
        analyzer = _make_analyzer()
        assert analyzer._string_entropy("a") == 0.0

    def test_repeated_char(self):
        analyzer = _make_analyzer()
        assert analyzer._string_entropy("aaaa") == 0.0

    def test_two_equal_chars(self):
        analyzer = _make_analyzer()
        # "ab" -> entropy = 1.0
        assert abs(analyzer._string_entropy("ab") - 1.0) < 0.01

    def test_higher_entropy(self):
        analyzer = _make_analyzer()
        # More variety = higher entropy
        low = analyzer._string_entropy("aabb")
        high = analyzer._string_entropy("abcd")
        assert high > low

    def test_url_string_entropy(self):
        analyzer = _make_analyzer()
        entropy = analyzer._string_entropy("https://evil.com/payload")
        assert entropy > 2.0  # URLs have moderate entropy


# ---------------------------------------------------------------------------
# Tests: _extract_strings
# ---------------------------------------------------------------------------

class TestExtractStrings:
    """Tests for DEX string extraction."""

    def test_basic_extraction(self):
        analyzer = _make_analyzer()
        dex = _make_mock_dex(["hello", "world"])
        result = analyzer._extract_strings([dex])

        assert len(result) == 2
        assert result[0]["string"] == "hello"
        assert result[1]["string"] == "world"

    def test_string_fields_present(self):
        analyzer = _make_analyzer()
        dex = _make_mock_dex(["test_string"])
        result = analyzer._extract_strings([dex])

        entry = result[0]
        assert "string" in entry
        assert "string_encoding" in entry
        assert "string_offset" in entry
        assert "string_length" in entry
        assert "string_entropy" in entry
        assert entry["string_encoding"] == "UTF8"
        assert entry["string_length"] == len("test_string")

    def test_deduplication_across_dex(self):
        """Same string in multiple DEX files is only extracted once."""
        analyzer = _make_analyzer()
        dex1 = _make_mock_dex(["shared", "unique1"])
        dex2 = _make_mock_dex(["shared", "unique2"])
        result = analyzer._extract_strings([dex1, dex2])

        string_values = [s["string"] for s in result]
        assert string_values.count("shared") == 1
        assert "unique1" in string_values
        assert "unique2" in string_values
        assert len(result) == 3

    def test_empty_strings_filtered(self):
        analyzer = _make_analyzer()
        dex = _make_mock_dex(["", "valid", None, "also_valid"])
        result = analyzer._extract_strings([dex])

        string_values = [s["string"] for s in result]
        assert "" not in string_values
        assert None not in string_values
        assert "valid" in string_values
        assert "also_valid" in string_values

    def test_no_dex_files(self):
        analyzer = _make_analyzer()
        result = analyzer._extract_strings([])
        assert result == []

    def test_dex_get_strings_returns_none(self):
        analyzer = _make_analyzer()
        dex = MagicMock()
        dex.get_strings.return_value = None
        result = analyzer._extract_strings([dex])
        assert result == []

    def test_dex_get_strings_exception(self):
        analyzer = _make_analyzer()
        dex = MagicMock()
        dex.get_strings.side_effect = RuntimeError("corrupt DEX")
        result = analyzer._extract_strings([dex])
        assert result == []

    def test_entropy_computed(self):
        analyzer = _make_analyzer()
        dex = _make_mock_dex(["abcdefgh"])
        result = analyzer._extract_strings([dex])
        assert result[0]["string_entropy"] > 0.0

    def test_incremental_offsets(self):
        """String offsets are incremented sequentially."""
        analyzer = _make_analyzer()
        dex = _make_mock_dex(["a", "b", "c"])
        result = analyzer._extract_strings([dex])

        offsets = [s["string_offset"] for s in result]
        assert offsets == [0, 1, 2]

    def test_url_strings_preserved(self):
        """URL strings are extracted without modification."""
        analyzer = _make_analyzer()
        dex = _make_mock_dex([
            "https://evil.com/payload",
            "http://c2.malware.org/gate",
        ])
        result = analyzer._extract_strings([dex])
        strings = [s["string"] for s in result]
        assert "https://evil.com/payload" in strings
        assert "http://c2.malware.org/gate" in strings


# ---------------------------------------------------------------------------
# Tests: strings in extract() integration
# ---------------------------------------------------------------------------

class TestExtractStringsIntegration:
    """Tests that strings are included in extract() results."""

    @patch("redb.extractors.decompiler.apk.analyzer.APKCodeAnalyzer._run_androguard")
    @patch("redb.extractors.decompiler.apk.analyzer.ApktoolDisassembler")
    @patch("redb.extractors.decompiler.apk.analyzer.JADXDecompiler")
    def test_extract_includes_strings(self, mock_jadx, mock_apktool, mock_androguard):
        from redb.extractors.decompiler.apk.analyzer import APKCodeAnalyzer

        mock_dex = _make_mock_dex(["hello", "world"])
        mock_analysis = MagicMock()
        mock_analysis.get_methods.return_value = []
        mock_androguard.return_value = (MagicMock(), [mock_dex], mock_analysis)

        analyzer = APKCodeAnalyzer("/fake/path.apk", log=MagicMock())
        results = analyzer.extract()

        assert "strings" in results
        assert len(results["strings"]) == 2
        assert results["strings"][0]["string"] == "hello"
        analyzer.cleanup()

    @patch("redb.extractors.decompiler.apk.analyzer.APKCodeAnalyzer._run_androguard")
    @patch("redb.extractors.decompiler.apk.analyzer.ApktoolDisassembler")
    @patch("redb.extractors.decompiler.apk.analyzer.JADXDecompiler")
    def test_extract_strings_error_is_non_fatal(self, mock_jadx, mock_apktool, mock_androguard):
        from redb.extractors.decompiler.apk.analyzer import APKCodeAnalyzer

        # Return a bad dex list that will cause _extract_strings to fail
        mock_analysis = MagicMock()
        mock_analysis.get_methods.return_value = []
        # dexs is not iterable — triggers the except block
        mock_androguard.return_value = (MagicMock(), 42, mock_analysis)

        analyzer = APKCodeAnalyzer("/fake/path.apk", log=MagicMock())
        results = analyzer.extract()

        # Should not crash, strings should be empty, error recorded
        assert results["strings"] == []
        assert any(
            e.get("error_location") == "strings"
            for e in results["analysis_errors"]
        )
        analyzer.cleanup()


# ---------------------------------------------------------------------------
# Tests: DecompileAPK strings export table
# ---------------------------------------------------------------------------

class TestDecompileAPKStringsExport:
    """Tests for strings table in DecompileAPK.prepare_export_data()."""

    def _make_extractor_with_strings(self, strings_data):
        from redb.extractors.decompiler.DecompileAPK import DecompileAPK
        apk_path = _create_fake_apk_file()
        ext = DecompileAPK(apk_path, MagicMock())
        ext.analysis_results = {
            "sha256": "a" * 64,
            "sha1": "b" * 40,
            "md5": "c" * 32,
            "decompiled_content": [],
            "decompiled_refs": [],
            "smali_content": [],
            "smali_refs": [],
            "similarity_metrics": [],
            "strings": strings_data,
            "analysis_errors": [],
        }
        return ext, apk_path

    def test_strings_table_present(self):
        ext, path = self._make_extractor_with_strings([
            {"string": "hello", "string_encoding": "UTF8",
             "string_offset": 0, "string_length": 5, "string_entropy": 2.32}
        ])
        try:
            export = ext.prepare_export_data("ClickHouseExporter")
            assert "strings_raw" in export
        finally:
            os.unlink(path)

    def test_strings_table_schema(self):
        ext, path = self._make_extractor_with_strings([
            {"string": "hello", "string_encoding": "UTF8",
             "string_offset": 0, "string_length": 5, "string_entropy": 2.32}
        ])
        try:
            export = ext.prepare_export_data("ClickHouseExporter")
            sr = export["strings_raw"]
            assert sr["table"] == "code_binja_strings_raw"
            assert len(sr["column_names"]) == 8
            assert len(sr["column_type_names"]) == 8
            assert "sha256" in sr["column_names"]
            assert "string" in sr["column_names"]
            assert "string_raw" in sr["column_names"]
            assert "string_encoding" in sr["column_names"]
            assert "string_offset" in sr["column_names"]
            assert "string_length" in sr["column_names"]
            assert "string_raw_length" in sr["column_names"]
            assert "string_entropy" in sr["column_names"]
            assert len(sr["data"]) == 1
            assert len(sr["data"][0]) == 8
        finally:
            os.unlink(path)

    def test_strings_sha256_propagated(self):
        ext, path = self._make_extractor_with_strings([
            {"string": "test", "string_encoding": "UTF8",
             "string_offset": 0, "string_length": 4, "string_entropy": 2.0}
        ])
        try:
            export = ext.prepare_export_data("ClickHouseExporter")
            row = export["strings_raw"]["data"][0]
            assert row[0] == "a" * 64  # sha256 is first column
        finally:
            os.unlink(path)

    def test_empty_strings_not_exported(self):
        ext, path = self._make_extractor_with_strings([])
        try:
            export = ext.prepare_export_data("ClickHouseExporter")
            assert "strings_raw" not in export
        finally:
            os.unlink(path)


# ---------------------------------------------------------------------------
# Tests: IOCExtractorFromResults with APK format
# ---------------------------------------------------------------------------

class TestIOCExtractorAPKFormat:
    """Tests that IOCExtractorFromResults handles APK analysis_results."""

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

    def test_extract_iocs_from_apk_strings(self):
        """IOCs extracted from APK strings (same format as Binja)."""
        results = {
            "strings": [
                {"string": "https://evil.com/payload", "string_offset": 0},
                {"string": "Contact [email protected]", "string_offset": 1},
            ],
            "decompiled": [],
            "decompiled_content": [],
        }
        extractor = IOCExtractorFromResults(results, sha256="a" * 64, log=self.log)
        iocs = extractor.extract()

        url_iocs = [i for i in iocs if i.ioc_type == IOCType.URL]
        assert len(url_iocs) >= 1
        assert any("evil.com" in i.ioc_value for i in url_iocs)

    def test_extract_iocs_from_apk_decompiled_content(self):
        """IOCs extracted from APK's decompiled_content key."""
        results = {
            "strings": [],
            "decompiled": [],  # Binja format — empty
            "decompiled_content": [  # APK format
                {
                    "decompiled_method": "connect('https://c2.malware.org/gate');",
                    "decompiled_method_hash": "hash123",
                    "method_type": "USER",
                }
            ],
        }
        extractor = IOCExtractorFromResults(results, sha256="a" * 64, log=self.log)
        iocs = extractor.extract()

        url_iocs = [i for i in iocs if i.ioc_type == IOCType.URL]
        assert len(url_iocs) >= 1

    def test_apk_library_methods_skipped(self):
        """LIBRARY methods in decompiled_content are skipped."""
        results = {
            "strings": [],
            "decompiled": [],
            "decompiled_content": [
                {
                    "decompiled_method": "https://should-skip.com",
                    "decompiled_method_hash": "lib_hash",
                    "method_type": "LIBRARY",
                }
            ],
        }
        extractor = IOCExtractorFromResults(results, sha256="a" * 64, log=self.log)
        iocs = extractor.extract()
        assert len(iocs) == 0

    def test_combined_binja_and_apk_sources(self):
        """Both Binja and APK format decompiled entries are processed."""
        results = {
            "strings": [],
            "decompiled": [
                {
                    "decompiled_function": "call('https://binja.example.com');",
                    "decompiled_function_hash": "binja_hash",
                    "function_type": "USER",
                }
            ],
            "decompiled_content": [
                {
                    "decompiled_method": "send('https://apk.example.com');",
                    "decompiled_method_hash": "apk_hash",
                    "method_type": "USER",
                }
            ],
        }
        extractor = IOCExtractorFromResults(results, sha256="a" * 64, log=self.log)
        iocs = extractor.extract()

        url_iocs = [i for i in iocs if i.ioc_type == IOCType.URL]
        urls = [i.ioc_value for i in url_iocs]
        assert any("binja.example.com" in u for u in urls)
        assert any("apk.example.com" in u for u in urls)

    def test_apk_results_only(self):
        """Works when only APK keys are present (no 'decompiled' key)."""
        results = {
            "strings": [
                {"string": "https://evil.com", "string_offset": 0},
            ],
            "decompiled_content": [
                {
                    "decompiled_method": "x = 1",
                    "decompiled_method_hash": "h",
                    "method_type": "USER",
                }
            ],
        }
        extractor = IOCExtractorFromResults(results, sha256="a" * 64, log=self.log)
        iocs = extractor.extract()
        # Should not crash, and should find URL from strings
        url_iocs = [i for i in iocs if i.ioc_type == IOCType.URL]
        assert len(url_iocs) >= 1

    def test_source_type_is_string_for_strings(self):
        results = {
            "strings": [
                {"string": "https://evil.com/test", "string_offset": 42},
            ],
            "decompiled_content": [],
        }
        extractor = IOCExtractorFromResults(results, sha256="a" * 64, log=self.log)
        iocs = extractor.extract()
        url_iocs = [i for i in iocs if i.ioc_type == IOCType.URL]
        assert url_iocs[0].source_type == SourceType.STRING
        assert url_iocs[0].source_identifier == "42"

    def test_source_type_is_decompiled_for_methods(self):
        results = {
            "strings": [],
            "decompiled_content": [
                {
                    "decompiled_method": "https://evil.com/method",
                    "decompiled_method_hash": "myhash",
                    "method_type": "USER",
                }
            ],
        }
        extractor = IOCExtractorFromResults(results, sha256="a" * 64, log=self.log)
        iocs = extractor.extract()
        url_iocs = [i for i in iocs if i.ioc_type == IOCType.URL]
        assert url_iocs[0].source_type == SourceType.DECOMPILED_FUNCTION
        assert url_iocs[0].source_identifier == "myhash"


# ---------------------------------------------------------------------------
# Tests: Worker IOC wiring for APK
# ---------------------------------------------------------------------------

class TestWorkerAPKIOCWiring:
    """Tests that workers.py wires IOC extraction for APK."""

    def test_worker_source_contains_ioc_for_apk(self):
        """Verify workers.py source has IOC extraction in APK branch."""
        import inspect
        from redb import workers
        source = inspect.getsource(workers)
        # APK branch should import IOCExtractorFromResults
        assert "IOCExtractorFromResults" in source
        # Should be in the APK section (near DecompileAPK)
        apk_section = source[source.index("DecompileAPK("):]
        ioc_pos = apk_section.find("IOCExtractorFromResults")
        assert ioc_pos != -1, "IOCExtractorFromResults not found after DecompileAPK"