Irene Papatheodorou

20 papers B 1Journal 19
YearRankTypeTitle / Venue / Authors
2025 J jnl
Bioinform.
Yuyao Song, Yanhui Hu, Julian Dow, Norbert Perrimon, Irene Papatheodorou
2023 J jnl
Nucleic Acids Res.
Matthew Thakur, Alex Bateman, Cath Brooksbank, Mallory Ann Freeberg, Melissa Harrison, Matthew Hartley, Thomas M. Keane, Gerard J. Kleywegt, Andrew Leach, Maria Levchenko, Sarah L. Morgan, Ellen M. McDonagh, Sandra E. Orchard, Irene Papatheodorou, Sameer Velankar, Juan Antonio Vizcaíno, Rick Witham, Barbara Zdrazil, Johanna R. McEntyre
2023 J jnl
Bioinform.
Sean Upchurch, Emilio Palumbo, Jeremy Adams, David Bujold, Guillaume Bourque, Jared Nedzel, Keenan Graham, Meenakshi S. Kagda, Pedro Assis, Benjamin C. Hitz, Emilio Righi, Roderic Guigó, Barbara J. Wold, Alvis Brazma, Julia Burchard, Joe Capka, Michael Cherry, Laura Clarke, Brian Craft, Manolis Dermitzakis, Mark Diekhans, John Dursi, Michael Sean Fitzsimons, Zac Flaming, Romina Garrido, Alfred Gil, Paul Godden, Matt Green, Mitch Guttman, Brian Haas, Max Haeussler, Bo Li, Sten Linnarsson, Adam Lipski, David Liu, Simonne Longerich, David R. Lougheed, Jonathan Manning, John C. Marioni, Christopher Meyer, Stephen B. Montgomery, Alyssa Morrow, Alfonso Muñoz-Pomer Fuentes, Jared L. Nedzel, David Nguyen, Kevin Osborn, Francis Ouellette, Irene Papatheodorou, Dmitri D. Pervouchine, Arun K. Ramani, Jordi Rambla, Bashir Sadjad, David Steinberg, Jeremiah Talkar, Timothy Tickle, Kathy Tzeng, Saman Vaisipour, Sean Watford, Barbara Wold, Zhenyu Zhang, Jing Zhu
2023 J jnl
BMC Medical Informatics Decis. Mak.
Albert Burger, Richard A. Baldock, David J. Adams, Shahida Din, Irene Papatheodorou, Michael Glinka, Bill Hill, Derek Houghton, Mehran Sharghi, Michael N. Wicks, Mark J. Arends
2022 J jnl
Nucleic Acids Res.
Pablo A. Moreno, Silvie Fexova, Nancy George, Jonathan R. Manning, Zhichao Miao, Suhaib Mohammed, Alfonso Muñoz-Pomer Fuentes, Anja Füllgrabe, Yalan Bi, Natassja Bush, Haider Iqbal, Upendra Kumbham, Andrey Solovyev, Lingyun Zhao, Ananth Prakash, David García-Seisdedos, Deepti Jaiswal Kundu, Shengbo Wang, Mathias Walzer, Laura Clarke, David Osumi-Sutherland, Marcela Karey Tello-Ruiz, Sunita Kumari, Doreen Ware, Jana Eliasova, Mark J. Arends, Martijn C. Nawijn, Kerstin B. Meyer, Tony Burdett, John C. Marioni, Sarah A. Teichmann, Juan Antonio Vizcaíno, Alvis Brazma, Irene Papatheodorou
2022 J jnl
PLoS Comput. Biol.
Shengbo Wang, David García-Seisdedos, Ananth Prakash, Deepti Jaiswal Kundu, Andrew Collins, Nancy George, Silvie Fexova, Pablo A. Moreno, Irene Papatheodorou, Andrew R. Jones, Juan Antonio Vizcaíno
2021 J jnl
Nucleic Acids Res.
Ugis Sarkans, Anja Füllgrabe, Ahmed Ali, Awais Athar, Ehsan Behrangi, Nestor Diaz, Silvie Fexova, Nancy George, Haider Iqbal, Sandeep Kurri, Jhoan Munoz, Juan Camillo Rada, Irene Papatheodorou, Alvis Brazma
2021 J jnl
Nucleic Acids Res.
Marcela K. Tello-Ruiz, Sushma Naithani, Parul Gupta, Andrew Olson, Sharon Wei, Justin Preece, Yinping Jiao, Bo Wang, Kapeel Chougule, Priyanka Garg, Justin Elser, Sunita Kumari, Vivek Kumar, Bruno Contreras-Moreira, Guy Naamati, Nancy George, Justin Cook, Dan M. Bolser, Peter D'Eustachio, Lincoln D. Stein, Amit Gupta, Weijia Xu, Jennifer Regala, Irene Papatheodorou, Paul J. Kersey, Paul Flicek, Crispin Taylor, Pankaj Jaiswal, Doreen Ware
2021 J jnl
Bioinform.
Matthew L. Speir, Aparna Bhaduri, Nikolay S. Markov, Pablo A. Moreno, Tomasz J. Nowakowski, Irene Papatheodorou, Alex A. Pollen, Brian J. Raney, Lucas Seninge, W. James Kent, Maximilian Haeussler
2020 J jnl
Nucleic Acids Res.
Kevin L. Howe, Bruno Contreras-Moreira, Nishadi De Silva, Gareth Maslen, Wasiu A. Akanni, James E. Allen, Jorge Álvarez-Jarreta, Matthieu Barba, Dan M. Bolser, Lahcen Cambell, Manuel Carbajo, Marc Chakiachvili, Mikkel B. Christensen, Carla A. Cummins, Alayne Cuzick, Paul Davis, Silvie Fexova, Astrid Gall, Nancy George, Laurent Gil, Parul Gupta, Kim E. Hammond-Kosack, Erin Haskell, Sarah E. Hunt, Pankaj Jaiswal, Sophie H. Janacek, Paul J. Kersey, Nick Langridge, Uma Maheswari, Thomas Maurel, Mark D. McDowall, Benjamin Moore, Matthieu Muffato, Guy Naamati, Sushma Naithani, Andrew Olson, Irene Papatheodorou, Mateus Patricio, Michael Paulini, Helder Pedro, Emily Perry, Justin Preece, Marc Rosello, Matthew Russell, Vasily Sitnik, Daniel M. Staines, Joshua C. Stein, Marcela K. Tello-Ruiz, Stephen J. Trevanion, Martin Urban, Sharon Wei, Doreen Ware, Gary Williams, Andrew D. Yates, Paul Flicek
2020 J jnl
Nucleic Acids Res.
Irene Papatheodorou, Pablo A. Moreno, Jonathan R. Manning, Alfonso Muñoz-Pomer Fuentes, Nancy George, Silvie Fexova, Nuno A. Fonseca, Anja Füllgrabe, Matthew Green, Ni Huang, Laura Huerta, Haider Iqbal, Monica Jianu, Suhaib Mohammed, Lingyun Zhao, Andrew F. Jarnuczak, Simon Jupp, John C. Marioni, Kerstin B. Meyer, Robert Petryszak, Cesar Augusto Prada Medina, Carlos Talavera-López, Sarah A. Teichmann, Juan Antonio Vizcaíno, Alvis Brazma
2020 J jnl
Nucleic Acids Res.
Sushma Naithani, Parul Gupta, Justin Preece, Peter D'Eustachio, Justin Elser, Priyanka Garg, Daemon A. Dikeman, Jason Kiff, Justin Cook, Andrew Olson, Sharon Wei, Marcela K. Tello-Ruiz, Antonio Fabregat Mundo, Alfonso Muñoz-Pomer Fuentes, Suhaib Mohammed, Tiejun Cheng, Evan Bolton, Irene Papatheodorou, Lincoln Stein, Doreen Ware, Pankaj Jaiswal
2019 J jnl
Nucleic Acids Res.
Awais Athar, Anja Füllgrabe, Nancy George, Haider Iqbal, Laura Huerta, Ahmed Ali, Catherine Snow, Nuno A. Fonseca, Robert Petryszak, Irene Papatheodorou, Ugis Sarkans, Alvis Brazma
2018 J jnl
Nucleic Acids Res.
Irene Papatheodorou, Nuno A. Fonseca, Maria Keays, Y. Amy Tang, Elisabet Barrera, Wojciech Bazant, Melissa L. Burke, Anja Füllgrabe, Alfonso Muñoz-Pomer Fuentes, Nancy George, Laura Huerta, Satu Koskinen, Suhaib Mohammed, Matthew J. Geniza, Justin Preece, Pankaj Jaiswal, Andrew F. Jarnuczak, Wolfgang Huber, Oliver Stegle, Juan Antonio Vizcaíno, Alvis Brazma, Robert Petryszak
2018 J jnl
Nucleic Acids Res.
Marcela K. Tello-Ruiz, Sushma Naithani, Joshua C. Stein, Parul Gupta, Michael Campbell, Andrew Olson, Sharon Wei, Justin Preece, Matthew J. Geniza, Yinping Jiao, Young Koung Lee, Bo Wang, Joseph Mulvaney, Kapeel Chougule, Justin Elser, Noor Al-Bader, Sunita Kumari, James Thomason, Vivek Kumar, Daniel M. Bolser, Guy Naamati, Electra Tapanari, Nuno A. Fonseca, Laura Huerta, Haider Iqbal, Maria Keays, Alfonso Muñoz-Pomer Fuentes, Y. Amy Tang, Antonio Fabregat, Peter D'Eustachio, Joel Weiser, Lincoln D. Stein, Robert Petryszak, Irene Papatheodorou, Paul J. Kersey, Patti Lockhart, Crispin Taylor, Pankaj Jaiswal, Doreen Ware
2017 J jnl
Nucleic Acids Res.
Gautier Koscielny, Peter An, Denise Carvalho-Silva, Jennifer A. Cham, Luca Fumis, Rippa Gasparyan, Samiul Hasan, Nikiforos Karamanis, Michael Maguire, Eliseo Papa, Andrea Pierleoni, Miguel Pignatelli, Theo Platt, Francis Rowland, Priyanka Wankar, A. Patrícia Bento, Tony Burdett, Antonio Fabregat, Simon A. Forbes, Anna Gaulton, Cristina Yenyxe González, Henning Hermjakob, Anne Hersey, Steven Jupe, Senay Kafkas, Maria Keays, Catherine Leroy, Francisco-Javier Lopez, María P. Magariños, James Malone, Johanna R. McEntyre, Alfonso Muñoz-Pomer Fuentes, Claire O'Donovan, Irene Papatheodorou, Helen E. Parkinson, Barbara Palka, Justin E. Paschall, Robert Petryszak, Naruemon Pratanwanich, Sirarat Sarntivijai, Gary Saunders, Konstantinos Sidiropoulos, Thomas Smith, Zbyslaw Sondka, Oliver Stegle, Y. Amy Tang, Edward Turner, Brendan W. Vaughan, Olga Vrousgou, Xavier Watkins, Maria Jesus Martin, Philippe Sanseau, Jessica Vamathevan, Ewan Birney, Jeffrey Barrett, Ian Dunham
2015 J jnl
J. Biomed. Semant.
Irene Papatheodorou, Anika Oellrich, Damian Smedley
2014 J jnl
Bioinform.
Irene Papatheodorou, Rudolfs Petrovs, Janet M. Thornton
2014 J jnl
Bioinform.
Anika Oellrich, Julius O. B. Jacobsen, Irene Papatheodorou, Damian Smedley
2005 B conf
LPNMR
Irene Papatheodorou, Antonis C. Kakas, Marek J. Sergot
redb/extractors/macho_extractors/macho_features.py
← Index redb/extractors/macho_extractors/macho_features.py python
import inspect
import json
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 MachO


