Nathan L. Clarke

148 papers B 20C 9Misc 7Journal 45Unranked 44
YearRankTypeTitle / Venue / Authors
2025 J jnl
CoRR
Nathan L. Clarke, Gaseb Alotibi, Dany Joy, Fudong Li, Steven Furnell, Ali Alshumrani, Hussan Mohammed
2025 J jnl
Big Data
Georgios Vranopoulos, Nathan L. Clarke, Shirley Atkinson
2025 ed.
HAISA (1)
Nathan L. Clarke, Steven Furnell
2025 ed.
HAISA (2)
Nathan L. Clarke, Steven Furnell
2025 J jnl
CoRR
Mohamad Hachem, Adam Lanfranchi, Nathan L. Clarke, Joakim Kävrestad
2025 J jnl
Comput. J.
Neamah Al-Naffakh, Nathan L. Clarke, Fudong Li, Paul S. Haskell-Dowland
2024 J jnl
CoRR
Ali Alshumrani, Nathan L. Clarke, Bogdan V. Ghita
2024 J jnl
Inf. Comput. Secur.
Nathan L. Clarke, Steven Furnell
2024 B conf
ICTAI
Jan Stodt, Christoph Reich, Martin Knahl, Nathan L. Clarke
2024 B conf
KES
Dirk Hölscher, Christoph Reich, Frank Gut, Martin Knahl, Nathan L. Clarke
2024 book
Joakim Kävrestad, Marcus Birath, Nathan L. Clarke
2024 conf
World Conference on Information Security Education
Nabil Al-Dhamari, Nathan L. Clarke
2024 J jnl
CoRR
Nabil Al-Dhamari, Nathan L. Clarke
2023 B conf
ICTAI
Jan Stodt, Christoph Reich, Nathan L. Clarke
2023 conf
UbiSec
Ali Alshumrani, Nathan L. Clarke, Bogdan Ghita
2023 J jnl
Inf. Comput. Secur.
Nathan L. Clarke, Steven Furnell
2023 ed.
HAISA
Steven Furnell, Nathan L. Clarke
2023 B conf
KES
Dirk Hölscher, Christoph Reich, Frank Gut, Martin Knahl, Nathan L. Clarke
2023 conf
IntelliSys (1)
Dirk Hölscher, Christoph Reich, Martin Knahl, Frank Gut, Nathan L. Clarke
2023 conf
IntelliSys (2)
Jan Stodt, Christoph Reich, Nathan L. Clarke
2022 conf
ICCS (3)
Jan Stodt, Christoph Reich, Nathan L. Clarke
2022 ed.
HAISA
Nathan L. Clarke, Steven Furnell
2022 J jnl
CoRR
Abdulrahman Alruban, Hind Alobaidi, Nathan L. Clarke, Fudong Li
2022 J jnl
Comput. Secur.
Hind Alobaidi, Nathan L. Clarke, Fudong Li, Abdulrahman Alruban
2022 B conf
KES
Dirk Hölscher, Christoph Reich, Martin Knahl, Frank Gut, Nathan L. Clarke
2022 conf
MECO
Hendrik Kuijs, Christoph Reich, Martin Knahl, Nathan L. Clarke, Ivana Ognjanovic
2021 J jnl
CoRR
Muhammad Ali, Stavros Shiaeles, Nathan L. Clarke, Dimitrios Kontogeorgis
2021 ed.
HAISA
Steven Furnell, Nathan L. Clarke
2020 J jnl
Inf. Comput. Secur.
Adéle da Veiga, Ruthea Vorster, Fudong Li, Nathan L. Clarke, Steven M. Furnell
2020 ed.
HAISA
Nathan L. Clarke, Steven Furnell
2019 C conf
ICISSP
Saud Alotaibi, Abdulrahman Alruban, Steven Furnell, Nathan L. Clarke
2019 J jnl
Inf. Comput. Secur.
Mutlaq Jalimid Alotaibi, Steven Furnell, Nathan L. Clarke
2019 J jnl
J. Inf. Secur. Appl.
Muhammad Ali, Stavros Shiaeles, Nathan L. Clarke, Dimitrios Kontogeorgis
2019 J jnl
Electron. Commer. Res.
Jose Oscar Fajardo, Fidel Liberal, Fudong Li, Nathan L. Clarke, Is-Haka Mkwawa
2019 conf
CERC
Thomas Rieger, Stefanie Regier, Ingo Stengel, Nathan L. Clarke
2019 C conf
ICISSP
Shahlaa Mashhadani, Nathan L. Clarke, Fudong Li
2019 C conf
AICCSA
Manal Abdullah Alohali, Nathan L. Clarke, Steven Furnell
2019 conf
CECC
Abdulaziz Altamimi, Nathan L. Clarke, Steven Furnell, Fudong Li
2019 C conf
ICPRAM
Abdulrahman Alruban, Hind Alobaidi, Nathan L. Clarke, Fudong Li
2019 C conf
CLOSER
Hendrik Kuijs, Timo Bayer, Christoph Reich, Martin Knahl, Nathan L. Clarke
2019 conf
CLOSER (Selected Papers)
Holger Gantikow, Christoph Reich, Martin Knahl, Nathan L. Clarke
2019 C conf
CLOSER
Holger Gantikow, Christoph Reich, Martin Knahl, Nathan L. Clarke
2019 ed.
HAISA
Steven Furnell, Nathan L. Clarke
2019 conf
ISDFS
Faisal Shaman, Bogdan V. Ghita, Nathan L. Clarke, Abdulrahman Alruban
2018 conf
ECIS
Adéle da Veiga, Ruthea Vorster, Fudong Li, Nathan L. Clarke
2018 J jnl
Inf. Secur. J. A Glob. Perspect.
Saud Alotaibi, Steven Furnell, Nathan L. Clarke
2018 B conf
TrustBus
Abdulrahman Alruban, Nathan L. Clarke, Fudong Li, Steven Furnell
2018 conf
IFIPTM
Neamah Al-Naffakh, Nathan L. Clarke, Fudong Li
2018 B conf
ARES
Hussam Jasim Mohammed, Nathan L. Clarke, Fudong Li
2018 J jnl
Digit. Investig.
Hiba Al-Kawaz, Nathan L. Clarke, Steven Furnell, Fudong Li
2018 J jnl
Inf. Comput. Secur.
Steven Furnell, Nathan L. Clarke
2018 J jnl
Inf. Comput. Secur.
Manal Abdullah Alohali, Nathan L. Clarke, Fudong Li, Steven Furnell
2018 conf
ETAA@ESORICS
Burhan Al-Bayati, Nathan L. Clarke, Paul Dowland, Fudong Li
2018 conf
SecITC
Leith Abed, Nathan L. Clarke, Bogdan V. Ghita, Abdulrahman Alruban
2018 J jnl
Future Internet
Samah Alshathri, Bogdan V. Ghita, Nathan L. Clarke
2018 ed.
HAISA
Nathan L. Clarke, Steven Furnell
2017 conf
ICITST
Shahlaa Mashhadani, Hiba Al-Kawaz, Nathan L. Clarke, Steven Furnell, Fudong Li
2017 J jnl
Comput. Secur.
Nathan L. Clarke, Fudong Li, Steven Furnell
2017 conf
ICITST
Fayez Alotaibi, Nathan L. Clarke, Steven Furnell
2017 ed.
HAISA
Steven Furnell, Nathan L. Clarke
2017 conf
HAISA
Manal Abdullah Alohali, Nathan L. Clarke, Fudong Li, Steven Furnell
2017 B conf
ARES
Abdulrahman Alruban, Nathan L. Clarke, Fudong Li, Steven Furnell
2017 conf
HICSS
Nathan L. Clarke, Fudong Li, Abdulrahman Alruban, Steven Furnell
2017 conf
ICITST
Timibloudi S. Enamamu, Nathan L. Clarke, Paul S. Haskell-Dowland, Fudong Li
2017 conf
BIOSIG
Neamah Al-Naffakh, Nathan L. Clarke, Fudong Li, Paul S. Haskell-Dowland
2016 B conf
ARES
Saad Alqahtany, Nathan L. Clarke, Steven Furnell, Christoph Reich
2016 conf
CLOSER (2)
Hendrik Kuijs, Christoph Reich, Martin Knahl, Nathan L. Clarke
2016 J jnl
Clust. Comput.
Saad Alqahtany, Nathan L. Clarke, Steven Furnell, Christoph Reich
2016 J jnl
Digit. Investig.
M. Al Fahdi, Nathan L. Clarke, Fudong Li, Steven M. Furnell
2016 conf
ICITST
Neamah Al-Naffakh, Nathan L. Clarke, Paul Dowland, Fudong Li
2016 J jnl
Clust. Comput.
Abdulwahid Al Abdulwahid, Nathan L. Clarke, Ingo Stengel, Steven Furnell, Christoph Reich
2016 conf
CLOSER (1)
Thomas Rübsamen, Christoph Reich, Nathan L. Clarke, Martin Knahl
2016 conf
ICITST
Mutlaq Jalimid Alotaibi, Steven Furnell, Nathan L. Clarke
2016 J jnl
Int. J. Cyber Situational Aware.
Abdulrahman Alruban, Nathan L. Clarke, Fudong Li, Steven Furnell
2016 conf
Cyber Security And Protection Of Digital Services
Abdulrahman Alruban, Nathan L. Clarke, Fudong Li, Steven Furnell
2016 conf
ISC Workshops
Holger Gantikow, Christoph Reich, Martin Knahl, Nathan L. Clarke
2016 conf
IC2E Workshops
Florian Kemmer, Christoph Reich, Martin Knahl, Nathan L. Clarke
2016 ed.
HAISA
Nathan L. Clarke, Steven Furnell
2016 conf
ICITST
Gaseb Alotibi, Nathan L. Clarke, Fudong Li, Steven Furnell
2015 conf
HCI (22)
Emad Sherif, Steven Furnell, Nathan L. Clarke
2015 conf
ICITST
Emad Sherif, Steven Furnell, Nathan L. Clarke
2015 J jnl
Comput. Secur.
Hataichanok Saevanee, Nathan L. Clarke, Steven Furnell, Valerio Biscione
2015 J jnl
Inf. Comput. Secur.
Ioannis Tsimperidis, Vasilios Katos, Nathan L. Clarke
2015 ed.
HAISA
Steven Furnell, Nathan L. Clarke
2015 B conf
TrustBus
Abdulwahid Al Abdulwahid, Nathan L. Clarke, Ingo Stengel, Steven Furnell, Christoph Reich
2015 conf
ICITST
Saud Alotaibi, Steven Furnell, Nathan L. Clarke
2014 J jnl
Secur. Commun. Networks
Nor Badrul Anuar, Maria Papadaki, Steven Furnell, Nathan L. Clarke
2014 J jnl
Int. J. Inf. Sec.
Fudong Li, Nathan L. Clarke, Maria Papadaki, Paul Dowland
2014 conf
HCI (24)
Fudong Li, Ross Wheeler, Nathan L. Clarke
2014 conf
ICITST
Dimitrios Kasiaras, Thomas Zafeiropoulos, Nathan L. Clarke, Georgios Kambourakis
2014 B conf
IC2E
Stefan Frey, Claudia Lüthje, Christoph Reich, Nathan L. Clarke
2014 ed.
HAISA
Nathan L. Clarke, Steven Furnell
2014 B conf
WiMob
Fudong Li, Nathan L. Clarke, Steven Furnell, Is-Haka Mkwawa
2014 conf
ICC
Jose Oscar Fajardo, Fidel Liberal, Fudong Li, Nathan L. Clarke, Is-Haka Mkwawa, Lingfen Sun
2014 Misc conf
SEC
Hataichanok Saevanee, Nathan L. Clarke, Steven Furnell, Valerio Biscione
2013 B conf
NSS
Fudong Li, Nathan L. Clarke, Steven Furnell
2013 conf
CloudCom (1)
Frank Dölitzscher, Martin Knahl, Christoph Reich, Nathan L. Clarke
2013 conf
ISSA
M. Al Fahdi, Nathan L. Clarke, Steven M. Furnell
2013 J jnl
Comput. Secur.
Chris G. Hocking, Steven M. Furnell, Nathan L. Clarke, Paul L. Reynolds
2013 ed.
EISMC
Steven Furnell, Nathan L. Clarke, Vasilios Katos
2013 J jnl
Secur. Commun. Networks
Nor Badrul Anuar, Maria Papadaki, Steven Furnell, Nathan L. Clarke
2012 ed.
HAISA
Nathan L. Clarke, Steven Furnell
2012 ed.
WDFIA
Nathan L. Clarke, Theodore Tryfonas, Ronald Dodge
2012 conf
WWIC
Nathan L. Clarke, Vasilios Katos, Sofia-Anna Menesidou, Bogdan V. Ghita, Steven Furnell
2012 Misc conf
SEC
Nor Badrul Anuar, Maria Papadaki, Steven Furnell, Nathan L. Clarke
2012 J jnl
J. Cloud Comput.
Frank Doelitzscher, Christoph Reich, Martin Knahl, Alexander Paßfall, Nathan L. Clarke
2012 J jnl
Secur. Commun. Networks
Dimitrios Damopoulos, Sofia-Anna Menesidou, Georgios Kambourakis, Maria Papadaki, Nathan L. Clarke, Stefanos Gritzalis
2012 Misc conf
SEC
Hataichanok Saevanee, Nathan L. Clarke, Steven M. Furnell
2012 conf
I-KNOW
Witold Thaul, Udo Bleimann, Nathan L. Clarke
2012 J jnl
Comput. Secur.
Steven Furnell, Nathan L. Clarke
2012 B conf
SERVICES
Frank Dölitzscher, Christian Fischer, Denis Moskal, Christoph Reich, Martin Knahl, Nathan L. Clarke
2011 ed.
HAISA
Steven Furnell, Nathan L. Clarke
2011 ed.
WDFIA
Nathan L. Clarke, Theodore Tryfonas
2011 C conf
CloudCom
Frank Dölitzscher, Christoph Reich, Martin Knahl, Nathan L. Clarke
2011 J jnl
Int. J. Mob. Comput. Multim. Commun.
Shuhaili Talib, Nathan L. Clarke, Steven Furnell
2011 J jnl
Int. J. Cyber Warf. Terror.
Fudong Li, Nathan L. Clarke, Maria Papadaki, Paul Dowland
2011 conf
LWA
Witold Thaul, Udo Bleimann, Nathan L. Clarke
2011 B conf
TrustBus
Thomas Lederm, Nathan L. Clarke
2011 B conf
NSS
Hataichanok Saevanee, Nathan L. Clarke, Steven Furnell
2011 book
Nathan L. Clarke
2010 C conf
IAS
Chris G. Hocking, Steven M. Furnell, Nathan L. Clarke, Paul L. Reynolds
2010 J jnl
Comput. Secur.
Gina C. Tjhai, Steven Furnell, Maria Papadaki, Nathan L. Clarke
2010 B conf
ARES
Shuhaili Talib, Nathan L. Clarke, Steven Furnell
2010 conf
ISSA
Nor Badrul Anuar, Maria Papadaki, Steven Furnell, Nathan L. Clarke
2010 B conf
TrustBus
Tarik Ibrahim, Steven Furnell, Maria Papadaki, Nathan L. Clarke
2010 conf
EST
Fudong Li, Nathan L. Clarke, Maria Papadaki, Paul Dowland
2010 conf
INC
Hanna V. Shauchenka, Udo Bleimann, Matthias Knoll, Nathan L. Clarke
2010 ed.
SAISMC
Nathan L. Clarke, Steven Furnell, Rossouw von Solms
2009 ed.
HAISA
Steven Furnell, Nathan L. Clarke
2009 ed.
WDFIA
Nathan L. Clarke, Theodore Tryfonas
2009 Misc conf
SEC
Nathan L. Clarke, Sevasti Karatzouni, Steven Furnell
2009 J jnl
Comput. Secur.
Reinhardt A. Botha, Steven Furnell, Nathan L. Clarke
2008 ed.
HAISA
Nathan L. Clarke, Steven Furnell
2008 J jnl
Ad Hoc Networks
Shukor Abd Razak, Steven Furnell, Nathan L. Clarke, Phillip J. Brooke
2008 Misc conf
SEC
Gina C. Tjhai, Maria Papadaki, Steven Furnell, Nathan L. Clarke
2008 B conf
TrustBus
Gina C. Tjhai, Maria Papadaki, Steven Furnell, Nathan L. Clarke
2007 J jnl
Comput. Secur.
Nathan L. Clarke, Steven Furnell
2007 J jnl
Int. J. Inf. Sec.
Nathan L. Clarke, Steven Furnell
2007 conf
ADHOC-NOW
Shukor Abd Razak, Steven Furnell, Nathan L. Clarke, Phillip J. Brooke
2007 Misc conf
SEC
Sevasti Karatzouni, Nathan L. Clarke
2007 J jnl
Inf. Manag. Comput. Secur.
Nathan L. Clarke, A. R. Mekala
2006 C conf
ISI
Shukor Abd Razak, Steven Furnell, Nathan L. Clarke, Phillip J. Brooke
2005 J jnl
Comput. Secur.
Nathan L. Clarke, Steven Furnell
2004 conf
CATE
David Clarke, Fritjof Sahlstrom, Cameron Mitchell, Nathan L. Clarke
2003 J jnl
Inf. Manag. Comput. Secur.
Nathan L. Clarke, Steven Furnell, Benn Lines, Paul L. Reynolds
2003 Misc conf
SEC
Nathan L. Clarke, Steven Furnell, Benn Lines, Paul L. Reynolds
2002 J jnl
Comput. Secur.
Nathan L. Clarke, Steven Furnell, Philip M. Rodwell, Paul L. Reynolds
1994 B conf
LCN
Tim Moors, Nathan L. Clarke, Guven Mercankosk
redb/extractors/macho_extractors/macho_imports.py
← Index redb/extractors/macho_extractors/macho_imports.py python
import inspect
from datetime import datetime, timezone
from typing import Any

