Mahshid Helali Moghadam

48 papers A 1B 4C 5Misc 1Journal 22Unranked 14
YearRankTypeTitle / Venue / Authors
2025 C conf
DSD
Frida Sundfeldt, Bianca Widstam, Mahshid Helali Moghadam, Kuo-Yun Liang, Anders Vesterberg
2025 J jnl
CoRR
Frida Sundfeldt, Bianca Widstam, Mahshid Helali Moghadam, Kuo-Yun Liang, Anders Vesterberg
2025 conf
AISoLA
Khashayar Etemadi, Marjan Sirjani, Mahshid Helali Moghadam, Per Erik Strandberg, Paul Pettersson
2025 J jnl
CoRR
Khashayar Etemadi, Marjan Sirjani, Mahshid Helali Moghadam, Per Erik Strandberg, Paul Pettersson
2025 C conf
PDP
Alireza Dehlaghi-Ghadim, Mona Moslemzade, Nima Pattiyampully Dharmapal, Niclas Ericsson, Mahshid Helali Moghadam, Ali Balador, Hans Hansson
2024 conf
EvoApplications@EvoStar
Seyed Jalaleddin Mousavirad, Diego Oliva, Gerald Schaefer, Mahshid Helali Moghadam, Mohammed El-Abd
2024 J jnl
CoRR
Mahshid Helali Moghadam, Mateusz Rzymowski, Lukasz Kulas
2024 C conf
ETFA
Arman Sheikhani, Ervin Agic, Mahshid Helali Moghadam, Juan Carlos Andresen, Anders Vesterberg
2024 J jnl
J. Softw. Evol. Process.
Mahshid Helali Moghadam, Markus Borg, Mehrdad Saadatmand, Seyed Jalaleddin Mousavirad, Markus Bohlin, Björn Lisper
2024 C conf
ETFA
Alireza Dehlaghi-Ghadim, Niclas Ericsson, Lars-Göran Magnusson, Mats Eriksson, Mahshid Helali Moghadam, Ali Balador, Hans Hansson
2023 J jnl
IEEE Access
Alireza Dehlaghi-Ghadim, Mahshid Helali Moghadam, Ali Balador, Hans Hansson
2023 J jnl
CoRR
Alireza Dehlaghi-Ghadim, Mahshid Helali Moghadam, Ali Balador, Hans Hansson
2023 J jnl
Softw. Qual. J.
Markus Borg, Jens Henriksson, Kasper Socha, Olof Lennartsson, Elias Sonnsjö Lönegren, Thanh Bui, Piotr Tomaszewski, Sankar Raman Sathyamoorthy, Sebastian Brink, Mahshid Helali Moghadam
2023 J jnl
Knowl. Based Syst.
Seyed Jalaleddin Mousavirad, Gerald Schaefer, Huiyu Zhou, Mahshid Helali Moghadam
2023 J jnl
Comput. Ind.
Alireza Dehlaghi-Ghadim, Ali Balador, Mahshid Helali Moghadam, Hans Hansson, Mauro Conti
2023 J jnl
CoRR
Muhammad Abbas, Ali Hamayouni, Mahshid Helali Moghadam, Mehrdad Saadatmand, Per Erik Strandberg
2022 J jnl
Softw. Qual. J.
Mahshid Helali Moghadam, Mehrdad Saadatmand, Markus Borg, Markus Bohlin, Björn Lisper
2022 J jnl
CoRR
Markus Borg, Jens Henriksson, Kasper Socha, Olof Lennartsson, Elias Sonnsjö Lönegren, Thanh Bui, Piotr Tomaszewski, Sankar Raman Sathyamoorthy, Sebastian Brink, Mahshid Helali Moghadam
2022
Mahshid Helali Moghadam
2022 J jnl
CoRR
Mahshid Helali Moghadam, Markus Borg, Mehrdad Saadatmand, Seyed Jalaleddin Mousavirad, Markus Bohlin, Björn Lisper
2022 B conf
EvoApplications
Seyed Jalaleddin Mousavirad, Mahshid Helali Moghadam, Mehrdad Saadatmand, Ripon K. Chakrabortty, Gerald Schaefer, Diego Oliva
2021 conf
GECCO Companion
Seyed Jalaleddin Mousavirad, Gerald Schaefer, Mahshid Helali Moghadam, Mehrdad Saadatmand, Mahdi Pedram
2021 B conf
SMC
Seyed Jalaleddin Mousavirad, Gerald Schaefer, Iakov Korovin, Mahshid Helali Moghadam, Mehrdad Saadatmand, Mahdi Pedram
2021 J jnl
CoRR
Seyed Jalaleddin Mousavirad, Gerald Schaefer, Iakov Korovin, Mahshid Helali Moghadam, Mehrdad Saadatmand, Mahdi Pedram
2021 conf
ICONIP (3)
Seyed Vahid Moravvej, Seyed Jalaleddin Mousavirad, Mahshid Helali Moghadam, Mehrdad Saadatmand
2021 J jnl
CoRR
Seyed Vahid Moravvej, Seyed Jalaleddin Mousavirad, Mahshid Helali Moghadam, Mehrdad Saadatmand
2021 C conf
AST
Ali Sedaghatbaf, Mahshid Helali Moghadam, Mehrdad Saadatmand
2021 J jnl
CoRR
Ali Sedaghatbaf, Mahshid Helali Moghadam, Mehrdad Saadatmand
2021 conf
SBST@ICSE
Mahshid Helali Moghadam, Markus Borg, Seyed Jalaleddin Mousavirad
2021 conf
AITest
Hamid Ebadi, Mahshid Helali Moghadam, Markus Borg, Gregory Gay, Afonso Fontes, Kasper Socha
2021 J jnl
CoRR
Hamid Ebabi, Mahshid Helali Moghadam, Markus Borg, Gregory Gay, Afonso Fontes, Kasper Socha
2021 conf
SSCI
Seyed Jalaleddin Mousavirad, Gerald Schaefer, Iakov Korovin, Diego Oliva, Mahshid Helali Moghadam, Mehrdad Saadatmand
2021 J jnl
CoRR
Seyed Jalaleddin Mousavirad, Gerald Schaefer, Iakov Korovin, Diego Oliva, Mahshid Helali Moghadam, Mehrdad Saadatmand
2021 B conf
CEC
Mahshid Helali Moghadam, Golrokh Hamidi, Markus Borg, Mehrdad Saadatmand, Markus Bohlin, Björn Lisper, Pasqualina Potena
2021 J jnl
CoRR
Mahshid Helali Moghadam, Golrokh Hamidi, Markus Borg, Mehrdad Saadatmand, Markus Bohlin, Björn Lisper, Pasqualina Potena
2021 J jnl
J. Internet Serv. Appl.
Marjan Sirjani, Luciana Provenzano, Sara Abbaspour Asadollah, Mahshid Helali Moghadam, Mehrdad Saadatmand
2020 B conf
SEFM
Marjan Sirjani, Luciana Provenzano, Sara Abbaspour Asadollah, Mahshid Helali Moghadam
2020 A conf
ICST
Mahshid Helali Moghadam, Mehrdad Saadatmand, Markus Borg, Markus Bohlin, Björn Lisper
2019 J jnl
CoRR
Mahshid Helali Moghadam, Mehrdad Saadatmand, Markus Borg, Markus Bohlin, Björn Lisper
2019 conf
ICST Workshops
Mahshid Helali Moghadam, Mehrdad Saadatmand, Markus Borg, Markus Bohlin, Björn Lisper
2019 conf
ESEC/SIGSOFT FSE
Mahshid Helali Moghadam
2018 conf
SEAMS@ICSE
Mahshid Helali Moghadam, Mehrdad Saadatmand, Markus Borg, Markus Bohlin, Björn Lisper
2018 conf
ICST Workshops
Mahshid Helali Moghadam, Mehrdad Saadatmand, Markus Borg, Markus Bohlin, Björn Lisper
2018 conf
SQUADE@ICSE
Mahshid Helali Moghadam, Mehrdad Saadatmand, Markus Borg, Markus Bohlin, Björn Lisper
2018 J jnl
J. Comput. Sci.
Mahshid Helali Moghadam, Seyed Morteza Babamir
2017 Misc conf
UCC
Olumuyiwa Ibidunmoye, Mahshid Helali Moghadam, Ewnetu Bayuh Lakew, Erik Elmroth
2016 conf
LCN Workshops
Mahshid Helali Moghadam, Seyed Morteza Babamir, Meghdad Mirabi
2016 conf
IIT
Foroogh Sedighi, Mahshid Helali Moghadam
redb/extractors/macho_extractors/macho_exports.py
← Index redb/extractors/macho_extractors/macho_exports.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 MachOExport


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

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

    def _extract_exports(self, arch_name=None):
        """Extract export information from the MachO binary for a specific architecture."""
        self.log.debug(inspect.currentframe().f_code.co_name)

        if not self.macho:
            return None

        try:
            # Get exported symbols using new API for specific architecture
            exported_symbols = self.macho.get_exported_symbols(arch=arch_name)

            # Extract all exported symbols (may be empty for some binaries)
            # Handle None or empty dict
            if not exported_symbols:
                exported_symbols = {}
            all_symbols = []
            for dylib_name, symbols in exported_symbols.items():
                # Process symbol names
                for symbol in symbols:
                    if isinstance(symbol, bytes):
                        symbol = symbol.decode('utf-8', errors='replace')
                    all_symbols.append(symbol)

            # Create export dataclass
            macho_export = MachOExport(
                macho_exports_total=len(all_symbols),
                macho_export_symbols=all_symbols  # Empty list is fine, but None is not allowed for Array type
            )

            return macho_export

        except Exception as e:
            self.log.error(f"Error extracting MachO exports 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 exports for each architecture
                results = []
                for arch_name in architectures:
                    exports = self._extract_exports(arch_name)
                    if exports:
                        exports.arch_identifier = arch_name
                        results.append(exports)
                return results
            else:
                # Single architecture - return single result
                return self._extract_exports(architectures[0] if architectures else None)
        except Exception as e:
            self.log.error(f"Error extracting MachO exports: {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

            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 exports for this architecture
                macho_export = self._extract_exports(arch_name)
                if not macho_export:
                    continue

                data.append([
                    arch_sha256,                          # sha256 (arch-specific)
                    macho_export.macho_exports_total,     # macho_exports_total
                    macho_export.macho_export_symbols,    # macho_export_symbols (keep as array!)
                    current_time,                         # analysis_date
                ])

            column_names = [
                'sha256',
                'macho_exports_total', 'macho_export_symbols',
                'analysis_date'
            ]

            if not data:
                return None

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

            return (data, column_names, column_type_names)

        return None

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