Nelson Piedra

47 papers B 3C 22Journal 10Unranked 12
YearRankTypeTitle / Venue / Authors
2023 J jnl
Computer
Mary Sánchez-Gordón, Edmundo Tovar, Ricardo Colomo-Palacios, Nelson Piedra, Manuel Castro
2023 C conf
EDUCON
Edmundo Tovar, Bernardo Tabuenca, Wolfgang Greller, Nelson Piedra, Anna Friesel
2021 J jnl
CLEI Electron. J.
Mónica Calva, Nelson Piedra
2021 conf
CISETC
René Elizalde-Solano, Ma. Carmen Cabrera-Loayza, Elizabeth Cadme, Nelson Piedra
2020 conf
KGSWC
José Eduardo Eguiguren Palacios, Nelson Piedra
2020 C conf
EDUCON
Edmundo Tovar, Bernardo Tabuenca, Nelson Piedra
2020 C conf
CLEI
Mónica Calva, Nelson Piedra
2019 C conf
EDUCON
Audrey Romero Pelaez, Veronica Segarra-Faggioni, Nelson Piedra, Edmundo Tovar
2019 B conf
ICALT
André Herrera, Lady Yaguachi, Nelson Piedra
2019 conf
ONTOBRAS
José Eduardo Eguiguren Palacios, Nelson Piedra
2019 C conf
EDUCON
Edmundo Tovar, Bernardo Tabuenca, Ahmed Alzaghoul, Carlos Delgado Kloos, Jim Sluss, África Lopez-Rey, Elena Ruiz Larrocha, Félix García Loro, Elio San Cristóbal, Miguel Rodríguez-Artacho, Sergio Martín, Manuel Castro, Russ Meier, Nelson Piedra
2019 conf
APPIS
Janneth Chicaiza, Mariela Tapia-León, Nelson Piedra, Jorge López-Vargas, Edmundo Tovar Caro
2019 C conf
FIE
Edmundo Tovar Caro, Bernardo Tabuernca Arcilla, Nelson Piedra, Ignacio Noguerol Sicilia, Manuel Castro Gil
2018 conf
LWMOOCS
Elizabeth Cadme, Rene Elizalde, Ma. Carmen Cabrera-Loayza, Nelson Piedra
2018 C conf
EDUCON
Janneth Chicaiza, Nelson Piedra, Jorge López-Vargas, Edmundo Tovar Caro
2018 conf
TALE
Nelson Piedra, Edmundo Tovar Caro
2018 C conf
EDUCON
Nelson Piedra, Edmundo Tovar Caro
2018 conf
IWSW
Victor Saquicela, Fernando Baculima, Gerardo Orellana, Nelson Piedra, Marcos Orellana, Mauricio Espinoza
2018 conf
IWSW
Efren Narvaez, Nelson Piedra
2018 conf
IWSW
Alexander Sánchez, Nelson Piedra, Juan Carlos Morocho
2017 C conf
EDUCON
Nelson Piedra, Janneth Chicaiza, Jorge López-Vargas, Edmundo Tovar Caro
2017 J jnl
CoRR
Nelson Piedra, Janneth Chicaiza, Jorge López-Vargas, Edmundo Tovar
2017 C conf
EDUCON
Janneth Chicaiza, Nelson Piedra, Jorge López-Vargas, Edmundo Tovar Caro
2016 C conf
EDUCON
Janneth Chicaiza, Nelson Piedra, Jorge López-Vargas, Lilia Quituisaca, Fabricio Montano-Sosoranga, Paúl Medina, Edmundo Tovar Caro
2016 C conf
FIE
Nelson Piedra, Janneth Chicaiza, Jorge López-Vargas, Edmundo Tovar Caro
2016 C conf
EDUCON
Nelson Piedra, Janneth Chicaiza, Jorge López-Vargas, Edmundo Tovar Caro
2016 J jnl
J. Univers. Comput. Sci.
Hector R. Amado-Salvatierra, José Ramón Hilera, Salvador Otón Tortosa, Rocael Hernández Rizzardini, Nelson Piedra
2015 C conf
FIE
Janneth Chicaiza, Nelson Piedra, Jorge López-Vargas, Edmundo Tovar Caro
2015 J jnl
Rev. Iberoam. de Tecnol. del Aprendiz.
Jorge López-Vargas, Nelson Piedra, Janneth Chicaiza, Edmundo Tovar
2015 conf
CSEDU (Selected Papers)
Edmundo Tovar, Nelson Piedra, Jorge López-Vargas, Janneth Chicaiza
2015 conf
ITHET
Janneth Chicaiza, Nelson Piedra, Jorge López-Vargas, Edmundo Tovar Caro
2015 J jnl
J. Univers. Comput. Sci.
Nelson Piedra, Janneth Chicaiza, Jorge López-Vargas, Edmundo Tovar Caro
2015 C conf
EDUCON
Nelson Piedra, Janneth Chicaiza, Jorge López-Vargas, Edmundo Tovar Caro
2014 J jnl
Program
Nelson Piedra, Edmundo Tovar, Ricardo Colomo-Palacios, Jorge López-Vargas, Alexandra Janneth Chicaiza
2014 conf
KESW
Janneth Chicaiza, Nelson Piedra, Jorge López-Vargas, Edmundo Tovar Caro
2014 J jnl
IEEE Trans. Educ.
Edmundo Tovar Caro, Nelson Piedra
2014 C conf
FIE
Jorge López-Vargas, Nelson Piedra, Janneth Chicaiza, Edmundo Tovar
2014 C conf
FIE
Edmundo Tovar Caro, Nelson Piedra, Jorge López-Vargas, Janneth Chicaiza
2014 C conf
EDUCON
Nelson Piedra, Janneth Chicaiza, Jorge López-Vargas, Edmundo Tovar Caro
2013 C conf
EDUCON
Edmundo Tovar Caro, Ana Dimovska, Nelson Piedra, Janneth Chicaiza
2013 C conf
FIE
Nelson Piedra, Janneth Chicaiza, Jorge López-Vargas, Edmundo Tovar
2012 J jnl
J. Univers. Comput. Sci.
Edmundo Tovar Caro, Nelson Piedra, Janneth Chicaiza, Jorge López-Vargas, Oscar Martínez Bonastre
2012 C conf
EDUCON
Nelson Piedra, Janneth Chicaiza, Jorge López-Vargas, Edmundo Tovar, Oscar Martínez Bonastre
2010 B conf
ICALT
Nelson Piedra, Janneth Chicaiza, Jorge López-Vargas, Edmundo Tovar Caro, Oscar Martínez Bonastre
2010 J jnl
IET Softw.
Janneth Chicaiza, Jorge López-Vargas, Nelson Piedra, Oscar Martínez Bonastre, Edmundo Tovar Caro
2009 B conf
ICALT
Nelson Piedra, Janneth Chicaiza, Edmundo Tovar Caro, Oscar Martínez Bonastre
2009 C conf
EATIS
Nelson Piedra, Janneth Chicaiza, Jorge López-Vargas, Edmundo Tovar Caro, Oscar Martínez Bonastre
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"