class MachOFeaturesExtractor(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_features"
        self.log.debug(inspect.currentframe().f_code.co_name)

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

    def _extract_macho_features_for_arch(self, arch_name):
        """Extract basic MachO features for a specific architecture."""
        self.log.debug(inspect.currentframe().f_code.co_name)

        if not self.macho:
            return None

        try:
            # Get general info using new API
            general_info = self.macho.get_general_info()
            if not general_info:
                return None

            # Get header info for this specific architecture
            header_raw = self.macho.get_macho_header(arch=arch_name)
            header_formatted = self.macho.get_macho_header(arch=arch_name, formatted=True)

            if not header_raw or not header_formatted:
                return None

            # Get entry point using new API
            entry_point = None
            try:
                entry_point_info = self.macho.get_entry_point(arch=arch_name)
                if entry_point_info:
                    if isinstance(entry_point_info, dict):
                        entry_point = entry_point_info.get('entryoff') or entry_point_info.get('entry_address')
                    else:
                        entry_point = entry_point_info
            except Exception as e:
                self.log.debug(f"No entry point found: {e}")

            # Get UUID using new API
            uuid = None
            try:
                uuid_info = self.macho.get_uuid(arch=arch_name)
                if uuid_info:
                    uuid = str(uuid_info)
            except Exception as e:
                self.log.debug(f"No UUID found: {e}")

            # Get version info using new API with formatting
            version_info = None
            version_info_str = None
            try:
                version_info = self.macho.get_version_info(arch=arch_name)
                version_info_str = self.macho.get_version_info(arch=arch_name, formatted=True)
            except Exception as e:
                self.log.debug(f"No version info found: {e}")

            # Get segments using new API
            segments = self.macho.get_segments(arch=arch_name)
            number_of_segments = len(segments) if segments else 0

            # Get dylib info using new API
            dylib_names = self.macho.get_dylib_names(arch=arch_name)
            number_of_dylibs = len(dylib_names) if dylib_names else 0

            # Count imports using new API
            imported_functions = self.macho.get_imported_functions(arch=arch_name)
            number_of_imports = sum(len(funcs) for funcs in imported_functions.values()) if imported_functions else 0

            # Count exports using new API
            exported_symbols = self.macho.get_exported_symbols(arch=arch_name)
            number_of_exports = sum(len(symbols) for symbols in exported_symbols.values()) if exported_symbols else 0

            # Get unique load command types using new API
            load_commands_set = self.macho.get_load_commands_set(arch=arch_name, formatted=True)
            if isinstance(load_commands_set, set):
                load_commands_set = sorted(list(load_commands_set))

            # Get architectures for listing purposes
            architectures = self.macho.get_architectures()

            # Determine binary properties
            is_64bit = header_raw.get('magic') in [0xFEEDFACF, 0xCFFAEDFE]  # MH_MAGIC_64, MH_CIGAM_64
            is_signed = self._is_signed()
            
            # Create MachO dataclass
            macho_features = MachO(
                # Raw values from new API
                magic=header_raw.get('magic', 0),
                cputype=header_raw.get('cputype', 0),
                cpusubtype=header_raw.get('cpusubtype', 0),
                filetype=header_raw.get('filetype', 0),
                ncmds=header_raw.get('ncmds', 0),
                sizeofcmds=header_raw.get('sizeofcmds', 0),
                flags=header_raw.get('flags', 0),
                architecture=header_raw.get('cputype', 0),  # Use cputype as architecture
                architectures=[arch_info.get('cputype', 0) for arch_info in [self.macho.get_macho_header(arch=arch) for arch in architectures] if arch_info],
                # Human-readable values from formatted API
                magic_str=header_formatted.get('magic', ''),
                cputype_str=header_formatted.get('cputype', ''),
                cpusubtype_str=header_formatted.get('cpusubtype', ''),
                filetype_str=header_formatted.get('filetype', ''),
                flags_str=header_formatted.get('flags', '').split(', ') if header_formatted.get('flags') else [],
                architecture_str=header_formatted.get('cputype', ''),
                architectures_str=[arch_info.get('cputype', '') for arch_info in [self.macho.get_macho_header(arch=arch, formatted=True) for arch in architectures] if arch_info],
                # Additional properties
                is_64bit=is_64bit,
                is_signed=is_signed,
                number_of_load_commands=header_raw.get('ncmds', 0),
                load_commands_set=load_commands_set,
                number_of_segments=number_of_segments,
                number_of_dylibs=number_of_dylibs,
                number_of_imports=number_of_imports,
                number_of_exports=number_of_exports,
                entry_point=entry_point,
                uuid=uuid,
                version_info=version_info,
                version_info_str=version_info_str
            )
            
            return macho_features
            
        except Exception as e:
            self.log.error(f"Error extracting MachO features: {e}")
            return None

    def extract(self):
        self.log.debug(inspect.currentframe().f_code.co_name)
        try:
            if not self.macho:
                return None
            architectures = self.macho.get_architectures()
            if not architectures:
                return None

            # For FAT binaries, return features for all architectures
            # For single arch, return just the single result
            if len(architectures) > 1:
                # FAT binary - return list of features for each architecture
                results = []
                for arch_name in architectures:
                    features = self._extract_macho_features_for_arch(arch_name)
                    if features:
                        # Add architecture identifier to the result
                        if hasattr(features, '__dict__'):
                            # If it's a dataclass, we can access its dict
                            features.arch_identifier = arch_name
                        results.append(features)
                return results
            else:
                # Single architecture - return single result
                return self._extract_macho_features_for_arch(architectures[0])
        except Exception as e:
            self.log.error(f"Error extracting MachO features: {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 __init__)
            try:
                architectures = self.macho.get_architectures()
            except Exception as e:
                self.log.error(f"Could not get architectures: {e}")
                return None

            data = []
            current_time = datetime.now(timezone.utc)

            # Loop through each architecture (1 for single, multiple for FAT)
            for arch_name in architectures:
                # Extract features for this specific architecture
                macho_features = self._extract_macho_features_for_arch(arch_name)
                if not macho_features:
                    continue

                # Get architecture-specific sha256
                try:
                    arch_general_info = self.macho.get_general_info(arch=arch_name)
                    arch_sha256 = arch_general_info.get('SHA256', self.sha256)
                except Exception as e:
                    self.log.warning(f"Could not get arch-specific hash for {arch_name}: {e}")
                    arch_sha256 = self.sha256

                # Architecture field (kept in features table for ORDER BY)
                architecture = macho_features.cputype    # Raw CPU type value

                data.append([
                    arch_sha256,                          # sha256 (architecture-specific)
                    architecture,                         # architecture (raw CPU type)
                    # Raw values
                    macho_features.magic,                 # magic
                    macho_features.cputype,               # cputype
                    macho_features.cpusubtype,            # cpusubtype
                    macho_features.filetype,              # filetype
                    macho_features.ncmds,                 # ncmds
                    macho_features.sizeofcmds,            # sizeofcmds
                    macho_features.flags,                 # flags
                    # Human-readable values
                    macho_features.magic_str,             # magic_str
                    macho_features.cputype_str,           # cputype_str
                    macho_features.cpusubtype_str,        # cpusubtype_str
                    macho_features.filetype_str,          # filetype_str
                    macho_features.flags_str,             # flags_str
                    # Other fields
                    macho_features.is_64bit,              # is_64bit
                    macho_features.is_signed,             # is_signed
                    macho_features.entry_point if macho_features.entry_point else None,           # entry_point
                    macho_features.uuid if macho_features.uuid else None,  # uuid
                    json.dumps(macho_features.version_info) if macho_features.version_info else "{}",  # version_info
                    json.dumps(macho_features.version_info_str) if macho_features.version_info_str else "{}",  # version_info_str
                    macho_features.load_commands_set,     # load_commands_set
                    macho_features.number_of_segments,    # number_of_segments
                    macho_features.number_of_dylibs,      # number_of_dylibs
                    macho_features.number_of_imports,     # number_of_imports
                    macho_features.number_of_exports,     # number_of_exports
                    current_time,                         # analysis_date
                ])

            column_names = [
                'sha256', 'architecture',
                # Raw values
                'magic', 'cputype', 'cpusubtype', 'filetype', 'ncmds', 'sizeofcmds', 'flags',
                # Human-readable values
                'magic_str', 'cputype_str', 'cpusubtype_str', 'filetype_str', 'flags_str',
                # Other fields
                'is_64bit', 'is_signed',
                'entry_point', 'uuid', 'version_info', 'version_info_str', 'load_commands_set',
                'number_of_segments', 'number_of_dylibs', 'number_of_imports', 'number_of_exports',
                'analysis_date'
            ]

            if not data:
                return None

            column_type_names = [
                'FixedString(64)', 'Nullable(UInt32)',
                # Raw values
                'UInt32', 'UInt32', 'UInt32', 'UInt32', 'UInt32', 'UInt32', 'UInt32',
                # Human-readable values
                'LowCardinality(String)', 'LowCardinality(String)', 'LowCardinality(String)', 'LowCardinality(String)', 'Array(LowCardinality(String))',
                # Other fields
                'UInt8', 'UInt8',
                'Nullable(UInt64)', 'Nullable(String)', 'JSON', 'JSON', 'Array(Nullable(String))',
                'UInt32', 'UInt32', 'UInt32', 'UInt32', 'DateTime64(3, \'UTC\')'
            ]

            return (data, column_names, column_type_names)
        
        return None

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