Vasilios Katos

92 papers B 8C 4Misc 2Journal 45Unranked 31
YearRankTypeTitle / Venue / Authors
2024 J jnl
Int. J. Inf. Sec.
Alexandros Zacharis, Vasilios Katos, Constantinos Patsakis
2022 B conf
ARES
Christos Iliou, Theodoros Kostoulas, Theodora Tsikrika, Vasilios Katos, Stefanos Vrochidis, Ioannis Kompatsiaris
2021 C conf
EDUCON
Sophia McCall, Cagatay Yucel, Vasilios Katos
2021 B conf
DCOSS
Dimitrios Mallis, Constantinos Marios Angelopoulos, Vasilios Katos, Konstantinos Vogklis
2021 J jnl
Future Gener. Comput. Syst.
Theodoros Apostolopoulos, Vasilios Katos, Kim-Kwang Raymond Choo, Constantinos Patsakis
2021 B conf
DCOSS
Amalia Damianou, M. Amir Khan, Constantinos Marios Angelopoulos, Vasilios Katos
2021 B conf
DCOSS
Abigael Okikijesu Bada, Amalia Damianou, Constantinos Marios Angelopoulos, Vasilios Katos
2021 J jnl
Comput. Commun.
Fran Casino, Nikolaos Lykousas, Vasilios Katos, Constantinos Patsakis
2021 J jnl
IEEE Trans. Sustain. Comput.
George Hatzivasilis, Othonas Soultatos, Panos Chatziadam, Konstantinos Fysarakis, Ioannis G. Askoxylakis, Sotiris Ioannidis, George Alexandris, Vasilios Katos, George Spanoudakis
2020 conf
MCSS
Shahin Rostami, Agnieszka Kleszcz, Daniel Dimanov, Vasilios Katos
2020 conf
ICC
Mohammed Al Qurashi, Constantinos Marios Angelopoulos, Vasilios Katos
2020 J jnl
J. Inf. Secur. Appl.
Mohammed Al Qurashi, Constantinos Marios Angelopoulos, Vasilios Katos
2020 C conf
BIBE
Vasiliki Danilatou, Despoina Antonakaki, Christos Tzagkarakis, Alexandros Kanterakis, Vasilios Katos, Theodoros Kostoulas
2020 J jnl
CoRR
Constantinos Marios Angelopoulos, Amalia Damianou, Vasilios Katos
2020 J jnl
Comput. Secur.
Constantinos Patsakis, Fran Casino, Vasilios Katos
2020 J jnl
Comput.
Konstantinos Rantos, Arnolnt Spyros, Alexandros Papanikolaou, Antonios Kritsas, Christos Ilioudis, Vasilios Katos
2020 J jnl
ACM Trans. Cyber Phys. Syst.
George Hatzivasilis, Othonas Soultatos, Sotiris Ioannidis, George Spanoudakis, Vasilios Katos, Giorgos Demetriou
2020 conf
MCSS
Cagatay Yucel, Ioannis Chalkias, Dimitrios Mallis, Evangelos Karagiannis, Deniz Cetinkaya, Vasilios Katos
2020 J jnl
IEEE Access
Constantinos Patsakis, Fran Casino, Nikolaos Lykousas, Vasilios Katos
2019 conf
IoTSMS
Mohammad Heydari, Alexios Mylonas, Vasilios Katos, Emili Balaguer-Ballester, Vahid Heydari Fami Tafreshi, Elhadj Benkhelifa
2019 J jnl
Requir. Eng.
Stavros Simou, Christos Kalloniatis, Stefanos Gritzalis, Vasilios Katos
2019 J jnl
Inf. Comput. Secur.
Nikolaos Serketzis, Vasilios Katos, Christos Ilioudis, Dimitrios A. Baltatzis, George J. Pangalos
2019 J jnl
CoRR
Constantinos Patsakis, Fran Casino, Vasilios Katos
2019 B conf
DCOSS
Constantinos Marios Angelopoulos, Vasilios Katos, Theodoros Kostoulas, Andreas I. Miaoudakis, Nikolaos E. Petroulakis, George Alexandris, Giorgos Demetriou, Giuditta Morandi, Urszula Rak, Karolina Waledzik, Marios Panayiotou, Christos Iraklis Tsatsoulis
2019 J jnl
CoRR
Constantinos Marios Angelopoulos, Vasilios Katos, Theodoros Kostoulas, Andreas I. Miaoudakis, Nikolaos E. Petroulakis, George Alexandris, Giorgos Demetriou, Giuditta Morandi, Karolina Waledzik, Urszula Rak, Marios Panayiotou, Christos Iraklis Tsatsoulis
2019 J jnl
Future Internet
Nikolaos Serketzis, Vasilios Katos, Christos Ilioudis, Dimitrios A. Baltatzis, George Pangalos
2019 J jnl
Ad Hoc Networks
Marcus Walshe, Gregory Epiphaniou, Haider M. Al-Khateeb, Mohammad Hammoudeh, Vasilios Katos, Ali Dehghantanha
2019 conf
FMEC
Mohammad Heydari, Alexios Mylonas, Vasilios Katos, Emili Balaguer-Ballester, Vahid Heydari Fami Tafreshi, Elhadj Benkhelifa
2019 J jnl
CoRR
Constantinos Patsakis, Fran Casino, Nikolaos Lykousas, Vasilios Katos
2018 J jnl
IEEE Commun. Surv. Tutorials
Antonia Nisioti, Alexios Mylonas, Paul D. Yoo, Vasilios Katos
2017 J jnl
Int. J. Digit. Crime Forensics
Ioannis Tsimperidis, Shahin Rostami, Vasilios Katos
2017 J jnl
Future Internet
Sofia-Anna Menesidou, Vasilios Katos, Georgios Kambourakis
2017 J jnl
Comput. Secur.
Nikolaos Tsalis, Alexios Mylonas, Antonia Nisioti, Dimitris Gritzalis, Vasilios Katos
2017 J jnl
Int. J. Inf. Comput. Secur.
Sofia-Anna Menesidou, Vasilios Katos
2017 B conf
RCIS
Antonia Nisioti, Mohammad Heydari, Alexios Mylonas, Vasilios Katos, Vahid Heydari Fami Tafreshi
2017 conf
HCI (22)
Jodie Ward, Huseyin Dogan, Edward Apeh, Alexios Mylonas, Vasilios Katos
2017 C conf
ISCC
Antonia Nisioti, Alexios Mylonas, Vasilios Katos, Paul D. Yoo, Anargyros Chryssanthou
2016 J jnl
Comput. Secur.
Sofia-Anna Menesidou, Dimitrios Vardalis, Vasilios Katos
2016 conf
SSCI
Nitin Naik, Paul Jenkins, Nick Savage, Vasilios Katos
2016 conf
BCS HCI
Shamal Faily, Georgia Lykou, Anton Partridge, Dimitris Gritzalis, Alexios Mylonas, Vasilios Katos
2016 conf
Conf. Computing Frontiers
Antonios Dimitriadis, Pavlos S. Efraimidis, Vasilios Katos
2016 J jnl
Inf. Comput. Secur.
Aimilia Tasidou, Pavlos S. Efraimidis, Yannis Soupionis, Lilian Mitrou, Vasilios Katos
2016 B conf
GLOBECOM
Konstantinos Fysarakis, Ioannis G. Askoxylakis, Othonas Soultatos, Ioannis Papaefstathiou, Charalampos Manifavas, Vasilios Katos
2015 C conf
CRITIS
Shamal Faily, George Stergiopoulos, Vasilios Katos, Dimitris Gritzalis
2015 J jnl
Secur. Commun. Networks
Ioannis Psaroudakis, Vasilios Katos, Pavlos S. Efraimidis
2015 J jnl
Inf. Comput. Secur.
Ioannis Tsimperidis, Vasilios Katos, Nathan L. Clarke
2015 conf
CIT/IUCC/DASC/PICom
Raian Ali, John McAlaney, Shamal Faily, Keith Phalp, Vasilios Katos
2015 J jnl
Inf. Comput. Secur.
Matina Tsavli, Pavlos S. Efraimidis, Vasilios Katos, Lilian Mitrou
2014 J jnl
Int. J. Electron. Secur. Digit. Forensics
Ioannis Psaroudakis, Vasilios Katos, Panagiotis Saragiotis, Lilian Mitrou
2014 conf
HAISA
Moufida Sadok, Vasilios Katos, Peter M. Bednar
2014 conf
HAISA
Matina Tsavli, Pavlos S. Efraimidis, Vasilios Katos
2013 J jnl
Digit. Investig.
Konstantia Barmpatsalou, Dimitrios Damopoulos, Georgios Kambourakis, Vasilios Katos
2013 J jnl
Digit. Investig.
Athina Provataki, Vasilios Katos
2013 ed.
EISMC
Steven Furnell, Nathan L. Clarke, Vasilios Katos
2013 conf
BCI
Ioannis Tsimperidis, Vasilios Katos
2013 J jnl
Kybernetes
Vasilios Katos, Frank Stowell, Peter M. Bednar
2013 J jnl
Digit. Investig.
Stavros N. Shiaeles, Anargyros Chryssanthou, Vasilios Katos
2013 conf
IISA
Dimitris Gritzalis, Yannis Soupionis, Vasilios Katos, Ioannis Psaroudakis, Panajotis Katsaros, Anakreon Mentis
2012 Misc conf
SEC
Ioannis Psaroudakis, Vasilios Katos, Pavlos S. Efraimidis
2012 conf
WWIC
Nathan L. Clarke, Vasilios Katos, Sofia-Anna Menesidou, Bogdan V. Ghita, Steven Furnell
2012 J jnl
Int. J. Electron. Secur. Digit. Forensics
Stavroula Karayianni, Vasilios Katos, Christos K. Georgiadis
2012 J jnl
Inf. Manag. Comput. Secur.
Vasilios Katos
2012 conf
WDFIA
Anargyros Chryssanthou, Vasilios Katos
2012 Misc conf
SEC
Sofia-Anna Menesidou, Vasilios Katos
2012 conf
HAISA
Alexandra Maria Varka, Vasilios Katos
2012 J jnl
Comput. Secur.
Stavros N. Shiaeles, Vasilios Katos, Alexandros S. Karakos, Basil K. Papadopoulos
2012 conf
HAISA
Aimilia Tasidou, Pavlos S. Efraimidis, Yannis Soupionis, Lilian Mitrou, Vasilios Katos
2011 B conf
COMPSAC
Vasilios Katos, Dimitris Vrakas, Panagiotis Katsaros
2011 conf
ICGS3/e-Democracy
Stavroula Karayianni, Vasilios Katos
2011 J jnl
Int. J. Digit. Crime Forensics
Theodoros Spyridopoulos, Vasilios Katos
2011 conf
WDFIA
Theodoros Spyridopoulos, Vasilios Katos
2010 J jnl
Comput. Secur.
Theodoros Kavallaris, Vasilios Katos
2010 conf
DPM/SETOP
Vasilios Katos, Frank Stowell, Peter M. Bednar
2009 conf
MCIS
Peter M. Bednar, Vasilios Katos
2009 conf
WDFIA
Theodoros Kavallaris, Vasilios Katos
2009 conf
WDFIA
Peter M. Bednar, Vasilios Katos
2009 conf
e-Democracy
Aimilia Tasidou, Pavlos S. Efraimidis, Vasilios Katos
2009 J jnl
Int. J. Inf. Technol. Syst. Approach
Vasilios Katos, Frank Stowell, Peter M. Bednar
2009 conf
e-Democracy
Georgios J. Pangalos, Vasilios Katos
2008 J jnl
Comput. Stand. Interfaces
Vasilios Katos, Peter M. Bednar
2008 J jnl
Inf. Manag. Comput. Secur.
Vasilios Katos, Ahmed Patel
2008 J jnl
Int. J. Knowl. Learn.
Peter M. Bednar, Christine E. Welch, Vasilios Katos
2008 conf
INC
James S. Briggs, Vasilios Katos, Azzri Bhaludin
2007 conf
World Conference on Information Security Education
Clare Wilson, Vasilios Katos, Caroline Strevens
2007 J jnl
Inf. Sci.
Vasilios Katos, Bernard S. Doherty
2007 J jnl
Inf. Sci.
Vasilios Katos
2007 conf
ECIS
Peter M. Bednar, Vasilios Katos, Christine E. Welch
2005 J jnl
Appl. Math. Comput.
Vasilios Katos
2005 J jnl
J. Strateg. Inf. Syst.
Vasilios Katos, Carl Adams
2005 conf
MOBIS
Carl Adams, Vasilios Katos
2004 conf
WOSIS
Vasilios Katos
1999
Vasilios Katos
redb/extractors/apk_extractors/apk_dex.py
← Index redb/extractors/apk_extractors/apk_dex.py python
import hashlib
import inspect
import json
from collections import Counter
from datetime import datetime, timezone
from typing import Any

