Nectarios Koziris

288 papers A* 9A 27B 33C 22Misc 9Journal 73Unranked 115
YearRankTypeTitle / Venue / Authors
2026 B conf
ICPE
Konstantinos Papazafeiropoulos, Anastasia Mallikopoulou, Anastassios Nanos, Georgios I. Goumas, Nectarios Koziris
2026 A conf
EuroSys
Orestis Lagkas Nikolos, Chloe Alverti, Stratos Psomadakis, Georgios I. Goumas, Nectarios Koziris
2025 J jnl
Future Internet
Theodore Andronikos, Constantinos Bitsakos, Konstantinos Nikas, Georgios I. Goumas, Nectarios Koziris
2025 J jnl
CoRR
Theodore Andronikos, Constantinos Bitsakos, Konstantinos Nikas, Georgios I. Goumas, Nectarios Koziris
2025 J jnl
IEEE Access
Nikodimos Provatas, Ioannis Konstantinou, Nectarios Koziris
2025 J jnl
IEEE Access
Evdokia Kassela, Ioannis Konstantinou, Nectarios Koziris
2025 conf
IPDPS (Workshops)
Ioanna Tasou, Petros Anastasiadis, Panagiotis Mpakos, Dimitrios Galanopoulos, Nectarios Koziris, Georgios I. Goumas
2025 A conf
ICS
Dimitrios Galanopoulos, Panagiotis Mpakos, Petros Anastasiadis, Nectarios Koziris, Georgios I. Goumas
2025 conf
DEXA (1)
Constantinos Bitsakos, Dimitrios Tsoumakos, Ioannis Konstantinou, Nectarios Koziris
2025 C conf
JSSPP
Efstratios Karapanagiotis, Nikolaos Triantafyllis, Athanasios Tsoukleidis-Karydakis, Georgios I. Goumas, Nectarios Koziris
2025 A* conf
ISCA
Panagiotis Miliadis, Dimitris Theodoropoulos, Nectarios Koziris, Dionisios N. Pnevmatikatos
2025 C conf
JSSPP
Athanasios Tsoukleidis-Karydakis, Efstratios Karapanagiotis, Nikolaos Triantafyllis, Nectarios Koziris, Georgios I. Goumas
2025 J jnl
Comput.
Theodore Andronikos, Constantinos Bitsakos, Konstantinos Nikas, Georgios I. Goumas, Nectarios Koziris
2025 J jnl
CoRR
Theodore Andronikos, Constantinos Bitsakos, Konstantinos Nikas, Georgios I. Goumas, Nectarios Koziris
2025 B conf
EDBT
Giorgos Alexiou, George Papastefanatos, Vassilis Stamatopoulos, Georgia Koutrika, Nectarios Koziris
2025 conf
SESAME@EuroSys
Orestis Lagkas Nikolos, Chloe Alverti, Stratos Psomadakis, Georgios I. Goumas, Nectarios Koziris
2025 conf
HotStorage
Stratos Psomadakis, Dimitrios Siakavaras, Chloe Alverti, Symeon Porgiotis, Orestis Lagkas Nikolos, Christos Katsakioris, Konstantinos Nikas, Georgios I. Goumas, Nectarios Koziris
2025 J jnl
CoRR
Ioanna Tasou, Panagiotis Mpakos, Angelos Vlachos, Dionysios Adamopoulos, Georgios Giannakopoulos, Konstantinos Katsikopoulos, Ioannis Karaparisis, Maria Lazou, Spyridon Loukovitis, Areti Mei, Anastasia Poulopoulou, Angeliki Dimitriou, Giorgos Filandrianos, Dimitrios Galanopoulos, Vasileios Karampinis, Ilias Mitsouras, Nikolaos Spanos, Petros Anastasiadis, Ioannis Doudalis, Konstantinos Nikas, George Retsinas, Paraskevi K. Tzouveli, Christina Giannoula, Nectarios Koziris, Nikela Papadopoulou, Giorgos Stamou, Athanasios Voulodimos, Georgios I. Goumas
2025 J jnl
IEEE Access
Nikodimos Provatas, Iasonas Chalas, Ioannis Konstantinou, Nectarios Koziris
2024 conf
PerCom Workshops
Aris Spyrou, Ioannis Konstantinou, Nectarios Koziris
2024 J jnl
ACM Trans. Archit. Code Optim.
Panagiotis Miliadis, Dimitris Theodoropoulos, Dionisios N. Pnevmatikatos, Nectarios Koziris
2024 J jnl
CoRR
Nikolaos-Charalampos Papadopoulos, Stratos Psomadakis, Vasileios Karakostas, Nectarios Koziris, Dionisios N. Pnevmatikatos
2024 A* conf
MICRO
Stratos Psomadakis, Chloe Alverti, Vasileios Karakostas, Christos Katsakioris, Dimitrios Siakavaras, Konstantinos Nikas, Georgios I. Goumas, Nectarios Koziris
2024 A conf
HPDC
Christos Katsakioris, Chloe Alverti, Konstantinos Nikas, Dimitrios Siakavaras, Stratos Psomadakis, Nectarios Koziris
2024 J jnl
CoRR
Orestis Lagkas Nikolos, Chloe Alverti, Stratos Psomadakis, Georgios I. Goumas, Nectarios Koziris
2024 J jnl
IEEE Access
Nikolaos Chalvantzis, Aristotelis Vontzalidis, Evdokia Kassela, Aris Spyrou, Nikolaos Nikitas, Nikodimos Provatas, Ioannis Konstantinou, Nectarios Koziris
2024 conf
ARC
Panagiotis Mpakos, Ioanna Tasou, Chloe Alverti, Panagiotis Miliadis, Pavlos Malakonakis, Dimitris Theodoropoulos, Georgios I. Goumas, Dionisios N. Pnevmatikatos, Nectarios Koziris
2024 conf
ALGOCLOUD
Spiros Grigoratos, Katerina Doka, Nectarios Koziris
2024 C conf
ICBC
Spiros Grigoratos, Katerina Doka, Nectarios Koziris
2024 conf
ALGOCLOUD
Constantinos Bitsakos, Konstantinos Nikas, Nectarios Koziris
2024 conf
Euro-Par Workshops (2)
Dimitrios Giannopoulos, Dimitrios Siakavaras, Georgios I. Goumas, Nectarios Koziris
2024 J jnl
CoRR
Christina Giannoula, Foteini Strati, Dimitrios Siakavaras, Georgios I. Goumas, Nectarios Koziris
2024 C conf
CLUSTER
Petros Anastasiadis, Nikela Papadopoulou, Nectarios Koziris, Georgios I. Goumas
2023 J jnl
CoRR
Christina Giannoula, Kailong Huang, Jonathan Tang, Nectarios Koziris, Georgios I. Goumas, Zeshan Chishti, Nandita Vijaykumar
2023 conf
SIGMETRICS (Abstracts)
Christina Giannoula, Kailong Huang, Jonathan Tang, Nectarios Koziris, Georgios I. Goumas, Zeshan Chishti, Nandita Vijaykumar
2023 J jnl
CoRR
Christina Giannoula, Kailong Huang, Jonathan Tang, Nectarios Koziris, Georgios I. Goumas, Zeshan Chishti, Nandita Vijaykumar
2023 J jnl
Proc. ACM Meas. Anal. Comput. Syst.
Christina Giannoula, Kailong Huang, Jonathan Tang, Nectarios Koziris, Georgios I. Goumas, Zeshan Chishti, Nandita Vijaykumar
2023 B conf
CLOUD
Miltiadis Chrysopoulos, Ioannis Konstantinou, Nectarios Koziris
2023 conf
SESAME@EuroSys
Christos Katsakioris, Chloe Alverti, Konstantinos Nikas, Stratos Psomadakis, Vasileios Karakostas, Nectarios Koziris
2023 A conf
IPDPS
Panagiotis Mpakos, Dimitrios Galanopoulos, Petros Anastasiadis, Nikela Papadopoulou, Nectarios Koziris, Georgios I. Goumas
2023 J jnl
CoRR
Panagiotis Mpakos, Dimitrios Galanopoulos, Petros Anastasiadis, Nikela Papadopoulou, Nectarios Koziris, Georgios I. Goumas
2023 C conf
ICBC
Charalampos Kleitsikas, Katerina Doka, Agis Politis, Nectarios Koziris
2023 J jnl
J. Supercomput.
Christina Giannoula, Athanasios Peppas, Georgios I. Goumas, Nectarios Koziris
2023 conf
IPDPS Workshops
Dimitrios Galanopoulos, Panagiotis Mpakos, Petros Anastasiadis, Nectarios Koziris, Georgios I. Goumas
2023 J jnl
ACM Trans. Archit. Code Optim.
Petros Anastasiadis, Nikela Papadopoulou, Georgios I. Goumas, Nectarios Koziris, Dennis Hoppe, Li Zhong
2023 conf
ALGOCLOUD
Marianna Tzortzi, Charalampos Kleitsikas, Agis Politis, Sotirios Niarchos, Katerina Doka, Nectarios Koziris
2022 B conf
CCGRID
Orestis Lagkas Nikolos, Georgios I. Goumas, Nectarios Koziris
2022 J jnl
Proc. VLDB Endow.
Maria Xekalaki, Juan Fumero, Athanasios Stratikopoulos, Katerina Doka, Christos Katsakioris, Constantinos Bitsakos, Nectarios Koziris, Christos Kotselidis
2022 Misc conf
SYSTOR
Christos Katsakioris, Chloe Alverti, Vasileios Karakostas, Konstantinos Nikas, Georgios I. Goumas, Nectarios Koziris
2022 J jnl
CoRR
Giorgos Alexiou, George Papastefanatos, Vassilis Stamatopoulos, Georgia Koutrika, Nectarios Koziris
2022 conf
ISVLSI
Christina Giannoula, Ivan Fernandez, Juan Gómez-Luna, Nectarios Koziris, Georgios I. Goumas, Onur Mutlu
2022 J jnl
Proc. ACM Meas. Anal. Comput. Syst.
Christina Giannoula, Ivan Fernandez, Juan Gómez-Luna, Nectarios Koziris, Georgios I. Goumas, Onur Mutlu
2022 J jnl
CoRR
Christina Giannoula, Ivan Fernandez, Juan Gómez-Luna, Nectarios Koziris, Georgios I. Goumas, Onur Mutlu
2022 conf
SIGMETRICS (Abstracts)
Christina Giannoula, Ivan Fernandez, Juan Gómez-Luna, Nectarios Koziris, Georgios I. Goumas, Onur Mutlu
2022 J jnl
CoRR
Christina Giannoula, Ivan Fernandez, Juan Gómez-Luna, Nectarios Koziris, Georgios I. Goumas, Onur Mutlu
2022 conf
ARC
Panagiotis Miliadis, Dimitris Theodoropoulos, Dionisios N. Pnevmatikatos, Nectarios Koziris
2021 B conf
CLOUD
Asterios Tsiourvas, Constantinos Bitsakos, Ioannis Konstantinou, Dimitris Fotakis, Nectarios Koziris
2021 conf
IEEE BigData
Andreas Krisilias, Nikodimos Provatas, Nectarios Koziris, Ioannis Konstantinou
2021 conf
IEEE BigData
Nikolaos Nikitas, Ioannis Konstantinou, Vana Kalogeraki, Nectarios Koziris
2021 A* conf
ICDE
Alyzia Konsta, Ioannis Mytilinis, Katerina Doka, Sotiris Niarchos, Nectarios Koziris
2021 B conf
ISPASS
Petros Anastasiadis, Nikela Papadopoulou, Georgios I. Goumas, Nectarios Koziris
2021 conf
IEEE ICBC
Agis Politis, Katerina Doka, Nectarios Koziris
2021 A* conf
ISCA
Georgios Vavouliotis, Lluc Alvarez, Vasileios Karakostas, Konstantinos Nikas, Nectarios Koziris, Daniel A. Jiménez, Marc Casas
2021 conf
IEEE BigData
Nikodimos Provatas, Ioannis Konstantinou, Nectarios Koziris
2021 J jnl
Concurr. Comput. Pract. Exp.
Dimitrios Siakavaras, Konstantinos Nikas, Georgios I. Goumas, Nectarios Koziris
2021 A* conf
HPCA
Christina Giannoula, Nandita Vijaykumar, Nikela Papadopoulou, Vasileios Karakostas, Ivan Fernandez, Juan Gómez-Luna, Lois Orosa, Nectarios Koziris, Georgios I. Goumas, Onur Mutlu
2021 J jnl
CoRR
Christina Giannoula, Nandita Vijaykumar, Nikela Papadopoulou, Vasileios Karakostas, Ivan Fernandez, Juan Gómez-Luna, Lois Orosa, Nectarios Koziris, Georgios I. Goumas, Onur Mutlu
2021 J jnl
Distributed Parallel Databases
Ioannis Mytilinis, Dimitrios Tsoumakos, Nectarios Koziris
2020 B conf
FPL
Nikolaos Charalampos Papadopoulos, Vasileios Karakostas, Konstantinos Nikas, Nectarios Koziris, Dionisios N. Pnevmatikatos
2020 B conf
SPAA
Dimitrios Siakavaras, Panagiotis Billis, Konstantinos Nikas, Georgios I. Goumas, Nectarios Koziris
2020 J jnl
CoRR
Nikolaos Charalampos Papadopoulos, Vasileios Karakostas, Konstantinos Nikas, Nectarios Koziris, Dionisios N. Pnevmatikatos
2020 A* conf
ISCA
Chloe Alverti, Stratos Psomadakis, Vasileios Karakostas, Jayneel Gandhi, Konstantinos Nikas, Georgios I. Goumas, Nectarios Koziris
2020 A* conf
AAAI
Nikolaos Tziavelis, Ioannis Giannakopoulos, Rune Quist Johansen, Katerina Doka, Nectarios Koziris, Panagiotis Karras
2020 conf
IEEE BigData
Nikodimos Provatas, Evdokia Kassela, Nikolaos Chalvantzis, Anastasios Bakogiannis, Ioannis Giannakopoulos, Nectarios Koziris, Ioannis Konstantinou
2019 conf
Middleware Demos/Posters
Stratos Psomadakis, Stefanos Gerangelos, Dimitrios Siakavaras, Ioannis A. Papadakis, Marina Vemmou, Aspa Skalidi, Vasileios Karakostas, Konstantinos Nikas, Nectarios Koziris, Georgios I. Goumas
2019 conf
CF
Foteini Strati, Christina Giannoula, Dimitrios Siakavaras, Georgios I. Goumas, Nectarios Koziris
2019 conf
SIGMOD Conference
Tasos Bakogiannis, Ioannis Giannakopoulos, Dimitrios Tsoumakos, Nectarios Koziris
2019 B conf
PPoPP
Athena Elafrou, Georgios I. Goumas, Nectarios Koziris
2019 conf
IEEE BigData
Evdokia Kassela, Nikodimos Provatas, Asterios Tsiourvas, Ioannis Konstantinou, Nectarios Koziris
2019 A conf
SC
Athena Elafrou, Georgios I. Goumas, Nectarios Koziris
2019 B conf
ICPP
Konstantinos Nikas, Nikela Papadopoulou, Dimitra Giantsidi, Vasileios Karakostas, Georgios I. Goumas, Nectarios Koziris
2019 J jnl
J. Syst. Softw.
Stefanos Gerangelos, Georgios I. Goumas, Nectarios Koziris
2019 A* conf
NeurIPS
Nikolaos Tziavelis, Ioannis Giannakopoulos, Katerina Doka, Nectarios Koziris, Panagiotis Karras
2019 conf
WOSC@Middleware
Orestis Lagkas Nikolos, Konstantinos Papazafeiropoulos, Stratos Psomadakis, Anastassios Nanos, Nectarios Koziris
2019 conf
IEEE BigData
Evdokia Kassela, Nikodimos Provatas, Ioannis Konstantinou, Avrilia Floratou, Nectarios Koziris
2019 B conf
SSDBM
Ioannis Mytilinis, Dimitrios Tsoumakos, Nectarios Koziris
2019 conf
PARCO
Panagiotis Mpakos, Nikela Papadopoulou, Chloe Alverti, Georgios I. Goumas, Nectarios Koziris
2019 B conf
ICWE
Tasos Bakogiannis, Ioannis Giannakopoulos, Dimitrios Tsoumakos, Nectarios Koziris
2019 J jnl
IEEE Trans. Knowl. Data Eng.
Ioannis Mytilinis, Dimitrios Tsoumakos, Nectarios Koziris
2019 conf
IEEE BigData
Nikodimos Provatas, Ioannis Konstantinou, Nectarios Koziris
2019 conf
IEEE BigData
Evdokia Kassela, Ioannis Konstantinou, Nectarios Koziris
2018 A conf
CIKM
Ioannis Giannakopoulos, Dimitrios Tsoumakos, Nectarios Koziris
2018 J jnl
CoRR
Tasos Bakogiannis, Ioannis Giannakopoulos, Dimitrios Tsoumakos, Nectarios Koziris
2018 J jnl
J. Cloud Comput.
Ioannis Giannakopoulos, Ioannis Konstantinou, Dimitrios Tsoumakos, Nectarios Koziris
2018 C conf
ISC
Christina Giannoula, Georgios I. Goumas, Nectarios Koziris
2018 C conf
CloudCom
Constantinos Bitsakos, Ioannis Konstantinou, Nectarios Koziris
2018 A conf
ICDCS
Fotis Loukidis-Andreou, Ioannis Giannakopoulos, Katerina Doka, Nectarios Koziris
2018 conf
SAMOS
Vasileios Karakostas, Georgios I. Goumas, Ewnetu Bayuh Lakew, Erik Elmroth, Stefanos Gerangelos, Simon Kolberg, Konstantinos Nikas, Stratos Psomadakis, Dimitrios Siakavaras, Petter Svärd, Nectarios Koziris
2018 conf
ICAC
Nikos Zacheilas, Nikolaos Chalvantzis, Ioannis Konstantinou, Vana Kalogeraki, Nectarios Koziris
2018 C conf
CloudCom
Fanourios Arapidis, Vasileios Karakostas, Nikela Papadopoulou, Konstantinos Nikas, Georgios I. Goumas, Nectarios Koziris
2018 C conf
CloudCom
Konstantinos Fertakis, Stefanos Gerangelos, Georgios I. Goumas, Nectarios Koziris
2018 J jnl
ACM Trans. Math. Softw.
Athena Elafrou, Vasileios Karakasis, Theodoros Gkountouvas, Kornilios Kourtis, Georgios I. Goumas, Nectarios Koziris
2018 C conf
CloudCom
Ioannis Mytilinis, Constantinos Bitsakos, Katerina Doka, Ioannis Konstantinou, Nectarios Koziris
2018 B conf
IC2E
Ioannis Giannakopoulos, Dimitrios Tsoumakos, Nectarios Koziris
2018 conf
ISC Workshops
Aimilios Tsalapatis, Stefanos Gerangelos, Stratos Psomadakis, Konstantinos Papazafeiropoulos, Nectarios Koziris
2017 J jnl
CoRR
Ioannis Giannakopoulos, Dimitrios Tsoumakos, Nectarios Koziris
2017 conf
IEEE BigData
Ioannis Giannakopoulos, Dimitrios Tsoumakos, Nectarios Koziris
2017 A conf
ICDCS
Georgios I. Goumas, Konstantinos Nikas, Ewnetu Bayuh Lakew, Christos Kotselidis, Andrew Attwood, Erik Elmroth, Michail Flouris, Nikos Foutris, John Goodacre, Davide Grohmann, Vasileios Karakostas, Panagiotis Koutsourakis, Martin L. Kersten, Mikel Luján, Einar Rustad, John Thomson, Luis Tomás, Atle Vesterkjaer, Jim Webber, Ying Zhang, Nectarios Koziris
2017 B conf
CCGrid
Ioannis Giannakopoulos, Ioannis Konstantinou, Dimitrios Tsoumakos, Nectarios Koziris
2017 A* conf
ICDE
Konstantinos Lolos, Ioannis Konstantinou, Verena Kantere, Nectarios Koziris
2017 conf
ALGOCLOUD
Evangelos Gkolemis, Katerina Doka, Nectarios Koziris
2017 B conf
CCGrid
Nikolaos Chalvantzis, Ioannis Konstantinou, Nectarios Koziris
2017 J jnl
CoRR
Konstantinos Lolos, Ioannis Konstantinou, Verena Kantere, Nectarios Koziris
2017 conf
IEEE BigData
Konstantinos Lolos, Ioannis Konstantinou, Verena Kantere, Nectarios Koziris
2017 conf
ISCRAM-med
Katerina Doka, Ioannis Mytilinis, Ioannis Giannakopoulos, Ioannis Konstantinou, Dimitrios Tsitsigkos, Manolis Terrovitis, Nectarios Koziris
2017 conf
COSH/VisorHPC@HiPEAC
Ioannis A. Papadakis, Konstantinos Nikas, Vasileios Karakostas, Georgios I. Goumas, Nectarios Koziris
2017 A conf
ICDCS
Ioannis Giannakopoulos, Konstantinos Papazafeiropoulos, Katerina Doka, Nectarios Koziris
2017 conf
IPDPS Workshops
Athena Elafrou, Georgios I. Goumas, Nectarios Koziris
2017 B conf
ICPP
Athena Elafrou, Georgios I. Goumas, Nectarios Koziris
2017 J jnl
CoRR
Athena Elafrou, Georgios I. Goumas, Nectarios Koziris
2017 J jnl
Clust. Comput.
Nikela Papadopoulou, Georgios I. Goumas, Nectarios Koziris
2017 conf
IEEE BigData
Georgios Touloupas, Ioannis Konstantinou, Nectarios Koziris
2017 B conf
PACT
Dimitrios Siakavaras, Konstantinos Nikas, Georgios I. Goumas, Nectarios Koziris
2017 conf
SoCC
Konstantinos Lolos, Ioannis Konstantinou, Verena Kantere, Nectarios Koziris
2017 conf
IEEE BigData
Thaleia Dimitra Doudali, Ioannis Konstantinou, Nectarios Koziris
2017 conf
ISC Workshops
Michalis Rozis, Stefanos Gerangelos, Nectarios Koziris
2017 conf
IPDPS Workshops
Stefanos Gerangelos, Nectarios Koziris
2016 conf
COSH@HiPEAC
Alexandros-Herodotos Haritatos, Konstantinos Nikas, Georgios I. Goumas, Nectarios Koziris
2016 conf
WISE (1)
Alexandros Kontarinis, Verena Kantere, Nectarios Koziris
2016 conf
COSH@HiPEAC (extended versions)
Alexandros-Herodotos Haritatos, Nikela Papadopoulou, Konstantinos Nikas, Georgios I. Goumas, Nectarios Koziris
2016 conf
SIGMOD Conference
Ioannis Mytilinis, Dimitrios Tsoumakos, Nectarios Koziris
2016 conf
ALGOCLOUD
Nikolaos Korasidis, Ioannis Giannakopoulos, Katerina Doka, Dimitrios Tsoumakos, Nectarios Koziris
2016 J jnl
CoRR
Evangelos Angelou, Konstantinos Kaffes, Athanasia Asiki, Georgios I. Goumas, Nectarios Koziris
2016 C conf
PDP
Dimitris Siakavaras, Konstantinos Nikas, Georgios I. Goumas, Nectarios Koziris
2016 conf
IEEE BigData
Katerina Doka, Nikolaos Papailiou, Victor Giannakouris, Dimitrios Tsoumakos, Nectarios Koziris
2016 conf
IEEE BigData
Victor Giannakouris, Nikolaos Papailiou, Dimitrios Tsoumakos, Nectarios Koziris
2016 conf
BIRTE (Revised Selected Papers)
Katerina Doka, Ioannis Mytilinis, Nikolaos Papailiou, Victor Giannakouris, Dimitrios Tsoumakos, Nectarios Koziris
2016 conf
EDBT/ICDT Workshops
Katerina Doka, Maxim Filatov, Victor Giannakouris, Verena Kantere, Nectarios Koziris, Christos Mantas, Nikolaos Papailiou, Vassilis Papaioannou, Dimitrios Tsoumakos
2016 conf
ALGOCLOUD
Ioannis Giannakopoulos, Ioannis Konstantinou, Dimitrios Tsoumakos, Nectarios Koziris
2016 A conf
SC
Maria Dimakopoulou, Stéphane Eranian, Nectarios Koziris, Nicholas Bambos
2016 conf
HPCS
Dimitrios Vasilas, Stefanos Gerangelos, Nectarios Koziris
2015 conf
NCCA
Evie Kassela, Ioannis Konstantinou, Nectarios Koziris
2015 C conf
CLUSTER
Nikela Papadopoulou, Georgios I. Goumas, Nectarios Koziris
2015 J jnl
CoRR
Athena Elafrou, Georgios I. Goumas, Nectarios Koziris
2015 B conf
ICTAI
Ioannis Giannakopoulos, Panagiotis Karras, Dimitrios Tsoumakos, Katerina Doka, Nectarios Koziris
2015 conf
IPDPS Workshops
Dimiter R. Avresky, Erik Maehle, Nectarios Koziris, Anastassios Nanos
2015 J jnl
Comput. Commun. Rev.
Dimitrios Sarlis, Nikolaos Papailiou, Ioannis Konstantinou, Georgios Smaragdakis, Nectarios Koziris
2015 conf
Panhellenic Conference on Informatics
Nectarios Koziris
2015 conf
SIGMOD Conference
Nikolaos Papailiou, Dimitrios Tsoumakos, Panagiotis Karras, Nectarios Koziris
2015 conf
IEEE BigData
Katerina Doka, Mingqiang Xue, Dimitrios Tsoumakos, Panagiotis Karras, Alfredo Cuzzocrea, Nectarios Koziris
2015 B conf
IC2E
Ioannis Mytilinis, Dimitrios Tsoumakos, Verena Kantere, Anastassios Nanos, Nectarios Koziris
2015 conf
SIGMOD Conference
Katerina Doka, Nikolaos Papailiou, Dimitrios Tsoumakos, Christos Mantas, Nectarios Koziris
2015 conf
SIGMOD Conference
Ioannis Mytilinis, Ioannis Giannakopoulos, Ioannis Konstantinou, Katerina Doka, Dimitrios Tsitsigkos, Manolis Terrovitis, Lampros Giampouras, Nectarios Koziris
2015 B conf
IC2E
Ioannis Giannakopoulos, Dimitrios Tsoumakos, Nikolaos Papailiou, Nectarios Koziris
2015 conf
CloudDP@EuroSys
Anastassios Nanos, Stefanos Gerangelos, Ioanna Alifieraki, Nectarios Koziris
2014 conf
IEEE BigData
Evie Kassela, Christina Boumpouka, Ioannis Konstantinou, Nectarios Koziris
2014 conf
IEEE BigData
Ioannis Giannakopoulos, Nikolaos Papailiou, Christos Mantas, Ioannis Konstantinou, Dimitrios Tsoumakos, Nectarios Koziris
2014 conf
SIGMOD Conference
Nikolaos Papailiou, Dimitrios Tsoumakos, Ioannis Konstantinou, Panagiotis Karras, Nectarios Koziris
2014 B conf
PACT
Alexandros-Herodotos Haritatos, Georgios I. Goumas, Nikos Anastopoulos, Konstantinos Nikas, Kornilios Kourtis, Nectarios Koziris
2014 conf
IEEE BigData
Ioannis Mytilinis, Ioannis Giannakopoulos, Ioannis Konstantinou, Katerina Doka, Nectarios Koziris
2014 conf
SWIM
Nikolaos Papailiou, Dimitrios Tsoumakos, Ioannis Konstantinou, Panagiotis Karras, Nectarios Koziris
2014 J jnl
J. Syst. Softw.
Anastassios Nanos, Nectarios Koziris
2014 J jnl
login Usenix Mag.
Filippos Giannakos, Vangelis Koukis, Constantinos Venetsanopoulos, Nectarios Koziris
2013 J jnl
IEEE Trans. Parallel Distributed Syst.
Vasileios Karakasis, Theodoros Gkountouvas, Kornilios Kourtis, Georgios I. Goumas, Nectarios Koziris
2013 B conf
CCGRID
Dimitrios Tsoumakos, Ioannis Konstantinou, Christina Boumpouka, Spyros Sioutas, Nectarios Koziris
2013 conf
SIGMOD Conference
Ioannis Konstantinou, Verena Kantere, Dimitrios Tsoumakos, Nectarios Koziris
2013 conf
SIGMOD Conference
Ioannis Konstantinou, Dimitrios Tsoumakos, Ioannis Mytilinis, Nectarios Koziris
2013 conf
IEEE BigData
Nikolaos Papailiou, Ioannis Konstantinou, Dimitrios Tsoumakos, Panagiotis Karras, Nectarios Koziris
2013 A conf
IPDPS
Theodoros Gkountouvas, Vasileios Karakasis, Kornilios Kourtis, Georgios I. Goumas, Nectarios Koziris
2013 J jnl
login Usenix Mag.
Vangelis Koukis, Constantinos Venetsanopoulos, Nectarios Koziris
2013 conf
Euro-Par
Zhihui Du, Ramin Yahyapour, Yuxiong He, Nectarios Koziris, Bilha Mendelson, Veronika Sonigo, Achim Streit, Andrei Tchernykh
2013 J jnl
IEEE Internet Comput.
Vangelis Koukis, Constantinos Venetsanopoulos, Nectarios Koziris
2012 J jnl
Trans. Large Scale Data Knowl. Centered Syst.
Athanasia Asiki, Dimitrios Tsoumakos, Nectarios Koziris
2012 conf
IPDPS Workshops
Anastasios Katsigiannis, Nikos Anastopoulos, Konstantinos Nikas, Nectarios Koziris
2012 conf
SWIM
Evangelos Angelou, Nikolaos Papailiou, Ioannis Konstantinou, Dimitrios Tsoumakos, Nectarios Koziris
2012 conf
IISWC
Stelios Manousopoulos, Miquel Moretó, Roberto Gioiosa, Nectarios Koziris, Francisco J. Cazorla
2012 conf
ICDE Workshops
Panagiotis Antonopoulos, Ioannis Konstantinou, Dimitrios Tsoumakos, Nectarios Koziris
2012 conf
WWW (Companion Volume)
Nikolaos Papailiou, Ioannis Konstantinou, Dimitrios Tsoumakos, Nectarios Koziris
2012 conf
CloudCP@EuroSys
Ioannis Konstantinou, Evangelos Floros, Nectarios Koziris
2012 conf
SIGMOD Conference
Ioannis Konstantinou, Evangelos Angelou, Dimitrios Tsoumakos, Christina Boumpouka, Nectarios Koziris, Spyros Sioutas
2012 J jnl
Nucleic Acids Res.
Thanasis Vergoulis, Ioannis S. Vlachos, Panagiotis Alexiou, George Georgakilas, Manolis Maragkakis, Martin Reczko, Stefanos Gerangelos, Nectarios Koziris, Theodore Dalamagas, Artemis G. Hatzigeorgiou
2012 conf
Euro-Par
Alex Veidenbaum, Nectarios Koziris, Toshinori Sato, Avi Mendelson
2012 conf
PARA
Vasileios Karakasis, Georgios I. Goumas, Konstantinos Nikas, Nectarios Koziris, Juha Ruokolainen, Peter Råback
2012 conf
Euro-Par Workshops
Anastassios Nanos, Nectarios Koziris
2011 conf
Euro-Par Workshops (2)
Anastassios Nanos, Nikos Nikoleris, Stratos Psomadakis, Elisavet Kozyri, Nectarios Koziris
2011 J jnl
J. Parallel Distributed Comput.
Katerina Doka, Dimitrios Tsoumakos, Nectarios Koziris
2011 B conf
PPoPP
Kornilios Kourtis, Vasileios Karakasis, Georgios I. Goumas, Nectarios Koziris
2011 conf
Euro-Par Workshops (2)
Dimitris Aragiorgis, Anastassios Nanos, Nectarios Koziris
2011 J jnl
Nucleic Acids Res.
Manolis Maragkakis, Thanasis Vergoulis, Panagiotis Alexiou, Martin Reczko, Kyriaki Plomaritou, Mixail Gousis, Kornilios Kourtis, Nectarios Koziris, Theodore Dalamagas, Artemis G. Hatzigeorgiou
2011 J jnl
IEEE Trans. Parallel Distributed Syst.
Ioannis Konstantinou, Dimitrios Tsoumakos, Nectarios Koziris
2011 conf
DEXA (2)
Athanasia Asiki, Dimitrios Tsoumakos, Nectarios Koziris
2011 A conf
CIKM
Ioannis Konstantinou, Evangelos Angelou, Christina Boumpouka, Dimitrios Tsoumakos, Nectarios Koziris
2011 J jnl
J. Parallel Distributed Comput.
Katerina Doka, Dimitrios Tsoumakos, Nectarios Koziris
2010 A conf
CIKM
Katerina Doka, Dimitrios Tsoumakos, Nectarios Koziris
2010 conf
MDAC@WWW
Ioannis Konstantinou, Evangelos Angelou, Dimitrios Tsoumakos, Nectarios Koziris
2010 J jnl
Clust. Comput.
Athanasia Asiki, Dimitrios Tsoumakos, Nectarios Koziris
2010 A conf
HPDC
Katerina Doka, Dimitrios Tsoumakos, Nectarios Koziris
2010 conf
MDAC@WWW
Katerina Doka, Dimitrios Tsoumakos, Nectarios Koziris
2010 J jnl
ACM Trans. Archit. Code Optim.
Kornilios Kourtis, Georgios I. Goumas, Nectarios Koziris
2010 conf
Euro-Par Workshops
Anastassios Nanos, Georgios I. Goumas, Nectarios Koziris
2010 J jnl
Clust. Comput.
Evangelos Koukis, Anastassios Nanos, Nectarios Koziris
2010 J jnl
Comput. Commun.
Antony Chazapis, Athanasia Asiki, Georgios Tsoukalas, Dimitrios Tsoumakos, Nectarios Koziris
2010 conf
IPDPS Workshops
Georgios Rokos, Gerassimos Peteinatos, Georgia Kouveli, Georgios I. Goumas, Kornilios Kourtis, Nectarios Koziris
2009 conf
CSE (1)
Vasileios Karakasis, Georgios I. Goumas, Nectarios Koziris
2009 J jnl
Future Gener. Comput. Syst.
Athanasia Asiki, Katerina Doka, Ioannis Konstantinou, Antonis Zissimos, Dimitrios Tsoumakos, Nectarios Koziris, Panayotis Tsanakas
2009 J jnl
BMC Bioinform.
Manolis Maragkakis, Panagiotis Alexiou, Giorgos L. Papadopoulos, Martin Reczko, Theodore Dalamagas, Giorgos Giannopoulos, George I. Goumas, Evangelos Koukis, Kornilios Kourtis, Victor A. Simossis, Praveen Sethupathy, Thanasis Vergoulis, Nectarios Koziris, Timos K. Sellis, Panayotis Tsanakas, Artemis G. Hatzigeorgiou
2009 A conf
HPDC
Athanasia Asiki, Dimitrios Tsoumakos, Nectarios Koziris
2009 J jnl
IEEE Trans. Parallel Distributed Syst.
Georgios I. Goumas, Nikolaos Drosinos, Nectarios Koziris
2009 J jnl
Nucleic Acids Res.
Manolis Maragkakis, Martin Reczko, Victor A. Simossis, Panagiotis Alexiou, Giorgos L. Papadopoulos, Theodore Dalamagas, Giorgos Giannopoulos, Georgios I. Goumas, Evangelos Koukis, Kornilios Kourtis, Thanasis Vergoulis, Nectarios Koziris, Timos K. Sellis, Panayotis Tsanakas, Artemis G. Hatzigeorgiou
2009 A conf
IPDPS
Nikos Anastopoulos, Konstantinos Nikas, Georgios I. Goumas, Nectarios Koziris
2009 J jnl
Int. J. Comput. Sci. Eng.
Nikolaos Drosinos, Nectarios Koziris
2009 B conf
ICPP
Konstantinos Nikas, Nikos Anastopoulos, Georgios I. Goumas, Nectarios Koziris
2009 A conf
IPDPS
Vasileios Karakasis, Georgios I. Goumas, Nectarios Koziris
2009 Misc conf
ICASSP
Dimitrios Dimitriadis, A. Metallinou, Ioannis Konstantinou, Georgios I. Goumas, Petros Maragos, Nectarios Koziris
2009 conf
Peer-to-Peer Computing
Ioannis Konstantinou, Dimitrios Tsoumakos, Nectarios Koziris
2009 conf
Euro-Par Workshops
Anastassios Nanos, Nectarios Koziris
2009 conf
OTM Conferences (1)
Antonis Zissimos, Katerina Doka, Antony Chazapis, Dimitrios Tsoumakos, Nectarios Koziris
2009 C conf
CLUSTER
Georgios I. Goumas, Nikos Anastopoulos, Nectarios Koziris, Nikolas Ioannou
2009 B conf
ICPP
Vasileios Karakasis, Georgios I. Goumas, Nectarios Koziris
2009 J jnl
J. Supercomput.
Georgios I. Goumas, Kornilios Kourtis, Nikos Anastopoulos, Vasileios Karakasis, Nectarios Koziris
2008 A conf
IPDPS
Ioannis Riakiotakis, Georgios I. Goumas, Nectarios Koziris, Fiori-Anastasia Metallinou, Ioannis A. Daglis
2008 J jnl
J. Supercomput.
Evangelia Athanasaki, Nikos Anastopoulos, Kornilios Kourtis, Nectarios Koziris
2008 A conf
IPDPS
Nikos Anastopoulos, Nectarios Koziris
2008 conf
WIDM
Katerina Doka, Dimitrios Tsoumakos, Nectarios Koziris
2008 B conf
ICPP
Kornilios Kourtis, Georgios I. Goumas, Nectarios Koziris
2008 conf
OTM Conferences (1)
Katerina Doka, Athanasia Asiki, Dimitrios Tsoumakos, Nectarios Koziris
2008 conf
Conf. Computing Frontiers
Kornilios Kourtis, Georgios I. Goumas, Nectarios Koziris
2008 conf
OTM Workshops
Ioannis Konstantinou, Dimitrios Tsoumakos, Nectarios Koziris
2008 conf
Peer-to-Peer Computing
Athanasia Asiki, Katerina Doka, Dimitrios Tsoumakos, Nectarios Koziris
2008 A conf
IPDPS
Evangelos Koukis, Anastassios Nanos, Nectarios Koziris
2008 C conf
PDP
Georgios I. Goumas, Kornilios Kourtis, Nikos Anastopoulos, Vasileios Karakasis, Nectarios Koziris
2007 A conf
IPDPS
Georgios I. Goumas, Nikolaos Drosinos, Vasileios Karakasis, Nectarios Koziris
2007 A conf
IPDPS
Evangelos Koukis, Nectarios Koziris
2007 conf
GRID
Antony Chazapis, Georgios Tsoukalas, Georgios Verigakis, Kornilios Kourtis, Aristidis Sotiropoulos, Nectarios Koziris
2006 Misc conf
SAC
Robert van Engelen, Madhusudhan Govindaraju, Nectarios Koziris, Kleanthis Psarris
2006 C conf
HPCC
Evangelia Athanasaki, Nikos Anastopoulos, Kornilios Kourtis, Nectarios Koziris
2006 B conf
ICPP
Evangelia Athanasaki, Nikos Anastopoulos, Kornilios Kourtis, Nectarios Koziris
2006 conf
ICPADS (1)
Evangelos Koukis, Nectarios Koziris
2006 J jnl
Parallel Comput.
Georgios I. Goumas, Nikolaos Drosinos, Maria Athanasaki, Nectarios Koziris
2006 A conf
IPDPS
Nikolaos Drosinos, Georgios I. Goumas, Nectarios Koziris
2006 J jnl
J. Supercomput.
Nikolaos Drosinos, Nectarios Koziris
2005 B conf
ICPP
Antony Chazapis, Antonis Zissimos, Nectarios Koziris
2005 conf
Interaction between Compilers and Computer Architectures
Evangelia Athanasaki, Nectarios Koziris, Panayotis Tsanakas
2005 Misc conf
SAC
Robert van Engelen, Nectarios Koziris, Madhusudhan Govindaraju, Kleanthis Psarris
2005 J jnl
Int. J. High Perform. Comput. Netw.
Evangelia Athanasaki, Nectarios Koziris
2005 J jnl
J. Supercomput.
Maria Athanasaki, Aristidis Sotiropoulos, Georgios Tsoukalas, Nectarios Koziris, Panayotis Tsanakas
2005 conf
ICPP Workshops
Nikolaos Drosinos, Nectarios Koziris
2005 C conf
PDP
Evangelos Koukis, Nectarios Koziris
2005 conf
Panhellenic Conference on Informatics
Antony Chazapis, Nectarios Koziris
2005 conf
Panhellenic Conference on Informatics
Evangelia Athanasaki, Kornilios Kourtis, Nikos Anastopoulos, Nectarios Koziris
2004 Misc conf
SAC
Georgios I. Goumas, Nikolaos Drosinos, Maria Athanasaki, Nectarios Koziris
2004 Misc conf
SAC
Robert van Engelen, Nectarios Koziris, Mario Mango Furnari, Kleanthis Psarris
2004 conf
Interaction between Compilers and Computer Architectures
Evangelia Athanasaki, Nectarios Koziris
2004 C conf
PDP
Evangelia Athanasaki, Nectarios Koziris
2004 A conf
IPDPS
Nikolaos Drosinos, Nectarios Koziris
2004 C conf
PDP
Maria Athanasaki, Evangelos Koukis, Nectarios Koziris
2003 J jnl
J. Parallel Distributed Comput.
Nectarios Koziris, Aristidis Sotiropoulos, Georgios I. Goumas
2003 conf
PVM/MPI
Nikolaos Drosinos, Nectarios Koziris
2003 J jnl
IEEE Trans. Parallel Distributed Syst.
Georgios I. Goumas, Maria Athanasaki, Nectarios Koziris
2003 conf
PARCO
Nikolaos Drosinos, Georgios I. Goumas, Maria Athanasaki, Nectarios Koziris
2003 Misc conf
SAC
Robert van Engelen, Turgay Korkmaz, Nectarios Koziris, Kleanthis Psarris
2002 conf
ICPP Workshops
Maria Athanasaki, Aristidis Sotiropoulos, Georgios Tsoukalas, Nectarios Koziris
2002 Misc conf
SAC
Georgios I. Goumas, Maria Athanasaki, Nectarios Koziris
2002 J jnl
J. Inf. Sci. Eng.
Georgios I. Goumas, Maria Athanasaki, Nectarios Koziris
2002 C conf
CLUSTER
Georgios I. Goumas, Nikolaos Drosinos, Maria Athanasaki, Nectarios Koziris
2002 Misc conf
PDPTA
Georgios I. Goumas, Nikolaos Drosinos, Maria Athanasaki, Nectarios Koziris
2002 B conf
CCGRID
Aristidis Sotiropoulos, Georgios Tsoukalas, Nectarios Koziris
2002 A conf
IPDPS
Aristidis Sotiropoulos, Georgios Tsoukalas, Nectarios Koziris
2002 C conf
PDP
Ioannis Drositis, Theodore Andronikos, George Manis, George K. Papakonstantinou, Nectarios Koziris
2002 A conf
SC
Maria Athanasaki, Aristidis Sotiropoulos, Georgios Tsoukalas, Nectarios Koziris
2001 conf
HPCN Europe
George Manis, L. Lymberopoulos, Nectarios Koziris, George K. Papakonstantinou
2001 B conf
ICPADS
Ioannis Drositis, Theodore Andronikos, Aggelos Kokorogiannis, George K. Papakonstantinou, Nectarios Koziris
2001 A conf
IPDPS
Georgios I. Goumas, Aristidis Sotiropoulos, Nectarios Koziris
2001 conf
PVM/MPI
Dimitris Konstantinou, Nectarios Koziris, George K. Papakonstantinou
2001 conf
Panhellenic Conference on Informatics
Dimitris Konstantinou, Nectarios Koziris
2000 C conf
PDP
Nectarios Koziris, Michael Romesis, Panayotis Tsanakas, George K. Papakonstantinou
2000 J jnl
IEEE Trans. Parallel Distributed Syst.
Panayotis Tsanakas, Nectarios Koziris, George K. Papakonstantinou
2000 B conf
ICPP
Ioannis Drositis, Georgios I. Goumas, Nectarios Koziris, Panayotis Tsanakas, George K. Papakonstantinou
2000 C conf
PDP
Theodore Andronikos, Nectarios Koziris
1999 J jnl
J. Parallel Distributed Comput.
Theodore Andronikos, Nectarios Koziris, George K. Papakonstantinou, Panayotis Tsanakas
1998 conf
ECDL
Vassilios Chrissikopoulos, D. Georgiou, Nectarios Koziris, K. Toraki, Panayotis Tsanakas
1998 B conf
ICPADS
Andrew Koulouris, Nectarios Koziris, Theodore Andronikos, George K. Papakonstantinou, Panayotis Tsanakas
1998 conf
EUSIPCO
Andrew Koulouris, Nectarios Koziris, Theodore Andronikos, George K. Papakonstantinou, Panayiotis Tsanakas
1997 conf
HPCN Europe
Nectarios Koziris, Theodore Andronikos, George Economakos, George K. Papakonstantinou, Panayotis Tsanakas
1997 J jnl
Parallel Algorithms Appl.
Theodore Andronikos, Nectarios Koziris, Zacharias Tsiatsoulis, George K. Papakonstantinou, Panayotis Tsanakas
1997 B conf
ICPADS
Nectarios Koziris, George K. Papakonstantinou, Panayotis Tsanakas
1997 conf
IPPS
Theodore Andronikos, Nectarios Koziris, George K. Papakonstantinou, Panayotis Tsanakas
1996 J jnl
Comput. J.
Nectarios Koziris, George K. Papakonstantinou, Panayotis Tsanakas
APK_FEATURES_PDD-Tech_Annex.md
← Index APK_FEATURES_PDD-Tech_Annex.md markdown
# APK Extractor — Technical Annex