from redb.extractors.enum import Tag
from redb.extractors.macho_extractor import MachOExtractor
from redb.models.dataclasses import MachOImport


class MachOImportExtractor(MachOExtractor):

    def __init__(
        self,
        filepath,
        log,
        exporters=None,
        index_prefix=None,
        elastic_index=None,
        known_benign=False,
        known_malicious=False,
        macho=None,
    ):
        super().__init__(
            filepath,
            log,
            exporters,
            index_prefix,
            elastic_index,
            known_benign,
            known_malicious,
            macho,
        )
        self.elastic_index = self.index_prefix + "-macho_imports"
        self.log.debug(inspect.currentframe().f_code.co_name)

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

    def _extract_imports(self, arch_name=None):
        """Extract import information from the MachO binary for a specific architecture.

        Handles machofile v2026.2.4+ API where get_imported_functions() returns:
        Dict[str, List[Dict]] where each dict has {'name': str, 'sources': [str, ...]}
        """
        self.log.debug(inspect.currentframe().f_code.co_name)

        if not self.macho:
            return None

        try:
            # Get imported functions using API for specific architecture
            imported_functions = self.macho.get_imported_functions(arch=arch_name)
            if not imported_functions:
                return None

            # Keep the library→functions mapping (like PE does)
            library_names = []
            imports_with_mapping = []  # List of {library: [(name, source), ...]}

            for dylib_name, functions in imported_functions.items():
                # v2026.2.4+: dylib_name is already str, but handle bytes for compatibility
                if isinstance(dylib_name, bytes):
                    dylib_name = dylib_name.decode('utf-8', errors='replace')
                library_names.append(dylib_name)

                # Process function entries
                func_list = []
                for func_entry in functions:
                    # v2026.2.4+: func_entry is {'name': str, 'sources': [str, ...]}
                    if isinstance(func_entry, dict):
                        func_name = func_entry.get('name', '')
                        # Join sources if multiple, take first if single
                        sources = func_entry.get('sources', [])
                        import_source = sources[0] if sources else None
                        func_list.append((func_name, import_source))
                    else:
                        # Legacy format: func_entry is str or bytes
                        if isinstance(func_entry, bytes):
                            func_entry = func_entry.decode('utf-8', errors='replace')
                        func_list.append((func_entry, None))

                imports_with_mapping.append({dylib_name: func_list})

            # Count total functions
            total_functions = sum(len(list(d.values())[0]) for d in imports_with_mapping)

            # Create import dataclass with mapping preserved
            macho_import = MachOImport(
                macho_imports_total=total_functions,
                macho_import_libraryName=library_names if library_names else None,
                macho_import_functions=imports_with_mapping if imports_with_mapping else None
            )

            return macho_import

        except Exception as e:
            self.log.error(f"Error extracting MachO imports for arch {arch_name}: {e}")
            return None

    def extract(self):
        self.log.debug(inspect.currentframe().f_code.co_name)
        try:
            # Get architectures (macho is already parsed in base class)
            architectures = self.macho.get_architectures()
            if len(architectures) > 1:
                # FAT binary - return list of imports for each architecture
                results = []
                for arch_name in architectures:
                    imports = self._extract_imports(arch_name)
                    if imports:
                        imports.arch_identifier = arch_name
                        results.append(imports)
                return results
            else:
                # Single architecture - return single result
                return self._extract_imports(architectures[0] if architectures else None)
        except Exception as e:
            self.log.error(f"Error extracting MachO imports: {e}")
            return None

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

            # Get architectures (macho is already parsed in base class)
            try:
                architectures = self.macho.get_architectures()
                is_fat = len(architectures) > 1
            except Exception as e:
                self.log.error(f"Could not get architectures: {e}")
                return None

            # Flatten the data - one row per function import (like PE imports)
            data = []
            current_time = datetime.now(timezone.utc)

            # Loop through each architecture (1 for single, multiple for FAT)
            for arch_name in architectures:
                # Get architecture-specific sha256
                try:
                    arch_general_info = self.macho.get_general_info(arch=arch_name)
                    arch_header_raw = self.macho.get_macho_header(arch=arch_name)
                    arch_sha256 = arch_general_info.get('SHA256', self.sha256)
                    arch_cputype_raw = arch_header_raw.get('cputype', 0) if arch_header_raw else 0
                except Exception as e:
                    self.log.warning(f"Could not get arch-specific data for {arch_name}: {e}")
                    arch_sha256 = self.sha256
                    arch_cputype_raw = 0

                # Get imports for this architecture
                macho_import = self._extract_imports(arch_name)
                if not macho_import or not macho_import.macho_import_functions:
                    continue

                # Flatten to one row per (library, function) pair
                for lib_funcs in macho_import.macho_import_functions:
                    for lib, funcs in lib_funcs.items():
                        for func_name, import_source in funcs:
                            data.append([
                                arch_sha256,        # sha256 (arch-specific)
                                lib,                # library_name
                                func_name,          # function_name
                                import_source,      # import_source (chained_fixups, bind_opcodes, symtab)
                                current_time,       # analysis_date
                            ])

            column_names = [
                'sha256',
                'library_name', 'function_name', 'import_source',
                'analysis_date'
            ]

            if not data:
                return None

            column_type_names = [
                'FixedString(64)',
                'LowCardinality(String)', 'LowCardinality(String)', 'LowCardinality(Nullable(String))',
                'DateTime64(3, \'UTC\')'
            ]

            return (data, column_names, column_type_names)

        return None

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