Wei Koong Chai

52 papers A* 1A 1B 6C 1Journal 31Unranked 12
YearRankTypeTitle / Venue / Authors
2025 J jnl
Appl. Netw. Sci.
Jing-Lin Duanmu, Wei Koong Chai
2025 J jnl
Knowl. Based Syst.
Michael-Sam Vidza, Marcin Budka, Wei Koong Chai, Mark Thrush, Mickael Teixeira Alves
2025 J jnl
Appl. Netw. Sci.
Assemgul Kozhabek, Wei Koong Chai
2025 J jnl
Inf. Sci.
Michael-Sam Vidza, Marcin Budka, Wei Koong Chai, Mark Thrush, Mickael Teixeira Alves
2024 J jnl
IEEE Internet Things J.
Jiankang Zhang, Sheng Chen, Wei Koong Chai, Lajos Hanzo
2024 J jnl
CoRR
Michael-Sam Vidza, Marcin Budka, Wei Koong Chai, Mark Thrush, Mickael Teixeira Alves
2024 J jnl
IEEE Access
Assemgul Kozhabek, Wei Koong Chai, Ge Zheng
2023 J jnl
CoRR
Jiankang Zhang, Sheng Chen, Wei Koong Chai, Lajos Hanzo
2023 J jnl
Inf. Fusion
Ge Zheng, Wei Koong Chai, Jing-Lin Duanmu, Vasilis Katos
2023 J jnl
IEEE Trans. Intell. Transp. Syst.
Merkouris Karaliopoulos, Orestis Mastakas, Wei Koong Chai
2023 J jnl
Knowl. Based Syst.
Ge Zheng, Wei Koong Chai, Jiankang Zhang, Vasilis Katos
2022 J jnl
Expert Syst. Appl.
Ge Zheng, Wei Koong Chai, Vasilis Katos
2021 J jnl
Neurocomputing
Ge Zheng, Wei Koong Chai, Vasilis Katos, Michael Walton
2021 J jnl
IEEE Access
Dehao Wu, Wei Koong Chai
2021 conf
ICAC
Ge Zheng, Wei Koong Chai, Vasilis Katos
2020 J jnl
Comput. Networks
Guochang Yuan, Zichuan Xu, Binxu Yang, Weifa Liang, Wei Koong Chai, Daphné Tuncer, Alex Galis, George Pavlou, Guowei Wu
2019 J jnl
IEEE Syst. J.
Wei Koong Chai, George Pavlou, George Kamel, Konstantinos V. Katsaros, Ning Wang
2019 B conf
GLOBECOM
Ge Zheng, Wei Koong Chai, Vasilis Katos
2019 J jnl
Clust. Comput.
Mahmood Hosseini, Constantinos Marios Angelopoulos, Wei Koong Chai, Stéphane Kuendig
2018 conf
ICC
Binxu Yang, Zichuan Xu, Wei Koong Chai, Weifa Liang, Daphné Tuncer, Alex Galis, George Pavlou
2018 J jnl
IEEE Syst. J.
Binxu Yang, Konstantinos V. Katsaros, Wei Koong Chai, George Pavlou
2018 J jnl
IEEE Trans. Netw. Serv. Manag.
Binxu Yang, Wei Koong Chai, Zichuan Xu, Konstantinos V. Katsaros, George Pavlou
2018 A* conf
INFOCOM
Jian Li, Truong Khoa Phan, Wei Koong Chai, Daphné Tuncer, George Pavlou, David Griffin, Miguel Rio
2018 J jnl
IEEE Trans. Netw. Sci. Eng.
Wei Koong Chai
2018 J jnl
IEEE J. Sel. Areas Commun.
Chang Ge, Ning Wang, Wei Koong Chai, Hermann Hellwagner
2017 J jnl
Comput. Commun.
George Parisis, Vasilis Sourlas, Konstantinos V. Katsaros, Wei Koong Chai, George Pavlou, Ian Wakeman
2017 J jnl
IEEE/ACM Trans. Netw.
Wei Koong Chai, George Pavlou
2017 A conf
ITC
Wei Koong Chai, Vasilis Sourlas, George Pavlou
2016 B conf
Networking
Wei Koong Chai, Vaios Kyritsis, Konstantinos V. Katsaros, George Pavlou
2016 conf
CloudNet
Binxu Yang, Wei Koong Chai, George Pavlou, Konstantinos V. Katsaros
2015 J jnl
IEEE Trans. Smart Grid
Wei Koong Chai, Ning Wang, Konstantinos V. Katsaros, George Kamel, George Pavlou, Stijn Melis, Michael Hoefling, Bárbara Vieira, Paolo Romano, Styliani Sarri, Teklemariam Tsegay Tesfay, Binxu Yang, Florian Heimgaertner, Marco Pignati, Mario Paolone, Michael Menth, Erik Poll, Marcel Mampaey, Herman H. I. Bontius, Chris Develder
2015 conf
ICN
Konstantinos V. Katsaros, Wei Koong Chai, George Pavlou
2015 conf
ICN
Wei Koong Chai, Konstantinos V. Katsaros, Matthias Strobbe, Paolo Romano, Chang Ge, Chris Develder, George Pavlou, Ning Wang
2015 conf
CCDWN@CoNEXT
George Parisis, Vasilis Sourlas, Konstantinos V. Katsaros, Wei Koong Chai, George Pavlou
2014 J jnl
IEEE Trans. Parallel Distributed Syst.
Ioannis Psaras, Wei Koong Chai, George Pavlou
2014 J jnl
IEEE Netw.
Konstantinos V. Katsaros, Wei Koong Chai, Ning Wang, George Pavlou, Herman Bontius, Mario Paolone
2014 conf
SmartGridComm
Konstantinos V. Katsaros, Binxu Yang, Wei Koong Chai, George Pavlou
2014 C conf
QSHINE
Konstantinos V. Katsaros, Wei Koong Chai, Bárbara Vieira, George Pavlou
2013 J jnl
Comput. Commun.
Wei Koong Chai, Diliang He, Ioannis Psaras, George Pavlou
2013 J jnl
Ann. des Télécommunications
George Pavlou, Ning Wang, Wei Koong Chai, Ioannis Psaras
2013 J jnl
Ann. des Télécommunications
Andrzej Beben, Jordi Mongay Batalla, Wei Koong Chai, Jaroslaw Sliwinski
2012 B conf
Networking (1)
Wei Koong Chai, Diliang He, Ioannis Psaras, George Pavlou
2012 conf
ICN
Ioannis Psaras, Wei Koong Chai, George Pavlou
2011 J jnl
IEEE Commun. Mag.
Wei Koong Chai, Ning Wang, Ioannis Psaras, George Pavlou, Chaojiong Wang, Gerardo García-de-Blas, Francisco Javier Ramón-Salguero, Lei Liang, Spiros Spirou, Andrzej Beben, Eleftheria Hadjioannou
2011 B conf
Networking (1)
Ioannis Psaras, Richard G. Clegg, Raul Landa, Wei Koong Chai, George Pavlou
2010 B conf
GLOBECOM
Javier Rubio-Loyola, Antonio Astorga, Joan Serrat, Wei Koong Chai, Lefteris Mamatas, Alex Galis, Stuart Clayman, Abderhaman Cheniour, Laurent Lefèvre, Olivier Mornard, Andreas Fischer, Alexandru Paler, Hermann de Meer
2009 conf
AIMS
Wei Koong Chai, Kin-Hon Ho, Marinos Charalambides, George Pavlou
2009 J jnl
IEEE Trans. Wirel. Commun.
Wei Koong Chai, Merkourios Karaliopoulos, George Pavlou
2007 conf
NEW2AN
Wei Koong Chai, George Pavlou
2007 conf
WWIC
Wei Koong Chai, Merkourios Karaliopoulos, George Pavlou
2006 conf
NEW2AN
Wei Koong Chai, Kin-Hon Ho, George Pavlou
2005 B conf
GLOBECOM
Wei Koong Chai, Merkourios Karaliopoulos, George Pavlou
redb/extractors/macho_extractor.py
← Index redb/extractors/macho_extractor.py python
import logging
from abc import ABCMeta, abstractmethod
import inspect
import sys
import os