**Companion to:** APK_FEATURES_PDD.md
**Audience:** Engineers implementing the APK extractors
**Date:** 2026-02-21

---

## Table of Contents

1. [File Structure](#1-file-structure)
2. [Dependencies Setup](#2-dependencies-setup)
3. [Base Class: APKExtractor](#3-base-class-apkextractor)
4. [Dataclass Definitions](#4-dataclass-definitions)
5. [Tag Enum Updates](#5-tag-enum-updates)
6. [Extractor Implementation Details](#6-extractor-implementation-details)
7. [Ingestor Integration](#7-ingestor-integration)
8. [Hashes Dataclass Update](#8-hashes-dataclass-update)
9. [ClickHouse Schema](#9-clickhouse-schema)
10. [Androguard API Reference](#10-androguard-api-reference)
11. [Known Packer/Protector Signatures](#11-known-packerprotector-signatures)
12. [Sensitive API Categorization Reference](#12-sensitive-api-categorization-reference)

---

## 1. File Structure

Create the following files:

```
redb/extractors/
├── apk_extractor.py                          # APKExtractor base class
├── apk_extractors/
│   ├── __init__.py
│   ├── apk_features.py                       # APKFeaturesExtractor
│   ├── apk_manifest.py                       # APKManifestExtractor
│   ├── apk_permissions.py                    # APKPermissionsExtractor
│   ├── apk_signature.py                      # APKSignatureExtractor
│   ├── apk_dex.py                            # APKDexExtractor
│   ├── apk_resources.py                      # APKResourceExtractor
│   ├── apk_native_libs.py                    # APKNativeLibExtractor
│   └── apk_inconsistency_tests.py            # APKInconsistencyTestsExtractor
```

Modified files:

```
redb/extractors/enum.py                       # Add APK tags
redb/models/dataclasses.py                    # Add APK dataclasses + permhash field in Hashes
redb/ingestor.py                              # Wire up APK dispatch
requirements.txt                              # Add androguard, permhash
```

---

## 2. Dependencies Setup

Add to `requirements.txt`:

```
androguard>=4.1
permhash
```

Install and verify:

```bash
pip install androguard permhash
python -c "from androguard.core.apk import APK; print('androguard OK')"
python -c "import permhash; print('permhash OK')"
```

---

## 3. Base Class: APKExtractor

**File:** `redb/extractors/apk_extractor.py`

Follow the exact pattern of `PEExtractor` (`redb/extractors/pe_extractor.py`) and `MachOExtractor` (`redb/extractors/macho_extractor.py`).

```python
import logging
from abc import ABCMeta, abstractmethod
import zipfile

from androguard.core.apk import APK

from redb.extractors.extractor import Extractor

logger = logging.getLogger(__name__)


@abstractmethod
class APKExtractor(Extractor, metaclass=ABCMeta):

    def __init__(
        self,
        filepath,
        log,
        exporters=None,
        index_prefix=None,
        elastic_index=None,
        known_benign=False,
        known_malicious=False,
        apk=None,
    ):
        super().__init__(
            filepath,
            log,
            exporters,
            index_prefix,
            elastic_index,
            known_benign,
            known_malicious
        )
        self.apk = apk if apk else self._generate_apk_object()

    def _generate_apk_object(self):
        """Parse APK using androguard."""
        apk = None
        try:
            apk = APK(self.filepath)
            if not apk.is_valid_APK():
                self.log.warning(
                    f"APK validation warning for {self.hash.sha256}"
                )
                # Still return the object — partial parsing may still work
        except Exception as e:
            self.log.error(
                f"Format error parsing APK {self.hash.sha256}: {e}"
            )
        return apk

    def _is_valid_apk(self):
        """Check if the APK object was parsed successfully."""
        return self.apk is not None

    def _get_zip_file(self):
        """Get a zipfile.ZipFile handle for direct archive inspection."""
        try:
            return zipfile.ZipFile(self.filepath, 'r')
        except (zipfile.BadZipFile, Exception) as e:
            self.log.error(f"Failed to open APK as ZIP: {e}")
            return None

    def _list_files(self):
        """List all files in the APK archive."""
        if not self._is_valid_apk():
            return []
        try:
            return self.apk.get_files()
        except Exception as e:
            self.log.error(f"Error listing APK files: {e}")
            return []
```

**Key design decisions:**
- The `apk=` parameter allows the ingestor to parse once and share across all APK extractors (same pattern as `pe=` in PEExtractor, `macho=` in MachOExtractor, `elf=` in ELFExtractor)
- `_get_zip_file()` provides direct ZIP access for extractors that need it (resources, native libs, inconsistency tests)
- The androguard `APK` object is the primary parsing interface; `zipfile` is secondary for archive-level inspection

---

## 4. Dataclass Definitions

**File:** `redb/models/dataclasses.py`

Add after the Mach-O dataclasses section. Follow the exact style of existing dataclasses (type annotations, `Optional` for nullable fields, `field(default_factory=list)` for list defaults).

```python
# ============================================================================
# APK Dataclasses
# ============================================================================

@dataclass
class APKFeatures:
    """Core APK metadata and properties."""
    package_name: str
    app_name: str
    version_code: int
    version_name: str
    min_sdk_version: Optional[int] = None
    target_sdk_version: Optional[int] = None
    compile_sdk_version: Optional[int] = None
    main_activity: Optional[str] = None
    is_debuggable: bool = False
    allow_backup: bool = True
    uses_cleartext_traffic: bool = False
    supported_abis: List[str] = field(default_factory=list)
    dex_count: int = 0
    total_dex_size: int = 0
    total_file_count: int = 0
    has_native_code: bool = False
    has_assets: bool = False
    uses_libraries: List[str] = field(default_factory=list)
    earliest_content_modification: Optional[str] = None  # ISO 8601
    latest_content_modification: Optional[str] = None    # ISO 8601
    contains_embedded_apk: bool = False


@dataclass
class APKManifestComponent:
    """Single Android component (activity, service, receiver, provider)."""
    component_type: str      # "activity", "service", "receiver", "provider"
    class_name: str
    is_exported: bool
    intent_actions: List[str] = field(default_factory=list)
    intent_categories: List[str] = field(default_factory=list)


@dataclass
class APKManifest:
    """Full AndroidManifest.xml analysis."""
    activity_count: int
    service_count: int
    receiver_count: int
    provider_count: int
    activities: List[str] = field(default_factory=list)
    services: List[str] = field(default_factory=list)
    receivers: List[str] = field(default_factory=list)
    providers: List[str] = field(default_factory=list)
    exported_components: List[str] = field(default_factory=list)
    intent_filters_by_action: List[str] = field(default_factory=list)
    intent_filters_by_category: List[str] = field(default_factory=list)
    uses_features: List[str] = field(default_factory=list)
    meta_data: Optional[Dict] = None
    manifest_xml: Optional[str] = None  # Full decompiled XML text


@dataclass
class APKPermission:
    """Single permission entry for ClickHouse export."""
    permission_name: str
    protection_level: str    # "normal", "dangerous", "signature", "signatureOrSystem", "unknown"
    is_custom: bool = False  # True if declared by the app itself


@dataclass
class APKPermissions:
    """APK permission summary."""
    total_permission_count: int
    dangerous_permission_count: int
    permissions: List[str] = field(default_factory=list)
    dangerous_permissions: List[str] = field(default_factory=list)
    custom_permissions: List[str] = field(default_factory=list)
    permission_details: List[APKPermission] = field(default_factory=list)
    permhash: Optional[str] = None


@dataclass
class APKCertificate:
    """X.509 certificate from APK signature."""
    subject: str
    issuer: str
    serial_number: str
    valid_from: str
    valid_to: str
    thumbprint_sha1: str
    thumbprint_sha256: str
    algorithm: Optional[str] = None
    key_size: Optional[int] = None
    is_self_signed: bool = False


@dataclass
class APKCodeSigningInfo:
    """Complete APK signing information."""
    _id: str  # sha256
    is_signed: bool
    signature_scheme_versions: List[int] = field(default_factory=list)  # [1], [1,2], [1,2,3], etc.
    number_of_certificates: int = 0
    x509_certificates: Optional[List[APKCertificate]] = None
    signer_subject: Optional[str] = None
    signer_issuer: Optional[str] = None


@dataclass
class APKDexFile:
    """Analysis of a single DEX file."""
    filename: str
    sha256: str
    class_count: int
    method_count: int
    string_count: int
    top_packages: Optional[List[Dict]] = None  # [{"package": str, "class_count": int}]
    api_usage: Optional[Dict[str, List[str]]] = None  # {"reflection": [...], "crypto": [...], ...}
    obfuscation_indicators: Optional[Dict] = None


@dataclass
class APKResource:
    """Embedded resource file entry."""
    path: str
    size: int
    sha256: str
    filetype_magika: str
    is_suspicious: bool = False  # True for executable types


@dataclass
class APKNativeLib:
    """Native .so library entry."""
    abi: str          # e.g., "arm64-v8a"
    filename: str     # e.g., "libfoo.so"
    size: int
    sha256: str
    is_known_packer: bool = False  # True if matches known packer lib name


@dataclass
class APKInconsistencyTests:
    """APK anomaly and anti-analysis detection results."""
    test_zip_bomb: Optional[bool] = None
    test_zip_duplicate_entries: Optional[bool] = None
    test_zip_path_traversal: Optional[bool] = None
    test_zip_suspicious_timestamps: Optional[bool] = None
    test_hidden_dex_files: Optional[bool] = None
    test_manifest_component_mismatch: Optional[bool] = None
    test_debuggable_release: Optional[bool] = None
    test_emulator_detection_strings: Optional[bool] = None
    test_debugger_detection: Optional[bool] = None
    test_root_detection: Optional[bool] = None
```

---

## 5. Tag Enum Updates

**File:** `redb/extractors/enum.py`

Add at the end of the `Tag` class, after the ELF section:

```python
    # APK
    APK_FEATURES = "apk_features"
    APK_MANIFEST = "apk_manifest"
    APK_PERMISSIONS = "apk_permissions"
    APK_SIGNATURE = "apk_signature"
    APK_DEX = "apk_dex"
    APK_RESOURCES = "apk_resources"
    APK_NATIVE_LIBS = "apk_native_libs"
    APK_INCONSISTENCY_TESTS = "apk_inconsistency_tests"
```

---

## 6. Extractor Implementation Details

### 6.1 APKFeaturesExtractor

**File:** `redb/extractors/apk_extractors/apk_features.py`

```python
import inspect
import zipfile
from datetime import datetime, timezone
from typing import Any

from redb.extractors.enum import Tag
from redb.extractors.apk_extractor import APKExtractor
from redb.models.dataclasses import APKFeatures


class APKFeaturesExtractor(APKExtractor):

    def __init__(
        self, filepath, log, exporters=None, index_prefix=None,
        elastic_index=None, known_benign=False, known_malicious=False,
        apk=None,
    ):
        super().__init__(
            filepath, log, exporters, index_prefix,
            elastic_index, known_benign, known_malicious, apk,
        )
        self.apk_features = None
        self.elastic_index = self.index_prefix + "-apk_features"

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

    def _extract_zip_timestamps(self):
        """Extract earliest and latest content modification from ZIP entries."""
        # Use zipfile directly for this — androguard doesn't expose ZIP metadata
        earliest = None
        latest = None
        try:
            zf = self._get_zip_file()
            if zf:
                with zf:
                    for info in zf.infolist():
                        try:
                            # date_time is (year, month, day, hour, minute, second)
                            dt = datetime(*info.date_time)
                            if earliest is None or dt < earliest:
                                earliest = dt
                            if latest is None or dt > latest:
                                latest = dt
                        except (ValueError, TypeError):
                            continue
        except Exception as e:
            self.log.warning(f"Error extracting ZIP timestamps: {e}")
        return (
            earliest.isoformat() if earliest else None,
            latest.isoformat() if latest else None,
        )

    def _extract_supported_abis(self):
        """Determine supported ABIs from lib/ directory."""
        abis = set()
        for f in self._list_files():
            if f.startswith("lib/") and f.endswith(".so"):
                parts = f.split("/")
                if len(parts) >= 3:
                    abis.add(parts[1])
        return sorted(abis)

    def _count_dex_files(self):
        """Count DEX files and compute total size."""
        dex_count = 0
        total_size = 0
        try:
            zf = self._get_zip_file()
            if zf:
                with zf:
                    for info in zf.infolist():
                        if info.filename.endswith(".dex"):
                            dex_count += 1
                            total_size += info.file_size
        except Exception as e:
            self.log.warning(f"Error counting DEX files: {e}")
        return dex_count, total_size

    def _check_embedded_apk(self):
        """Check if the archive contains nested APK files."""
        for f in self._list_files():
            if f.lower().endswith(".apk"):
                return True
        return False

    def extract(self):
        try:
            if not self._is_valid_apk():
                self.log.error(f"Invalid APK for {self.hash.sha256}")
                return None

            # Core metadata from androguard
            package_name = self.apk.get_package() or ""
            app_name = self.apk.get_app_name() or ""

            # version_code may be string or int
            try:
                version_code = int(self.apk.get_androidversion_code() or 0)
            except (ValueError, TypeError):
                version_code = 0

            version_name = self.apk.get_androidversion_name() or ""

            # SDK versions
            min_sdk = self.apk.get_min_sdk_version()
            target_sdk = self.apk.get_target_sdk_version()
            # NOTE: compile_sdk may not be available in all androguard versions
            compile_sdk = None
            try:
                compile_sdk = self.apk.get_effective_target_sdk_version()
            except AttributeError:
                pass

            min_sdk = int(min_sdk) if min_sdk else None
            target_sdk = int(target_sdk) if target_sdk else None
            compile_sdk = int(compile_sdk) if compile_sdk else None

            # Main activity
            main_activity = self.apk.get_main_activity()

            # Flags from manifest
            # androguard provides get_attribute_value for manifest attributes
            is_debuggable = self.apk.get_attribute_value(
                "application", "debuggable"
            ) == "true"
            allow_backup = self.apk.get_attribute_value(
                "application", "allowBackup"
            ) != "false"  # default is true
            uses_cleartext = self.apk.get_attribute_value(
                "application", "usesCleartextTraffic"
            ) == "true"

            # Archive-level analysis
            supported_abis = self._extract_supported_abis()
            dex_count, total_dex_size = self._count_dex_files()
            all_files = self._list_files()
            total_file_count = len(all_files)
            has_native_code = any(
                f.startswith("lib/") and f.endswith(".so") for f in all_files
            )
            has_assets = any(f.startswith("assets/") for f in all_files)
            contains_embedded_apk = self._check_embedded_apk()

            # Uses-library
            uses_libraries = []
            try:
                libs = self.apk.get_libraries()
                uses_libraries = list(libs) if libs else []
            except Exception:
                pass

            # ZIP timestamps
            earliest_mod, latest_mod = self._extract_zip_timestamps()

            self.apk_features = APKFeatures(
                package_name=package_name,
                app_name=app_name,
                version_code=version_code,
                version_name=version_name,
                min_sdk_version=min_sdk,
                target_sdk_version=target_sdk,
                compile_sdk_version=compile_sdk,
                main_activity=main_activity,
                is_debuggable=is_debuggable,
                allow_backup=allow_backup,
                uses_cleartext_traffic=uses_cleartext,
                supported_abis=supported_abis,
                dex_count=dex_count,
                total_dex_size=total_dex_size,
                total_file_count=total_file_count,
                has_native_code=has_native_code,
                has_assets=has_assets,
                uses_libraries=uses_libraries,
                earliest_content_modification=earliest_mod,
                latest_content_modification=latest_mod,
                contains_embedded_apk=contains_embedded_apk,
            )
            return self.apk_features

        except Exception as e:
            self.log.error(
                f"Error extracting APK features {self.hash.sha256}: {e}"
            )
            return None

    def prepare_export_data(self, exporter_type: str) -> Any:
        if exporter_type == "ElasticsearchExporter":
            return self.apk_features
        elif exporter_type == "ClickHouseExporter":
            if not self.apk_features:
                return None

            f = self.apk_features
            data = [[
                self.sha256, self.md5, self.sha1,
                f.package_name,
                f.app_name,
                f.version_code,
                f.version_name,
                f.min_sdk_version,
                f.target_sdk_version,
                f.compile_sdk_version,
                f.main_activity,
                int(f.is_debuggable),
                int(f.allow_backup),
                int(f.uses_cleartext_traffic),
                f.supported_abis,
                f.dex_count,
                f.total_dex_size,
                f.total_file_count,
                int(f.has_native_code),
                int(f.has_assets),
                f.uses_libraries,
                f.earliest_content_modification,
                f.latest_content_modification,
                int(f.contains_embedded_apk),
                datetime.now(timezone.utc),
            ]]

            column_names = [
                "sha256", "md5", "sha1",
                "package_name", "app_name", "version_code", "version_name",
                "min_sdk_version", "target_sdk_version", "compile_sdk_version",
                "main_activity",
                "is_debuggable", "allow_backup", "uses_cleartext_traffic",
                "supported_abis",
                "dex_count", "total_dex_size", "total_file_count",
                "has_native_code", "has_assets",
                "uses_libraries",
                "earliest_content_modification", "latest_content_modification",
                "contains_embedded_apk",
                "analysis_date",
            ]

            column_type_names = [
                "FixedString(64)", "FixedString(32)", "FixedString(40)",
                "String", "String", "UInt32", "String",
                "Nullable(UInt16)", "Nullable(UInt16)", "Nullable(UInt16)",
                "Nullable(String)",
                "UInt8", "UInt8", "UInt8",
                "Array(String)",
                "UInt16", "UInt64", "UInt32",
                "UInt8", "UInt8",
                "Array(String)",
                "Nullable(String)", "Nullable(String)",
                "UInt8",
                "DateTime64(3, 'UTC')",
            ]

            return (data, column_names, column_type_names)

    def get_clickhouse_table(self) -> str:
        return "redb_apk_features"
```

### 6.2 APKManifestExtractor

**File:** `redb/extractors/apk_extractors/apk_manifest.py`

**Key androguard API calls:**
```python
# Activities, services, receivers, providers
self.apk.get_activities()       # Returns list of activity class names
self.apk.get_services()         # Returns list of service class names
self.apk.get_receivers()        # Returns list of receiver class names
self.apk.get_providers()        # Returns list of provider class names

# Exported check (per component)
self.apk.get_intent_filters(component_type, component_name)
# Returns dict: {"action": [...], "category": [...]}

# Uses-features
self.apk.get_features()         # Returns list of feature strings

# Full XML
self.apk.get_android_manifest_xml().toxml()
# OR
self.apk.get_android_manifest_axml().get_xml()
```

**Implementation notes:**
- For ClickHouse export of components, use a **one-row-per-component** table (`redb_apk_components`) with columns: `sha256`, `component_type`, `class_name`, `is_exported`, `intent_actions` (Array), `intent_categories` (Array), `analysis_date`
- For the aggregated manifest data (counts, feature list, full XML), use a **one-row-per-APK** table (`redb_apk_manifest`)
- To determine if a component is exported: check `android:exported` attribute. If not explicitly set, it's implicitly exported if the component has intent filters (Android default behavior pre-API 31). From API 31+, `android:exported` must be explicit

### 6.3 APKPermissionsExtractor

**File:** `redb/extractors/apk_extractors/apk_permissions.py`

**Key androguard API calls:**
```python
# Requested permissions
self.apk.get_permissions()              # Returns list of permission strings
self.apk.get_declared_permissions()     # Custom permissions defined by the app

# For protection level, use androguard's permission mapping:
from androguard.core.api_specific_resources import load_permission_mappings
permission_map = load_permission_mappings(target_sdk)
# permission_map[perm_name] -> {"protectionLevel": "dangerous", ...}
```

**Permhash computation:**
```python
import permhash
ph = permhash.permhash_apk(self.filepath)
# Returns SHA-256 hex string
```

**Known dangerous permissions** (reference list for classification fallback):
```python
DANGEROUS_PERMISSIONS = {
    "android.permission.READ_CALENDAR",
    "android.permission.WRITE_CALENDAR",
    "android.permission.CAMERA",
    "android.permission.READ_CONTACTS",
    "android.permission.WRITE_CONTACTS",
    "android.permission.GET_ACCOUNTS",
    "android.permission.ACCESS_FINE_LOCATION",
    "android.permission.ACCESS_COARSE_LOCATION",
    "android.permission.ACCESS_BACKGROUND_LOCATION",
    "android.permission.RECORD_AUDIO",
    "android.permission.READ_PHONE_STATE",
    "android.permission.READ_PHONE_NUMBERS",
    "android.permission.CALL_PHONE",
    "android.permission.ANSWER_PHONE_CALLS",
    "android.permission.ADD_VOICEMAIL",
    "android.permission.USE_SIP",
    "android.permission.BODY_SENSORS",
    "android.permission.SEND_SMS",
    "android.permission.RECEIVE_SMS",
    "android.permission.READ_SMS",
    "android.permission.RECEIVE_WAP_PUSH",
    "android.permission.RECEIVE_MMS",
    "android.permission.READ_EXTERNAL_STORAGE",
    "android.permission.WRITE_EXTERNAL_STORAGE",
    "android.permission.READ_MEDIA_IMAGES",
    "android.permission.READ_MEDIA_VIDEO",
    "android.permission.READ_MEDIA_AUDIO",
    "android.permission.POST_NOTIFICATIONS",
    "android.permission.NEARBY_WIFI_DEVICES",
    "android.permission.ACTIVITY_RECOGNITION",
    "android.permission.BLUETOOTH_SCAN",
    "android.permission.BLUETOOTH_ADVERTISE",
    "android.permission.BLUETOOTH_CONNECT",
}
```

**ClickHouse export:** One row per permission per APK in `redb_apk_permissions`:
- `sha256`, `permission_name`, `protection_level`, `is_custom`, `analysis_date`

The `permhash` value is also stored separately — see Section 8 for integration with `HashExtractor`.

### 6.4 APKSignatureExtractor

**File:** `redb/extractors/apk_extractors/apk_signature.py`

**Key androguard API calls:**
```python
# Get certificate objects
certs = self.apk.get_certificates()     # Returns list of asn1crypto Certificate objects

# For each certificate:
cert.subject.human_friendly              # Subject DN
cert.issuer.human_friendly               # Issuer DN
cert.serial_number                       # Serial
cert.not_valid_before                    # datetime
cert.not_valid_after                     # datetime
cert.hash_algo                           # e.g., "sha256"
cert.signature_algo                      # e.g., "rsassa_pkcs1v15"

# SHA-1 thumbprint
import hashlib
hashlib.sha1(cert.dump()).hexdigest()

# SHA-256 thumbprint
hashlib.sha256(cert.dump()).hexdigest()

# Self-signed check
cert.subject == cert.issuer

# Signature scheme detection:
# v1: Check META-INF/*.SF and META-INF/*.RSA/DSA/EC files exist
# v2/v3: androguard >= 4.x has is_signed_v2() / is_signed_v3()
self.apk.is_signed_v1()
self.apk.is_signed_v2()
self.apk.is_signed_v3()
```

**Implementation notes:**
- Mirror the structure of `PECodeSigningInfo` / `MachOCodeSigningInfo`
- The `_id` field should be `self.sha256` (same as PE/Mach-O signature extractors)

### 6.5 APKDexExtractor

**File:** `redb/extractors/apk_extractors/apk_dex.py`

This is the most complex extractor. Use `androguard.core.dex` for DEX parsing.

**Key androguard API calls:**
```python
from androguard.core.dex import DEX

# Get raw DEX data from APK
dex_files = self.apk.get_all_dex()  # Returns list of raw DEX bytes

for dex_name, dex_data in zip(self.apk.get_dex_names(), dex_files):
    d = DEX(dex_data)

    # Class enumeration
    classes = d.get_classes()
    for cls in classes:
        cls.get_name()          # e.g., "Lcom/example/MainActivity;"

    # Method enumeration
    methods = d.get_methods()
    for method in methods:
        method.get_class_name()  # e.g., "Lcom/example/MainActivity;"
        method.get_name()        # e.g., "onCreate"
        method.get_descriptor()  # e.g., "(Landroid/os/Bundle;)V"

    # String constants
    strings = d.get_strings()    # Returns list of string constants
```

**Computing `top_packages`:**
```python
from collections import Counter

package_counter = Counter()
for cls in classes:
    name = cls.get_name()  # "Lcom/example/foo/Bar;"
    # Convert to package: "com.example.foo"
    parts = name[1:].replace("/", ".").rsplit(".", 1)
    if len(parts) > 1:
        package = parts[0]
    else:
        package = "(default)"
    package_counter[package] += 1

top_packages = [
    {"package": pkg, "class_count": count}
    for pkg, count in package_counter.most_common(20)
]
```

**Computing `api_usage`:**
Iterate over all method cross-references (xrefs) or method invocations. For each invoked method, check if it matches any sensitive API pattern. See Section 12 for the full categorization reference.

```python
api_usage = {cat: [] for cat in SENSITIVE_API_CATEGORIES}

for method in d.get_methods():
    # Get the bytecode and look for invoke-* instructions
    code = method.get_code()
    if not code:
        continue
    # Use androguard's analysis or instruction iteration
    # to find method references that match sensitive patterns
```

**Computing `obfuscation_indicators`:**
```python
class_names = [cls.get_name() for cls in classes]
method_names = [m.get_name() for m in methods if m.get_name() not in ("<init>", "<clinit>")]

short_class = sum(1 for n in class_names if len(n.split("/")[-1].rstrip(";")) <= 2)
short_method = sum(1 for n in method_names if len(n) <= 2)

obfuscation_indicators = {
    "short_class_names_pct": round(short_class / max(len(class_names), 1), 4),
    "short_method_names_pct": round(short_method / max(len(method_names), 1), 4),
    "non_ascii_identifiers": sum(1 for n in class_names if not n.isascii()),
    "avg_class_name_length": round(
        sum(len(n) for n in class_names) / max(len(class_names), 1), 2
    ),
}
```

**ClickHouse export:**
- `redb_apk_dex`: One row per DEX file — `sha256`, `dex_sha256`, `dex_filename`, `class_count`, `method_count`, `string_count`, `top_packages` (JSON string), `obfuscation_indicators` (JSON string), `analysis_date`
- `redb_apk_dex_api_usage`: One row per API category per DEX — `sha256`, `dex_sha256`, `category`, `api_calls` (Array(String)), `analysis_date`

### 6.6 APKResourceExtractor

**File:** `redb/extractors/apk_extractors/apk_resources.py`

**Implementation approach:**
```python
import hashlib
from magika import Magika

magika = Magika()

resources = []
suspicious_files = []

zf = self._get_zip_file()
if zf:
    with zf:
        for info in zf.infolist():
            if info.is_dir():
                continue
            # Only scan res/ and assets/ directories
            if not (info.filename.startswith("res/") or
                    info.filename.startswith("assets/")):
                continue

            data = zf.read(info.filename)
            file_sha256 = hashlib.sha256(data).hexdigest()
            filetype = magika.identify_bytes(data).output.label

            resource = APKResource(
                path=info.filename,
                size=info.file_size,
                sha256=file_sha256,
                filetype_magika=filetype,
            )

            # Flag suspicious file types
            SUSPICIOUS_TYPES = {
                "elf", "pebin", "dex", "apk", "zip", "shell",
                "javascript", "python", "powershell", "batch",
            }
            if filetype in SUSPICIOUS_TYPES:
                resource.is_suspicious = True
                suspicious_files.append(resource)

            resources.append(resource)
```

**ClickHouse export:** One row per resource in `redb_apk_resources`:
- `sha256`, `resource_path`, `resource_size`, `resource_sha256`, `filetype_magika`, `is_suspicious`, `analysis_date`

**Performance note:** For APKs with very large resource directories (some apps have 10K+ files in `res/`), consider limiting to the top N resources by size or only scanning `assets/` fully while sampling `res/`. Document any limits applied.

### 6.7 APKNativeLibExtractor

**File:** `redb/extractors/apk_extractors/apk_native_libs.py`

**Implementation approach:**
```python
native_libs = []
abis = set()

zf = self._get_zip_file()
if zf:
    with zf:
        for info in zf.infolist():
            if info.filename.startswith("lib/") and info.filename.endswith(".so"):
                parts = info.filename.split("/")
                if len(parts) >= 3:
                    abi = parts[1]
                    filename = parts[-1]
                    abis.add(abi)

                    data = zf.read(info.filename)
                    lib_sha256 = hashlib.sha256(data).hexdigest()

                    native_libs.append(APKNativeLib(
                        abi=abi,
                        filename=filename,
                        size=info.file_size,
                        sha256=lib_sha256,
                        is_known_packer=filename in KNOWN_PACKER_LIBS,
                    ))
```

See Section 11 for the `KNOWN_PACKER_LIBS` reference list.

### 6.8 APKInconsistencyTestsExtractor

**File:** `redb/extractors/apk_extractors/apk_inconsistency_tests.py`

Each test is a private method returning `bool`:

```python
def _test_zip_bomb(self):
    """Check if any ZIP entry has compression ratio > 100:1."""
    zf = self._get_zip_file()
    if not zf:
        return None
    with zf:
        for info in zf.infolist():
            if info.compress_size > 0:
                ratio = info.file_size / info.compress_size
                if ratio > 100:
                    return True
    return False

def _test_zip_duplicate_entries(self):
    """Check for duplicate filenames in ZIP directory."""
    zf = self._get_zip_file()
    if not zf:
        return None
    with zf:
        names = [info.filename for info in zf.infolist()]
        return len(names) != len(set(names))

def _test_zip_path_traversal(self):
    """Check for path traversal (../) in ZIP entry names."""
    for f in self._list_files():
        if ".." in f or f.startswith("/"):
            return True
    return False

def _test_zip_suspicious_timestamps(self):
    """Check for timestamps at epoch (1980) or in the future."""
    zf = self._get_zip_file()
    if not zf:
        return None
    now = datetime.now()
    with zf:
        for info in zf.infolist():
            try:
                dt = datetime(*info.date_time)
                if dt.year <= 1980 or dt > now:
                    return True
            except (ValueError, TypeError):
                continue
    return False

def _test_hidden_dex_files(self):
    """Check for DEX files not matching classes*.dex pattern."""
    import re
    standard_pattern = re.compile(r"^classes\d*\.dex$")
    for f in self._list_files():
        if f.endswith(".dex") and not standard_pattern.match(f.split("/")[-1]):
            return True
    return False

def _test_emulator_detection_strings(self):
    """Check for emulator detection patterns in DEX strings."""
    # Inspect DEX strings for known emulator detection indicators
    EMULATOR_INDICATORS = {
        "generic", "sdk", "google_sdk", "Emulator",
        "goldfish", "ranchu", "Andy", "Genymotion",
        "BlueStacks", "nox", "ttVM_Hdragon",
    }
    # Use androguard to extract strings from DEX, then check
    ...

def _test_debugger_detection(self):
    """Check for debugger detection API calls in DEX."""
    # Look for: Debug.isDebuggerConnected, Debug.waitingForDebugger
    ...

def _test_root_detection(self):
    """Check for root detection patterns in DEX."""
    ROOT_INDICATORS = {
        "/system/app/Superuser.apk",
        "/system/xbin/su",
        "/system/bin/su",
        "com.noshufou.android.su",
        "com.thirdparty.superuser",
        "eu.chainfire.supersu",
        "com.koushikdutta.superuser",
        "com.topjohnwu.magisk",
    }
    ...
```

---

## 7. Ingestor Integration

**File:** `redb/ingestor.py`

Replace the stub at line 1668:

```python
elif filetype == "apk":
    logger.debug("APK file detected")
```

With the full dispatch block:

```python
elif filetype == "apk":
    logger.debug("APK file detected")

    # Import APK extractors
    from redb.extractors.apk_extractor import APKExtractor
    from redb.extractors.apk_extractors.apk_features import APKFeaturesExtractor
    from redb.extractors.apk_extractors.apk_manifest import APKManifestExtractor
    from redb.extractors.apk_extractors.apk_permissions import APKPermissionsExtractor
    from redb.extractors.apk_extractors.apk_signature import APKSignatureExtractor
    from redb.extractors.apk_extractors.apk_dex import APKDexExtractor
    from redb.extractors.apk_extractors.apk_resources import APKResourceExtractor
    from redb.extractors.apk_extractors.apk_native_libs import APKNativeLibExtractor
    from redb.extractors.apk_extractors.apk_inconsistency_tests import APKInconsistencyTestsExtractor

    apk_modules = [
        APKFeaturesExtractor,
        APKManifestExtractor,
        APKPermissionsExtractor,
        APKSignatureExtractor,
        APKDexExtractor,
        APKResourceExtractor,
        APKNativeLibExtractor,
        APKInconsistencyTestsExtractor,
    ]

    # Parse APK once with androguard, share across all extractors
    try:
        from androguard.core.apk import APK
        apk = APK(filepath)
    except Exception as e:
        logger.error(f"Failed to parse APK {filepath}: {e}")
        apk = None

    # Run format-agnostic extractors first (same as PE/ELF/MachO)
    # DIE
    if 'all' in selected_modules or 'DIEExtractor' in selected_modules:
        try:
            extractor = DIEExtractor(
                filepath, logger, exporters=exporters,
                index_prefix=index_prefix
            )
            result = extractor.export_data()
            is_packed = bool(result) if result is not None else None
            if result:
                results[ImportResult.CORRECTLY] += 1
            elif result is False:
                results[ImportResult.FAILED] += 1
        except Exception as e:
            logger.error(f"Error in DIEExtractor: {str(e)}")
            results[ImportResult.FAILED] += 1

    # BasicProperties
    if 'all' in selected_modules or 'BasicPropertiesExtractor' in selected_modules:
        try:
            extractor = BasicPropertiesExtractor(
                filepath, logger, exporters=exporters,
                index_prefix=index_prefix
            )
            if is_packed is not None:
                extractor.is_packed = is_packed
            result = extractor.export_data()
            if result:
                results[ImportResult.CORRECTLY] += 1
            elif result is False:
                results[ImportResult.FAILED] += 1
        except Exception as e:
            logger.error(f"Error in BasicPropertiesExtractor: {str(e)}")
            results[ImportResult.FAILED] += 1

    # Hashes
    if 'all' in selected_modules or 'HashExtractor' in selected_modules:
        try:
            extractor = HashExtractor(
                filepath, logger, exporters=exporters,
                index_prefix=index_prefix
            )
            result = extractor.export_data()
            if result:
                results[ImportResult.CORRECTLY] += 1
            elif result is False:
                results[ImportResult.FAILED] += 1
        except Exception as e:
            logger.error(f"Error in HashExtractor: {str(e)}")
            results[ImportResult.FAILED] += 1

    # YARA
    if 'all' in selected_modules or 'YaraExtractor' in selected_modules:
        try:
            extractor = YaraExtractor(
                filepath, logger, exporters=exporters,
                index_prefix=index_prefix
            )
            result = extractor.export_data()
            if result:
                results[ImportResult.CORRECTLY] += 1
            elif result is False:
                results[ImportResult.FAILED] += 1
        except Exception as e:
            logger.error(f"Error in YaraExtractor: {str(e)}")
            results[ImportResult.FAILED] += 1

    # APK-specific extractors
    for module in apk_modules:
        if 'all' in selected_modules or module.__name__ in selected_modules:
            try:
                logger.debug(f"Running {module.__name__}")
                extractor = module(
                    filepath,
                    logger,
                    exporters=exporters,
                    index_prefix=index_prefix,
                    apk=apk
                )
                result = extractor.export_data()
                if result:
                    results[ImportResult.CORRECTLY] += 1
                elif result is False:
                    results[ImportResult.FAILED] += 1
            except Exception as e:
                logger.error(f"Error in {module.__name__}: {str(e)}")
                results[ImportResult.FAILED] += 1
```

**Note:** Follow the exact error-handling and `selected_modules` check pattern used by the existing PE/ELF/Mach-O dispatch blocks. The code above mirrors the pattern from `ingestor.py:1540-1666`.

---

## 8. Hashes Dataclass Update

**File:** `redb/models/dataclasses.py`

Add to the `Hashes` dataclass after the existing Mach-O hashes:

```python
@dataclass
class Hashes:
    md5: str
    sha1: str
    sha256: str
    ssdeep_hash: str
    tlsh_hash: str
    authentihash: Optional[str] = None  # PE
    imphash: Optional[str] = None  # PE
    impfuzzy: Optional[str] = None  # PE TODO: implement
    typerefhash: Optional[str] = None  # DotNet
    richhash: Optional[str] = None  # PE
    richpe_hash: Optional[str] = None  # PE
    richpv_hash: Optional[str] = None  # PE
    richpv_hash_sorted: Optional[str] = None  # PE
    import_hash: Optional[str] = None  # ELF
    export_hash: Optional[str] = None  # ELF
    section_hash: Optional[str] = None  # ELF
    symbol_hash: Optional[str] = None  # ELF (symhash)
    dynamic_hash: Optional[str] = None  # ELF
    # Mach-O similarity hashes
    macho_dylib_hash: Optional[str] = None
    macho_import_hash: Optional[str] = None
    macho_export_hash: Optional[str] = None
    macho_entitlement_hash: Optional[str] = None
    macho_symhash: Optional[str] = None
    # APK similarity hashes
    permhash: Optional[str] = None  # APK: SHA-256 of sorted permissions (Mandiant/Google)
```

The `permhash` should be computed in `HashExtractor` when the filetype is APK, using the `permhash` library:

```python
# In HashExtractor, when filetype == "apk":
import permhash as permhash_lib
self.hashes.permhash = permhash_lib.permhash_apk(self.filepath)
```

The `permhash` column must be added to the existing `redb_hashes` table:

```sql
ALTER TABLE redb_hashes
    ADD COLUMN IF NOT EXISTS permhash Nullable(FixedString(64));
```

---

## 9. ClickHouse Schema

Create the following tables. Naming convention follows existing tables (`redb_pe_features`, `redb_elf_features`, etc.):

```sql
-- Core metadata (one row per APK)
CREATE TABLE redb_apk_features (
    sha256              FixedString(64),
    md5                 FixedString(32),
    sha1                FixedString(40),
    package_name        String,
    app_name            String,
    version_code        UInt32,
    version_name        String,
    min_sdk_version     Nullable(UInt16),
    target_sdk_version  Nullable(UInt16),
    compile_sdk_version Nullable(UInt16),
    main_activity       Nullable(String),
    is_debuggable       UInt8,
    allow_backup        UInt8,
    uses_cleartext_traffic UInt8,
    supported_abis      Array(String),
    dex_count           UInt16,
    total_dex_size      UInt64,
    total_file_count    UInt32,
    has_native_code     UInt8,
    has_assets          UInt8,
    uses_libraries      Array(String),
    earliest_content_modification Nullable(String),
    latest_content_modification   Nullable(String),
    contains_embedded_apk UInt8,
    analysis_date       DateTime64(3, 'UTC')
) ENGINE = ReplacingMergeTree()
ORDER BY sha256;

-- Manifest components (one row per component)
CREATE TABLE redb_apk_components (
    sha256              FixedString(64),
    component_type      LowCardinality(String),  -- "activity", "service", "receiver", "provider"
    class_name          String,
    is_exported         UInt8,
    intent_actions      Array(String),
    intent_categories   Array(String),
    analysis_date       DateTime64(3, 'UTC')
) ENGINE = ReplacingMergeTree()
ORDER BY (sha256, component_type, class_name);

-- Manifest summary (one row per APK)
CREATE TABLE redb_apk_manifest (
    sha256              FixedString(64),
    md5                 FixedString(32),
    sha1                FixedString(40),
    activity_count      UInt16,
    service_count       UInt16,
    receiver_count      UInt16,
    provider_count      UInt16,
    intent_filters_by_action   Array(String),
    intent_filters_by_category Array(String),
    uses_features       Array(String),
    manifest_xml        Nullable(String),
    analysis_date       DateTime64(3, 'UTC')
) ENGINE = ReplacingMergeTree()
ORDER BY sha256;

-- Permissions (one row per permission per APK)
CREATE TABLE redb_apk_permissions (
    sha256              FixedString(64),
    permission_name     String,
    protection_level    LowCardinality(String),
    is_custom           UInt8,
    analysis_date       DateTime64(3, 'UTC')
) ENGINE = ReplacingMergeTree()
ORDER BY (sha256, permission_name);

-- Signing info (one row per APK)
CREATE TABLE redb_apk_signature (
    sha256              FixedString(64),
    md5                 FixedString(32),
    sha1                FixedString(40),
    is_signed           UInt8,
    signature_scheme_versions Array(UInt8),
    number_of_certificates UInt8,
    signer_subject      Nullable(String),
    signer_issuer       Nullable(String),
    analysis_date       DateTime64(3, 'UTC')
) ENGINE = ReplacingMergeTree()
ORDER BY sha256;

-- Certificate details (one row per certificate per APK)
CREATE TABLE redb_apk_certificates (
    sha256              FixedString(64),
    subject             String,
    issuer              String,
    serial_number       String,
    valid_from          String,
    valid_to            String,
    thumbprint_sha1     FixedString(40),
    thumbprint_sha256   FixedString(64),
    algorithm           Nullable(String),
    key_size            Nullable(UInt16),
    is_self_signed      UInt8,
    analysis_date       DateTime64(3, 'UTC')
) ENGINE = ReplacingMergeTree()
ORDER BY (sha256, thumbprint_sha256);

-- DEX file analysis (one row per DEX file)
CREATE TABLE redb_apk_dex (
    sha256              FixedString(64),
    dex_sha256          FixedString(64),
    dex_filename        String,
    dex_tlsh            Nullable(String),
    class_count         UInt32,
    method_count        UInt32,
    string_count        UInt32,
    top_packages        String,       -- JSON
    obfuscation_indicators String,    -- JSON
    analysis_date       DateTime64(3, 'UTC')
) ENGINE = ReplacingMergeTree()
ORDER BY (sha256, dex_sha256);

-- DEX API usage (one row per category per DEX)
CREATE TABLE redb_apk_dex_api_usage (
    sha256              FixedString(64),
    dex_sha256          FixedString(64),
    category            LowCardinality(String),
    api_calls           Array(String),
    analysis_date       DateTime64(3, 'UTC')
) ENGINE = ReplacingMergeTree()
ORDER BY (sha256, dex_sha256, category);

-- Resource inventory (one row per resource)
CREATE TABLE redb_apk_resources (
    sha256              FixedString(64),
    resource_path       String,
    resource_size       UInt64,
    resource_sha256     FixedString(64),
    filetype_magika     LowCardinality(String),
    is_suspicious       UInt8,
    analysis_date       DateTime64(3, 'UTC')
) ENGINE = ReplacingMergeTree()
ORDER BY (sha256, resource_path);

-- Native libraries (one row per .so file)
CREATE TABLE redb_apk_native_libs (
    sha256              FixedString(64),
    abi                 LowCardinality(String),
    filename            String,
    size                UInt64,
    lib_sha256          FixedString(64),
    is_known_packer     UInt8,
    analysis_date       DateTime64(3, 'UTC')
) ENGINE = ReplacingMergeTree()
ORDER BY (sha256, abi, filename);

-- Inconsistency tests (one row per APK)
CREATE TABLE redb_apk_inconsistency_tests (
    sha256              FixedString(64),
    md5                 FixedString(32),
    sha1                FixedString(40),
    test_zip_bomb                    Nullable(UInt8),
    test_zip_duplicate_entries       Nullable(UInt8),
    test_zip_path_traversal          Nullable(UInt8),
    test_zip_suspicious_timestamps   Nullable(UInt8),
    test_hidden_dex_files            Nullable(UInt8),
    test_manifest_component_mismatch Nullable(UInt8),
    test_debuggable_release          Nullable(UInt8),
    test_emulator_detection_strings  Nullable(UInt8),
    test_debugger_detection          Nullable(UInt8),
    test_root_detection              Nullable(UInt8),
    analysis_date       DateTime64(3, 'UTC')
) ENGINE = ReplacingMergeTree()
ORDER BY sha256;
```

---

## 10. Androguard API Reference

Quick reference for the most commonly used androguard APIs. Full docs: https://androguard.readthedocs.io/

### APK class (`androguard.core.apk.APK`)

| Method | Returns | Description |
|--------|---------|-------------|
| `APK(filepath)` | `APK` | Parse an APK file |
| `.is_valid_APK()` | `bool` | Check if parsing succeeded |
| `.get_package()` | `str` | Package name |
| `.get_app_name()` | `str` | Application display name |
| `.get_androidversion_code()` | `str` | Version code |
| `.get_androidversion_name()` | `str` | Version name |
| `.get_min_sdk_version()` | `str` | Minimum SDK |
| `.get_target_sdk_version()` | `str` | Target SDK |
| `.get_main_activity()` | `str` | Main/launcher activity |
| `.get_activities()` | `list[str]` | All activity class names |
| `.get_services()` | `list[str]` | All service class names |
| `.get_receivers()` | `list[str]` | All receiver class names |
| `.get_providers()` | `list[str]` | All provider class names |
| `.get_permissions()` | `list[str]` | Requested permissions |
| `.get_declared_permissions()` | `list[str]` | Custom-defined permissions |
| `.get_features()` | `list[str]` | Uses-feature declarations |
| `.get_libraries()` | `list[str]` | Uses-library declarations |
| `.get_files()` | `list[str]` | All files in the APK |
| `.get_certificates()` | `list[Certificate]` | X.509 certificate objects |
| `.get_all_dex()` | `list[bytes]` | Raw DEX file contents |
| `.get_dex_names()` | `list[str]` | DEX filenames |
| `.is_signed_v1()` | `bool` | JAR signature present |
| `.is_signed_v2()` | `bool` | v2 signature present |
| `.is_signed_v3()` | `bool` | v3 signature present |
| `.get_attribute_value(tag, attr)` | `str` | Get manifest attribute |
| `.get_android_manifest_xml()` | `minidom` | Parsed manifest XML |
| `.get_intent_filters(type, name)` | `dict` | Intent filters for component |

### DEX class (`androguard.core.dex.DEX`)

| Method | Returns | Description |
|--------|---------|-------------|
| `DEX(raw_bytes)` | `DEX` | Parse raw DEX data |
| `.get_classes()` | `list[ClassDefItem]` | All class definitions |
| `.get_methods()` | `list[EncodedMethod]` | All methods |
| `.get_strings()` | `list[str]` | All string constants |

---

## 11. Known Packer/Protector Signatures

Native library names commonly associated with packers and protectors. Used by `APKNativeLibExtractor` to flag `is_known_packer`:

```python
KNOWN_PACKER_LIBS = {
    # Jiagu (360/Qihoo)
    "libjiagu.so", "libjiagu_a64.so", "libjiagu_x86.so", "libjiagu_x64.so",
    # Bangcle/SecNeo
    "libsecexe.so", "libsecmain.so", "libSecShell.so",
    # Baidu
    "libbaiduprotect.so",
    # Tencent (Legu)
    "libshell-super.2019.so", "libshella-*.so", "libtxAppProtect.so",
    "libBugly.so", "mix.dex",
    # iJiami
    "libexec.so", "libexecmain.so",
    # Alibaba
    "libmobisec.so", "libaliprotect.so",
    # APKProtect
    "libAPKProtect.so",
    # Pangxie (Pangolin)
    "libdexjni.so",
    # DexProtector
    "libdexprotector.so",
    # AppSolid
    "libAppSolid.so",
    # Kiwisec
    "libkwscmm.so",
    # DingXiang
    "libx3g.so",
    # NQ Shield
    "libnqshield.so",
    # Generic / other
    "libprotectClass.so",
    "libDexHelper.so",
    "libdexloader.so",
    "libfdog.so",
}
```

**Note:** This list should be maintained and expanded over time. For glob-style matching (e.g., `libshella-*.so`), use `fnmatch` instead of exact set lookup.

---

## 12. Sensitive API Categorization Reference

Used by `APKDexExtractor` to categorize API calls. Each category maps to a list of class/method patterns:

```python
SENSITIVE_API_CATEGORIES = {
    "reflection": [
        "Ljava/lang/reflect/Method;->invoke",
        "Ljava/lang/reflect/Field;->get",
        "Ljava/lang/reflect/Field;->set",
        "Ljava/lang/reflect/Constructor;->newInstance",
        "Ljava/lang/Class;->forName",
        "Ljava/lang/Class;->getMethod",
        "Ljava/lang/Class;->getDeclaredMethod",
        "Ljava/lang/Class;->getDeclaredField",
        "Ljava/lang/ClassLoader;->loadClass",
    ],
    "crypto": [
        "Ljavax/crypto/Cipher;->getInstance",
        "Ljavax/crypto/Cipher;->init",
        "Ljavax/crypto/spec/SecretKeySpec;-><init>",
        "Ljavax/crypto/spec/IvParameterSpec;-><init>",
        "Ljava/security/MessageDigest;->getInstance",
        "Ljava/security/KeyStore;->getInstance",
        "Ljavax/crypto/Mac;->getInstance",
    ],
    "dynamic_loading": [
        "Ldalvik/system/DexClassLoader;-><init>",
        "Ldalvik/system/PathClassLoader;-><init>",
        "Ldalvik/system/InMemoryDexClassLoader;-><init>",
        "Ldalvik/system/BaseDexClassLoader;-><init>",
        "Ljava/lang/Runtime;->exec",
        "Ljava/lang/ProcessBuilder;->start",
    ],
    "telephony": [
        "Landroid/telephony/TelephonyManager;->getDeviceId",
        "Landroid/telephony/TelephonyManager;->getSubscriberId",
        "Landroid/telephony/TelephonyManager;->getLine1Number",
        "Landroid/telephony/TelephonyManager;->getSimSerialNumber",
        "Landroid/telephony/TelephonyManager;->getNetworkOperator",
        "Landroid/telephony/TelephonyManager;->getSimOperator",
    ],
    "sms": [
        "Landroid/telephony/SmsManager;->sendTextMessage",
        "Landroid/telephony/SmsManager;->sendMultipartTextMessage",
        "Landroid/telephony/SmsManager;->sendDataMessage",
    ],
    "network": [
        "Ljava/net/HttpURLConnection;->connect",
        "Ljava/net/URL;->openConnection",
        "Lokhttp3/OkHttpClient;-><init>",
        "Lokhttp3/Request$Builder;->build",
        "Lorg/apache/http/client/HttpClient;->execute",
        "Landroid/webkit/WebView;->loadUrl",
        "Landroid/webkit/WebView;->setWebViewClient",
    ],
    "native": [
        "Ljava/lang/System;->loadLibrary",
        "Ljava/lang/System;->load",
        "Ljava/lang/Runtime;->loadLibrary",
    ],
    "device_info": [
        "Landroid/os/Build;->FINGERPRINT",
        "Landroid/os/Build;->MODEL",
        "Landroid/os/Build;->MANUFACTURER",
        "Landroid/os/Build;->PRODUCT",
        "Landroid/os/Build;->BRAND",
        "Landroid/os/Build;->DEVICE",
        "Landroid/os/Build;->HARDWARE",
        "Landroid/os/Build;->SERIAL",
        "Landroid/os/Build$VERSION;->SDK_INT",
        "Landroid/provider/Settings$Secure;->getString",  # ANDROID_ID
    ],
    "file_io": [
        "Ljava/io/FileOutputStream;-><init>",
        "Ljava/io/FileInputStream;-><init>",
        "Landroid/content/SharedPreferences;->edit",
        "Landroid/database/sqlite/SQLiteDatabase;->execSQL",
        "Landroid/database/sqlite/SQLiteDatabase;->rawQuery",
    ],
    "ipc": [
        "Landroid/content/ContentResolver;->query",
        "Landroid/content/ContentResolver;->insert",
        "Landroid/content/ContentResolver;->delete",
        "Landroid/content/Intent;-><init>",
        "Landroid/content/Context;->sendBroadcast",
        "Landroid/content/Context;->startService",
        "Landroid/content/Context;->bindService",
    ],
}
```

**Matching approach:** For each method invocation found in DEX bytecode, check if its full signature (class + method) starts with any of the patterns above. Store only the first match per unique API call (avoid duplicates from multiple call sites).

---

## Implementation Checklist

- [ ] Add `androguard` and `permhash` to `requirements.txt`
- [ ] Create `redb/extractors/apk_extractor.py` (base class)
- [ ] Create `redb/extractors/apk_extractors/__init__.py`
- [ ] Implement `APKFeaturesExtractor`
- [ ] Implement `APKManifestExtractor`
- [ ] Implement `APKPermissionsExtractor`
- [ ] Implement `APKSignatureExtractor`
- [ ] Implement `APKDexExtractor`
- [ ] Implement `APKResourceExtractor`
- [ ] Implement `APKNativeLibExtractor`
- [ ] Implement `APKInconsistencyTestsExtractor`
- [ ] Add APK tags to `redb/extractors/enum.py`
- [ ] Add APK dataclasses to `redb/models/dataclasses.py`
- [ ] Add `permhash` field to `Hashes` dataclass
- [ ] Wire up APK dispatch in `redb/ingestor.py`
- [ ] Integrate `permhash` computation in `HashExtractor`
- [ ] Create ClickHouse migration scripts for new tables
- [ ] Unit tests per extractor
- [ ] Integration test: full APK ingestion pipeline
- [ ] Cross-validate output against VirusTotal for reference samples