Nariman Farvardin

81 papers A 1B 13Misc 13Journal 41Unranked 13
YearRankTypeTitle / Venue / Authors
2023 J jnl
IEEE Commun. Mag.
Min Song, Nariman Farvardin
2005 J jnl
EURASIP J. Adv. Signal Process.
Andres Kwasinski, Mehdi Alasti, K. J. Ray Liu, Nariman Farvardin
2004 conf
ICC
Guan-Ming Su, Zhu Han, Andres Kwasinski, Min Wu, K. J. Ray Liu, Nariman Farvardin
2004 B conf
WCNC
Andres Kwasinski, Nariman Farvardin
2003 B conf
ITW
Andres Kwasinski, Vinay Chande, Nariman Farvardin
2003 B conf
WCNC
Andres Kwasinski, Zhu Han, K. J. Ray Liu, Nariman Farvardin
2003 conf
ICC
Andres Kwasinski, Nariman Farvardin
2001 J jnl
IEEE Trans. Inf. Theory
Mehdi Alasti, Kamran Sayrafian-Pour, Anthony Ephremides, Nariman Farvardin
2000 B conf
WCNC
Mehdi Alasti, Nariman Farvardin
2000 J jnl
IEEE Trans. Inf. Theory
Hamid Jafarkhani, Nariman Farvardin
2000 J jnl
IEEE Trans. Commun.
Hamid Jafarkhani, Nariman Farvardin
2000 J jnl
IEEE Trans. Inf. Theory
Paschalis Ligdas, Nariman Farvardin
2000 J jnl
IEEE J. Sel. Areas Commun.
Vinay Chande, Nariman Farvardin
2000 J jnl
IEEE J. Sel. Areas Commun.
Mehdi Alasti, Nariman Farvardin
1999 B conf
WCNC
Mehdi Alasti, Nariman Farvardin
1999 A conf
MSWiM
Mehdi Alasti, Nariman Farvardin
1999 J jnl
IEEE Trans. Image Process.
Hamid Jafarkhani, Nariman Farvardin
1999 conf
ICIP (2)
Vinay Chande, Nariman Farvardin, Hamid Jafarkhani
1999 B conf
Data Compression Conference
Hugh Brunk, Nariman Farvardin
1999 B conf
Data Compression Conference
Vinay Chande, Nariman Farvardin
1998 B conf
Data Compression Conference
Vinay Chande, Nariman Farvardin
1998 J jnl
IEEE Trans. Image Process.
Hamid Jafarkhani, Nariman Farvardin
1998 Misc conf
ICASSP
Hamid Jafarkhani, Nariman Farvardin
1998 B conf
Data Compression Conference
Hugh Brunk, Nariman Farvardin
1998 conf
ICIP (1)
Eiji Atsumi, Nariman Farvardin
1997 J jnl
IEEE Trans. Image Process.
Rajan L. Joshi, Hamid Jafarkhani, James H. Kasner, Thomas R. Fischer, Nariman Farvardin, Michael W. Marcellin, Roberto H. Bamberger
1997 B conf
Data Compression Conference
Hamid Jafarkhani, Hugh Brunk, Nariman Farvardin
1997 J jnl
IEEE Trans. Commun.
Nam Phamdo, Fady Alajaji, Nariman Farvardin
1996 conf
ICIP (3)
Hamid Jafarkhani, Nariman Farvardin
1996 J jnl
IEEE Trans. Inf. Theory
Fady Alajaji, Nam Phamdo, Nariman Farvardin, Thomas E. Fuja
1996 B conf
Data Compression Conference
Hamid Jafarkhani, Nariman Farvardin
1996 B conf
Data Compression Conference
Hugh Brunk, Nariman Farvardin
1995 J jnl
IEEE Trans. Image Process.
Xiaonong Ran, Nariman Farvardin
1995 J jnl
IEEE Trans. Image Process.
Xiaonong Ran, Nariman Farvardin
1995 conf
ICIP (3)
Hamid Jafarkhani, Nariman Farvardin
1995 B conf
ICIP
Hiroshi Ito, Nariman Farvardin
1995 Misc conf
ICASSP
Hiroshi Ito, Nariman Farvardin
1995 J jnl
IEEE Trans. Image Process.
Christine Podilchuk, Nikil Jayant, Nariman Farvardin
1994 conf
ICIP (3)
Hamid Jafarkhani, Nariman Farvardin, C.-C. Lee
1994 conf
ICIP (1)
Nariman Farvardin, F. Camurat, Rajiv Laroia
1994 conf
ICIP (1)
Xiaonong Ran, Nariman Farvardin
1994 J jnl
IEEE Trans. Inf. Theory
Rajiv Laroia, Nariman Farvardin, Steven A. Tretter
1994 J jnl
IEEE Trans. Inf. Theory
Nam Phamdo, Nariman Farvardin
1994 J jnl
IEEE Trans. Inf. Theory
Nariman Farvardin
1994 J jnl
IEEE Trans. Inf. Theory
Rajiv Laroia, Nariman Farvardin
1993 conf
ICASSP (2)
Juan M. López-Soler, Nariman Farvardin
1993 J jnl
IEEE Trans. Commun.
Rajiv Laroia, Steven A. Tretter, Nariman Farvardin
1993 J jnl
IEEE Trans. Inf. Theory
Rajiv Laroia, Nariman Farvardin
1993 J jnl
IEEE Trans. Inf. Theory
Rajiv Laroia, Nariman Farvardin
1993 J jnl
IEEE Trans. Inf. Theory
Nam Phamdo, Nariman Farvardin, Takehiro Moriya
1993 conf
ICASSP (5)
Nariman Farvardin, Xiaonong Ran, C.-C. Lee
1993 J jnl
IEEE Trans. Speech Audio Process.
Yunus Hussain, Nariman Farvardin
1992 Misc conf
ICASSP
Xiaonong Ran, Nariman Farvardin
1992 Misc conf
ICASSP
Yunus Hussain, Nariman Farvardin
1992 J jnl
IEEE Trans. Inf. Theory
Vinay A. Vaishampayan, Nariman Farvardin
1992 J jnl
IEEE J. Sel. Areas Commun.
Naoto Tanabe, Nariman Farvardin
1992 J jnl
IEEE Trans. Inf. Theory
David M. Goblirsch, Nariman Farvardin
1992 conf
Coding And Quantization
Rajiv Laroia, Nariman Farvardin
1991 J jnl
IEEE Trans. Signal Process.
Yunus Hussain, Nariman Farvardin
1991 J jnl
IEEE Trans. Inf. Theory
Nariman Farvardin, Vinay A. Vaishampayan
1991 Misc conf
ICASSP
Christine Podilchuk, Nariman Farvardin
1991 J jnl
IEEE Trans. Inf. Theory
Nariman Farvardin, F. Y. Lin
1991 Misc conf
ICASSP
Rajiv Laroia, Nam Phamdo, Nariman Farvardin
1991 Misc conf
ICASSP
Yunus Hussain, Nariman Farvardin
1990 J jnl
IEEE Trans. Inf. Theory
Nariman Farvardin
1990 Misc conf
ICASSP
Nam Phamdo, Nariman Farvardin
1990 Misc conf
ICASSP
Xiaonong Ran, Nariman Farvardin
1990 J jnl
IEEE Trans. Commun.
Vinay A. Vaishampayan, Nariman Farvardin
1990 J jnl
IEEE Trans. Commun.
James W. Modestino, Daniel D. Harrison, Nariman Farvardin
1990 Misc conf
ICASSP
Naoto Tanabe, Nariman Farvardin
1989 Misc conf
ICASSP
Nariman Farvardin, Rajiv Laroia
1988 Misc conf
ICASSP
Noboru Sugamura, Nariman Farvardin
1988 J jnl
IEEE J. Sel. Areas Commun.
Noboru Sugamura, Nariman Farvardin
1987 J jnl
IEEE Trans. Inf. Theory
Nariman Farvardin, Vinay A. Vaishampayan
1986 J jnl
IEEE Trans. Inf. Theory
Nariman Farvardin, James W. Modestino
1986 J jnl
IEEE Trans. Inf. Theory
Nariman Farvardin, James W. Modestino
1985 J jnl
IEEE Trans. Commun.
James W. Modestino, Nariman Farvardin, Michael A. Ogrinc
1985 J jnl
IEEE Trans. Inf. Theory
Nariman Farvardin, James W. Modestino
1984 conf
ICC (1)
F. Azadegan, James W. Modestino, Nariman Farvardin
1984 Misc conf
ICASSP
James W. Modestino, Nariman Farvardin
1984 J jnl
IEEE Trans. Inf. Theory
Nariman Farvardin, James W. Modestino
redb/extractors/macho_extractors/macho_universal.py
← Index redb/extractors/macho_extractors/macho_universal.py python
import hashlib
import inspect
import json
from datetime import datetime, timezone
from typing import Any, List

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


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

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

    def _extract_universal_info(self):
        """Extract Universal/FAT binary architecture information using new API."""
        self.log.debug(inspect.currentframe().f_code.co_name)

        if not self.macho:
            return None

        try:
            # Parse at Universal level first (new API requirement)
            self.macho.parse()

            # Get architectures using new API
            architectures = self.macho.get_architectures()
            if not architectures:
                return None

            # Check if this is a FAT binary
            is_fat = len(architectures) > 1

            architecture_info = []

            # Extract info for each architecture
            for arch_name in architectures:
                try:
                    # Get general info for this architecture
                    general_info = self.macho.get_general_info(arch=arch_name)

                    # Get header info for this architecture
                    header_info = self.macho.get_macho_header(arch=arch_name)

                    # Get architecture-specific MachO instance for detailed analysis
                    arch_macho = self.macho.get_macho_for_arch(arch_name)

                    # Calculate architecture slice hash (if we can access the raw data)
                    arch_sha256 = None
                    arch_md5 = None
                    arch_sha1 = None

                    # For FAT binaries, try to get slice-specific info
                    if is_fat and arch_macho:
                        try:
                            # This would require access to the slice data
                            # For now, we'll use the general file info
                            arch_sha256 = general_info.get('SHA256', '') if general_info else ''
                            arch_md5 = general_info.get('MD5', '') if general_info else ''
                            arch_sha1 = general_info.get('SHA1', '') if general_info else ''
                        except Exception as e:
                            self.log.debug(f"Could not extract slice hash for {arch_name}: {e}")

                    architecture_info.append({
                        'architecture': arch_name,
                        'arch_sha256': arch_sha256,
                        'arch_md5': arch_md5,
                        'arch_sha1': arch_sha1,
                        'cputype': header_info.get('cputype') if header_info else None,
                        'cpusubtype': header_info.get('cpusubtype') if header_info else None,
                        'filetype': header_info.get('filetype') if header_info else None
                    })

                except Exception as e:
                    self.log.warning(f"Error extracting info for architecture {arch_name}: {e}")
                    continue

            # Create Universal dataclass
            macho_universal = MachOUniversal(
                is_fat=is_fat,
                architecture_count=len(architectures),
                architectures=architectures,
                architecture_info=architecture_info,
                fat_hash=self.sha256,
                fat_md5=self.md5,
                fat_sha1=self.sha1
            )

            return macho_universal

        except Exception as e:
            self.log.error(f"Error extracting MachO Universal info: {e}")
            return None

    def _extract_fat_architecture_mappings(self):
        """Extract detailed FAT binary architecture mappings for database relationships."""
        self.log.debug(inspect.currentframe().f_code.co_name)

        if not self.macho:
            return []

        try:
            # Parse at Universal level first
            self.macho.parse()

            # Get architectures using new API
            architectures = self.macho.get_architectures()
            if not architectures or len(architectures) <= 1:
                return []  # Not a FAT binary

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

            # For each architecture, create a mapping record
            for arch_name in architectures:
                try:
                    # Get general info
                    general_info = self.macho.get_general_info()

                    # Create mapping record for FAT binary architecture table
                    mapping = {
                        'fat_hash': self.sha256,  # SHA256 of the FAT binary
                        'architecture': arch_name,
                        'arch_sha256': general_info.get('SHA256', '') if general_info else '',  # Will need proper slice extraction
                        'arch_md5': general_info.get('MD5', '') if general_info else '',
                        'arch_sha1': general_info.get('SHA1', '') if general_info else '',
                        'arch_filename': f"{general_info.get('Filename', '')}.{arch_name}" if general_info else '',
                        'analysis_date': current_time
                    }
                    mappings.append(mapping)

                except Exception as e:
                    self.log.warning(f"Error creating mapping for architecture {arch_name}: {e}")
                    continue

            return mappings

        except Exception as e:
            self.log.error(f"Error extracting FAT architecture mappings: {e}")
            return []

    def extract(self):
        self.log.debug(inspect.currentframe().f_code.co_name)
        try:
            universal_info = self._extract_universal_info()
            return universal_info
        except Exception as e:
            self.log.error(f"Error extracting MachO Universal info: {e}")
            return None

    def extract_fat_binary_basic_properties_data(self):
        """Extract data needed for creating multiple BasicProperties records for FAT binaries.

        Returns:
            Tuple: (is_fat, fat_sha256, architectures_info) where:
                - is_fat: bool indicating if this is a FAT binary
                - fat_sha256: SHA256 of the FAT wrapper
                - architectures_info: dict with arch names and their hashes
        """
        self.log.debug(inspect.currentframe().f_code.co_name)

        if not self.macho:
            return False, None, {}

        try:
            # Parse at Universal level first
            self.macho.parse()

            # Get architectures using new API
            architectures = self.macho.get_architectures()
            if not architectures or len(architectures) <= 1:
                return False, None, {}  # Not a FAT binary

            # This is a FAT binary
            architectures_info = {}

            for arch_name in architectures:
                try:
                    # Get general info for this architecture
                    general_info = self.macho.get_general_info(arch=arch_name)

                    if general_info:
                        architectures_info[arch_name] = {
                            'sha256': general_info.get('SHA256', ''),
                            'md5': general_info.get('MD5', ''),
                            'sha1': general_info.get('SHA1', ''),
                            'filename': general_info.get('Filename', ''),
                            'filesize': general_info.get('Filesize', 0)
                        }
                except Exception as e:
                    self.log.warning(f"Error extracting info for architecture {arch_name}: {e}")
                    continue

            return True, self.sha256, architectures_info

        except Exception as e:
            self.log.error(f"Error extracting FAT binary data: {e}")
            return False, None, {}

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

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

            # Get architecture info for the binary
            try:
                if universal_info.is_fat:
                    # For FAT binaries, architecture fields should be NULL since it contains multiple
                    architecture_raw = None
                    architecture_str = None
                else:
                    # For single-arch binaries, get the actual architecture info
                    header_info = self.macho.get_macho_header()
                    architecture_raw = header_info.get('cputype', 0) if header_info else 0
                    architecture_str = universal_info.architectures[0] if universal_info.architectures else None
            except Exception as e:
                self.log.warning(f"Could not get architecture info for binary: {e}")
                architecture_raw = None
                architecture_str = None

            # Main Universal binary record
            data.append([
                self.sha256,                              # sha256
                self.md5,                                 # md5
                self.sha1,                                # sha1
                None,                                     # parent_sha256 (always None for main FAT binary)
                architecture_raw,                         # architecture (raw CPU type)
                architecture_str,                         # architecture_str (human-readable)
                universal_info.is_fat,                    # is_fat
                universal_info.architecture_count,       # architecture_count
                universal_info.architectures,            # architectures (array)
                json.dumps(universal_info.architecture_info[0] if len(universal_info.architecture_info) == 1 else {"architectures": universal_info.architecture_info}) if universal_info.architecture_info else None,  # architecture_info (JSON)
                current_time,                             # analysis_date
            ])

            column_names = [
                'sha256', 'md5', 'sha1', 'parent_sha256', 'architecture', 'architecture_str',
                'is_fat', 'architecture_count', 'architectures', 'architecture_info',
                'analysis_date'
            ]

            column_type_names = [
                'FixedString(64)', 'FixedString(32)', 'FixedString(40)',
                'Nullable(FixedString(64))', 'Nullable(UInt32)', 'LowCardinality(Nullable(String))',
                'UInt8', 'UInt32', 'Array(LowCardinality(String))', 'JSON',
                'DateTime64(3, \'UTC\')'
            ]

            return (data, column_names, column_type_names)

        return None

    def prepare_fat_architecture_export_data(self) -> Any:
        """Prepare export data for the FAT binary architecture mapping table."""
        mappings = self._extract_fat_architecture_mappings()
        if not mappings:
            return None

        data = []
        for mapping in mappings:
            data.append([
                mapping['fat_hash'],
                mapping['architecture'],
                mapping['arch_sha256'],
                mapping['arch_md5'],
                mapping['arch_sha1'],
                mapping['arch_filename'],
                mapping['analysis_date'],
            ])

        column_names = [
            'fat_hash', 'architecture', 'arch_sha256', 'arch_md5', 'arch_sha1',
            'arch_filename', 'analysis_date'
        ]

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

        return (data, column_names, column_type_names)

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

    # def get_fat_architecture_table(self) -> str:
    #     """Return table name for FAT binary architecture mappings."""
    #     return "redb_fat_binary_architectures"