import machofile

from redb.extractors.extractor import Extractor

logger = logging.getLogger(__name__)


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

    def __init__(
        self,
        filepath,
        log,
        exporters=None,
        index_prefix=None,
        elastic_index=None,
        known_benign=False,
        known_malicious=False,
        macho=None,
    ):
        # Read binary and parse machofile BEFORE calling super().__init__
        # This avoids reading the file twice
        with open(filepath, "rb") as f:
            binary_data = f.read()

        # Parse machofile with binary data
        self.macho = macho if macho else self._generate_machofile_object(binary_data)

        # Extract hashes from machofile to pass to parent
        precomputed_hashes = None
        if self.macho:
            try:
                general_info = self.macho.get_general_info()
                if general_info:
                    # For FAT binaries, get_general_info() returns dict with 'fat' key
                    # For single-arch, it returns the info directly
                    if 'fat' in general_info:
                        fat_info = general_info['fat']
                        precomputed_hashes = {
                            'MD5': fat_info.get('MD5'),
                            'SHA1': fat_info.get('SHA1'),
                            'SHA256': fat_info.get('SHA256'),
                        }
                    else:
                        precomputed_hashes = {
                            'MD5': general_info.get('MD5'),
                            'SHA1': general_info.get('SHA1'),
                            'SHA256': general_info.get('SHA256'),
                        }
            except Exception as e:
                logger.debug(f"Could not get hashes from machofile: {e}")

        super().__init__(
            filepath,
            log,
            exporters,
            index_prefix,
            elastic_index,
            known_benign,
            known_malicious,
            precomputed_hashes=precomputed_hashes,
        )

        # Store binary data so base class doesn't re-read
        self._binary_data = binary_data

    @property
    def binary(self):
        """Override to use already-read binary data."""
        return self._binary_data

    def _generate_machofile_object(self, binary_data):
        """Generate and parse a machofile object from binary data."""
        macho = None
        try:
            macho = machofile.UniversalMachO(data=binary_data)
            if not macho:
                raise Exception("Empty file?")

            # Parse the MachO object once during initialization
            macho.parse()

        except Exception as e:
            logger.error(f"Format error parsing MachO: {e}")
        return macho

    # def _is_macho_file(self):
    #     """Check if the file is a valid Mach-O binary."""
    #     try:
    #         if not self.macho:
    #             return False
            
    #         # For Universal/FAT binaries, check if any architecture is valid
    #         if hasattr(self.macho, 'is_fat') and self.macho.is_fat:
    #             return len(self.macho.architectures) > 0
    #         else:
    #             # Single architecture binary
    #             return hasattr(self.macho, 'macho') and self.macho.macho is not None
    #     except Exception as e:
    #         self.log.error(f"Error checking Mach-O file: {e}")
    #         return False

    def _is_signed(self):
        """Check if the Mach-O binary is code signed using new API."""
        try:
            if not self.macho:
                return False

            # Get architectures using new API
            architectures = self.macho.get_architectures()

            # For each architecture, check if signed
            for arch in architectures:
                try:
                    signature_info = self.macho.get_code_signature_info(arch=arch)
                    if signature_info and signature_info.get('signed', False):
                        return True
                except Exception:
                    continue

            return False
        except Exception as e:
            self.log.error(f"Error checking Mach-O signature: {e}")
            return False

    def _get_architectures(self):
        """Get list of architectures in the Mach-O binary using new API."""
        try:
            if not self.macho:
                return []

            # Use new API method
            architectures = self.macho.get_architectures()
            return architectures if architectures else []
        except Exception as e:
            self.log.error(f"Error getting architectures: {e}")
            return []

    # def _get_macho_for_arch(self, arch_name=None):
    #     """Get MachO instance for specific architecture or default."""
    #     try:
    #         if not self.macho:
    #             return None
            
    #         if hasattr(self.macho, 'is_fat') and self.macho.is_fat:
    #             if arch_name:
    #                 return self.macho.architectures.get(arch_name)
    #             else:
    #                 # Return first available architecture
    #                 return next(iter(self.macho.architectures.values())) if self.macho.architectures else None
    #         else:
    #             # Single architecture binary
    #             return self.macho.macho if hasattr(self.macho, 'macho') else None
    #     except Exception as e:
    #         self.log.error(f"Error getting MachO for architecture: {e}")
    #         return None

    # def _get_formatted_header_values(self, header):
    #     """Get both raw and human-readable header values."""
    #     try:
    #         macho_instance = self._get_macho_for_arch()
    #         if not macho_instance:
    #             return None
            
    #         # Parse the MachO if not already parsed
    #         if not hasattr(macho_instance, 'header') or not macho_instance.header:
    #             macho_instance.parse()
            
    #         # Get human-readable values using machofile's formatting methods
    #         magic_str = macho_instance.format_magic_value(header.get('magic', 0))
            
    #         # Simple CPU type mapping since CPU_TYPE_MAP is not exposed
    #         cputype = header.get('cputype', 0)
    #         if cputype == 0x7:
    #             cputype_str = "x86"
    #         elif cputype == 0x1000007:
    #             cputype_str = "x86_64"
    #         elif cputype == 0xC:
    #             cputype_str = "ARM"
    #         elif cputype == 0x100000C:
    #             cputype_str = "ARM 64-bit"
    #         else:
    #             cputype_str = str(cputype)
            
    #         cpusubtype_str = macho_instance.decode_cpusubtype(header.get('cputype', 0), header.get('cpusubtype', 0))
    #         filetype_str = macho_instance.format_file_type(header.get('filetype', 0))
    #         flags_str = macho_instance.decode_flags(header.get('flags', 0))
            
    #         return {
    #             'raw': {
    #                 'magic': header.get('magic', 0),
    #                 'cputype': header.get('cputype', 0),
    #                 'cpusubtype': header.get('cpusubtype', 0),
    #                 'filetype': header.get('filetype', 0),
    #                 'flags': header.get('flags', 0),
    #             },
    #             'formatted': {
    #                 'magic_str': magic_str,
    #                 'cputype_str': cputype_str,
    #                 'cpusubtype_str': cpusubtype_str,
    #                 'filetype_str': filetype_str,
    #                 'flags_str': flags_str,
    #             }
    #         }
    #     except Exception as e:
    #         self.log.error(f"Error formatting header values: {e}")
    #         return None