import tlsh

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

# Sensitive API patterns categorized for malware analysis
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",
    ],
    "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",
    ],
}


class APKDexExtractor(APKExtractor):

    def __init__(
        self, filepath, log, exporters=None, index_prefix=None,
        known_benign=False, known_malicious=False,
        apk=None,
    ):
        super().__init__(
            filepath, log, exporters, index_prefix,
            known_benign, known_malicious, apk,
        )
        self.dex_files = []
        self.log.debug(inspect.currentframe().f_code.co_name)

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

    def _analyze_api_usage(self, dex):
        """Categorize sensitive API calls found in DEX bytecode."""
        api_usage = {cat: set() for cat in SENSITIVE_API_CATEGORIES}

        try:
            for method in dex.get_encoded_methods():
                code = method.get_code()
                if not code:
                    continue
                try:
                    bytecode = code.get_bc()
                    if not bytecode:
                        continue
                    for instruction in bytecode.get_instructions():
                        op_name = instruction.get_name()
                        if not op_name or not op_name.startswith("invoke"):
                            continue
                        output = instruction.get_output()
                        if not output:
                            continue
                        for category, patterns in SENSITIVE_API_CATEGORIES.items():
                            for pattern in patterns:
                                if pattern in output:
                                    api_usage[category].add(output.strip())
                                    break
                except Exception:
                    continue
        except Exception as e:
            self.log.warning(f"Error analyzing API usage: {e}")

        # Convert sets to sorted lists
        return {cat: sorted(calls) for cat, calls in api_usage.items() if calls}

    def _compute_obfuscation_indicators(self, classes, methods):
        """Compute obfuscation indicators from class/method names."""
        class_names = []
        for cls in classes:
            try:
                name = cls.get_name()
                if name:
                    class_names.append(name)
            except Exception:
                continue

        method_names = []
        for m in methods:
            try:
                name = m.get_name()
                if name and name not in ("<init>", "<clinit>"):
                    method_names.append(name)
            except Exception:
                continue

        if not class_names:
            return None

        # Short class names: extract just the class part from Dalvik notation
        short_class = 0
        for n in class_names:
            simple = n.split("/")[-1].rstrip(";")
            if len(simple) <= 2:
                short_class += 1

        short_method = sum(1 for n in method_names if len(n) <= 2)

        return {
            "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
            ),
        }

    def _compute_top_packages(self, classes):
        """Compute top packages by class count."""
        package_counter = Counter()
        for cls in classes:
            try:
                name = cls.get_name()  # "Lcom/example/foo/Bar;"
                if not name:
                    continue
                parts = name[1:].replace("/", ".").rsplit(".", 1)
                if len(parts) > 1:
                    package = parts[0]
                else:
                    package = "(default)"
                package_counter[package] += 1
            except Exception:
                continue

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

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

        from androguard.core.dex import DEX

        try:
            dex_names = list(self.apk.get_dex_names() or [])
        except Exception as e:
            self.log.warning(f"Error getting DEX names for {self.hash.sha256}: {e}")
            dex_names = []

        try:
            dex_buffers = list(self.apk.get_all_dex() or [])
        except Exception as e:
            self.log.error(f"Error getting DEX buffers for {self.hash.sha256}: {e}")
            return None

        if not dex_buffers:
            self.log.debug("No DEX files found in APK")
            return None

        self.dex_files = []
        for i, dex_data in enumerate(dex_buffers):
            dex_name = dex_names[i] if i < len(dex_names) else f"classes{i}.dex"

            dex_sha256 = hashlib.sha256(dex_data).hexdigest()
            dex_tlsh = None
            if len(dex_data) >= 50:
                try:
                    dex_tlsh = tlsh.hash(dex_data) or None
                except Exception:
                    pass

            try:
                d = DEX(dex_data)
            except Exception as e:
                self.log.warning(f"Failed to parse DEX {dex_name}: {e}")
                continue

            try:
                classes = list(d.get_classes() or [])
            except Exception as e:
                self.log.warning(f"Error getting classes from {dex_name}: {e}")
                classes = []
            try:
                methods = list(d.get_methods() or [])
            except Exception as e:
                self.log.warning(f"Error getting methods from {dex_name}: {e}")
                methods = []
            try:
                strings = list(d.get_strings() or [])
            except Exception as e:
                self.log.warning(f"Error getting strings from {dex_name}: {e}")
                strings = []

            try:
                top_packages = self._compute_top_packages(classes)
            except Exception as e:
                self.log.warning(f"Error computing top packages for {dex_name}: {e}")
                top_packages = []
            try:
                api_usage = self._analyze_api_usage(d)
            except Exception as e:
                self.log.warning(f"Error analyzing API usage for {dex_name}: {e}")
                api_usage = {}
            try:
                obfuscation_indicators = self._compute_obfuscation_indicators(classes, methods)
            except Exception as e:
                self.log.warning(f"Error computing obfuscation indicators for {dex_name}: {e}")
                obfuscation_indicators = None

            self.dex_files.append(APKDexFile(
                filename=dex_name,
                sha256=dex_sha256,
                class_count=len(classes),
                method_count=len(methods),
                string_count=len(strings),
                tlsh=dex_tlsh,
                top_packages=top_packages,
                api_usage=api_usage if api_usage else None,
                obfuscation_indicators=obfuscation_indicators,
            ))

        return self.dex_files if self.dex_files else None

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

            current_time = datetime.now(timezone.utc)

            # DEX table: one row per DEX file
            dex_data = []
            for dex in self.dex_files:
                dex_data.append([
                    self.sha256,
                    dex.sha256,
                    dex.filename,
                    dex.tlsh,
                    dex.class_count,
                    dex.method_count,
                    dex.string_count,
                    json.dumps(dex.top_packages) if dex.top_packages else None,
                    json.dumps(dex.obfuscation_indicators) if dex.obfuscation_indicators else None,
                    current_time,
                ])

            # API usage table: one row per category per DEX
            api_data = []
            for dex in self.dex_files:
                if dex.api_usage:
                    for category, api_calls in dex.api_usage.items():
                        api_data.append([
                            self.sha256,
                            dex.sha256,
                            category,
                            api_calls,
                            current_time,
                        ])

            return {
                'multi_table': True,
                'dex': {
                    'table': 'redb_apk_dex',
                    'data': dex_data,
                    'column_names': [
                        'sha256', 'dex_sha256', 'dex_filename', 'dex_tlsh',
                        'dex_class_count', 'dex_method_count', 'dex_string_count',
                        'dex_top_packages', 'dex_obfuscation_indicators',
                        'analysis_date',
                    ],
                    'column_type_names': [
                        'FixedString(64)', 'FixedString(64)', 'String', 'Nullable(String)',
                        'UInt32', 'UInt32', 'UInt32',
                        'Nullable(String)', 'Nullable(String)',
                        "DateTime64(3, 'UTC')",
                    ],
                },
                'api_usage': {
                    'table': 'redb_apk_dex_api_usage',
                    'data': api_data,
                    'column_names': [
                        'sha256', 'dex_sha256', 'api_category',
                        'api_calls', 'analysis_date',
                    ],
                    'column_type_names': [
                        'FixedString(64)', 'FixedString(64)', 'LowCardinality(String)',
                        'Array(String)', "DateTime64(3, 'UTC')",
                    ],
                },
            }

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