Nader Moayeri

45 papers A 1B 12C 8Misc 4Journal 10Unranked 9
YearRankTypeTitle / Venue / Authors
2023 C conf
IPIN
Nader Moayeri
2021 C conf
IPIN
Lu Shi, Nader Moayeri, Chang Li
2021 conf
IPIN-WiP
Nader Moayeri
2019 J jnl
Ad Hoc Networks
Mohamed Kashef, Nader Moayeri
2019 B conf
WCNC
Nader Moayeri, Chang Li, Lu Shi
2018 C conf
IPIN
Nader Moayeri, Chang Li, Lu Shi
2018 C conf
WFCS
Mohamed Kashef, Nader Moayeri
2017 C conf
WFCS
Mehrdad Damsaz, Derek Guo, Jeff Peil, Wayne E. Stark, Nader Moayeri, Richard Candell
2017 J jnl
IEEE Internet Things J.
Ossama Younis, Nader Moayeri
2017 C conf
WFCS
Mohamed Kashef, Nader Moayeri
2016 C conf
WFCS
Yongkang Liu, Richard Candell, Kang Lee, Nader Moayeri
2016 conf
TE
Vitor Rozsa, Marta Denisczwicz, Moisés Lima Dutra, Parisa Ghodous, Catarina Ferreira Da Silva, Nader Moayeri, Frédérique Biennier, Nicolas Figay
2016 B conf
WCNC
Ossama Younis, Nader Moayeri
2016 B conf
PIMRC
Nader Moayeri, Mustafa Onur Ergin, Filip Lemic, Vlado Handziski, Adam Wolisz
2012 B conf
GLOBECOM
Camillo Gentile, Fabien Valoit, Nader Moayeri
2011 J jnl
IEEE Wirel. Commun.
Nader Moayeri, Jalal Mapar, Stefanie Tompkins, Kaveh Pahlavan
2010 conf
ICC
Hui Guo, Yi Qian, Kejie Lu, Nader Moayeri
2010 C conf
IAS
Michael R. Souryal, Fabien Valoit, Hui Guo, Nader Moayeri, Nicholas W. Damiano, David P. Snyder
2009 conf
ICC
Hui Guo, Yi Qian, Kejie Lu, Nader Moayeri
2009 B conf
GLOBECOM
Michael R. Souryal, Andreas Wapf, Nader Moayeri
2009 B conf
GLOBECOM
Hui Guo, Yi Qian, Kejie Lu, Nader Moayeri
2008 B conf
GLOBECOM
Yi Qian, Kejie Lu, Nader Moayeri
2008 conf
VTC Spring
Yi Qian, Nader Moayeri
2007 Misc conf
CISS
Aliye Özge Kaya, Larry J. Greenstein, Dmitry Chizhik, Reinaldo A. Valenzuela, Nader Moayeri
2007 A conf
MobiSys
Michael R. Souryal, Johannes Geissbuehler, Leonard E. Miller, Nader Moayeri
2006 B conf
WCNC
Michael R. Souryal, Luke Klein-Berndt, Leonard E. Miller, Nader Moayeri
2005 B conf
SECON
Michael R. Souryal, Nader Moayeri
2003 B conf
PIMRC
Ho Young Hwang, Nah-Oak Song, Dan Keun Sung, Nader Moayeri
2001 B conf
GLOBECOM
Hoon Choi, Nader Moayeri
1997 conf
ICIP (3)
Nasir D. Memon, Nader Moayeri
1997 Misc conf
ICASSP
Nader Moayeri, Konstantinos Konstantinides
1997 conf
COMPCON
Ping Wah Wong, Daniel Tretter, Cormac Herley, Nader Moayeri, Ruby B. Lee
1996 conf
ICIP (2)
Nader Moayeri
1996 B conf
Data Compression Conference
Ping Wah Wong, Nader Moayeri, Cormac Herley
1996 J jnl
IEEE Trans. Circuits Syst. Video Technol.
Robert E. Van Dyck, Thomas G. Marshall Jr., Melissa Chin, Nader Moayeri
1995 J jnl
IEEE Trans. Inf. Theory
Nader Moayeri
1994 J jnl
IEEE Trans. Speech Audio Process.
Nader Moayeri, David L. Neuhoff
1993 ed.
Coding And Quantization
A. Robert Calderbank, G. David Forney Jr., Nader Moayeri
1992 conf
Coding And Quantization
A. Robert Calderbank, G. David Forney Jr., Nader Moayeri
1992 J jnl
IEEE Trans. Commun.
Hong Shen Wang, Nader Moayeri
1992 Misc conf
ICASSP
Nader Moayeri, Ingrid Daubechies, Qing Song, Hong Shen Wang
1991 J jnl
IEEE J. Sel. Areas Commun.
Joseph Y. Hui, Melike Baykal-Gursoy, Nader Moayeri, Roy D. Yates
1991 J jnl
IEEE Trans. Signal Process.
Nader Moayeri, David L. Neuhoff, Wayne E. Stark
1991 J jnl
IEEE Trans. Inf. Theory
Nader Moayeri, David L. Neuhoff
1988 Misc conf
ICASSP
Nader Moayeri, David L. Neuhoff
redb/extractors/extractor.py
← Index redb/extractors/extractor.py python
import hashlib
import inspect
from abc import ABCMeta, abstractmethod
from dataclasses import asdict
from functools import cached_property
from datetime import datetime, timezone
import math
from typing import Counter, List, Optional, Dict, Any, Tuple
from redb import settings
from redb.models.dataclasses import Hash
from .database_exporters import DatabaseExporter, ElasticsearchExporter, ClickHouseExporter, PrintExporter

class Extractor(metaclass=ABCMeta):
    def __init__(
        self,
        filepath: str,
        log: Any,
        exporters: Optional[List[DatabaseExporter]] = None,
        index_prefix: Optional[str] = None,
        source: Optional[str] = None,
        elastic_index: Optional[str] = None,
        known_benign: bool = False,
        known_malicious: bool = False,
        precomputed_hashes: Optional[Dict[str, str]] = None,
    ):
        self.log = log
        self.log.debug(f"Creating {self.__class__.__name__}")
        self.filepath = filepath
        self.source = source
        self.exporters = exporters or []
        self.index_prefix = index_prefix if index_prefix else settings.ELASTIC_BINARIES_COLLECTION
        self.elastic_index = self.index_prefix + (elastic_index if elastic_index else "")
        self.known_benign = known_benign
        self.known_malicious = known_malicious

        # Use precomputed hashes if provided (e.g., from machofile, pefile)
        # Otherwise compute them from binary
        if precomputed_hashes:
            self.md5 = precomputed_hashes.get('md5') or precomputed_hashes.get('MD5')
            self.sha1 = precomputed_hashes.get('sha1') or precomputed_hashes.get('SHA1')
            self.sha256 = precomputed_hashes.get('sha256') or precomputed_hashes.get('SHA256')
        else:
            self.md5 = hashlib.md5(self.binary).hexdigest()
            self.sha1 = hashlib.sha1(self.binary).hexdigest()
            self.sha256 = hashlib.sha256(self.binary).hexdigest()
        self.hash = Hash(self.md5, self.sha1, self.sha256)

    @cached_property
    def binary(self):
        with open(self.filepath, "rb") as f:
            data = f.read()
        return data

    @property
    @abstractmethod
    def tag(self):
        pass

    @abstractmethod
    def extract(self):
        """
        this method defines the extracted data
        """

    @staticmethod
    def process_binary_string(s):
        # Remove \x00 padding
        s = s.rstrip(b"\x00")

        # Check if there are any non-printable characters
        has_non_printable = any(byte < 32 or byte > 126 for byte in s)

        if not has_non_printable:
            # If all characters are printable, decode the string
            return s.decode()
        else:
            # If there are non-printable characters, represent them as \xDD
            return "".join(
                [
                    f"\\x{byte:02x}" if byte < 32 or byte > 126 else chr(byte)
                    for byte in s
                ]
            )

    @staticmethod
    def remove_non_utf8(binary_string):
        decoded = b""
        for i in range(len(binary_string)):
            try:
                # Try to decode each byte
                char = binary_string[i : i + 1].decode("utf-8")
                decoded += char.encode("utf-8")
            except UnicodeDecodeError:
                # Skip this byte if it can't be decoded
                continue
        return decoded

    def calculate_entropy(self, data):
        """Calculate the entropy of a chunk of data.
        Based on pefile.SectionStructure.entropy_H.
        """
        # self.log.debug(inspect.currentframe().f_code.co_name)
        if not data:
            return 0.0

        if type(data) == str:
            counts = Counter(data)
            frequencies = ((i / len(data)) for i in counts.values())
            return - sum(f * math.log(f, 2) for f in frequencies)
        else:
            occurences = Counter(bytearray(data))
            entropy = 0
            for x in occurences.values():
                p_x = float(x) / len(data)
                entropy -= p_x * math.log(p_x, 2)
            return entropy

    @abstractmethod
    def prepare_export_data(self, exporter_type: str) -> Tuple[List[Any], List[str], List[str]]:
        """
        Prepare data for specific export type
        Returns:
            Tuple containing:
            - data: List of values to insert
            - column_names: List of column names
            - column_type_names: List of column types
        """
        pass

    def export_data(self):
        """Export data to all configured exporters

        Returns:
            True: Export succeeded
            False: Export failed (actual error)
            None: No data to export (not an error, e.g., no overlay, no signature)
        """
        self.log.debug(inspect.currentframe().f_code.co_name)
        success = True
        extracted_data = self.extract()

        if extracted_data is None:
            self.log.debug("extract() returned None, skipping export")
            return None  # No data to export, not a failure
            
        for exporter in self.exporters:
            if isinstance(exporter, PrintExporter):
                # For PrintExporter, we pass the extracted data directly
                success &= exporter.export(extracted_data)
            else:
                # Get the data prepared for this specific exporter type
                export_data = self.prepare_export_data(exporter.__class__.__name__)
                
                if export_data is None:
                    self.log.debug(f"prepare_export_data returned None for {exporter.__class__.__name__}")
                    return False
                
                if isinstance(exporter, ElasticsearchExporter):
                    success &= exporter.export(
                        export_data,
                        index=self.elastic_index,
                        tag=self.tag(),
                        hashes=asdict(self.hash),
                        known_benign=self.known_benign,
                        known_malicious=self.known_malicious
                    )
                elif isinstance(exporter, ClickHouseExporter):
                    # For ClickHouse, we need to pass the table name and the prepared data
                    success &= exporter.export(
                        export_data,
                        table=self.get_clickhouse_table(),
                        # Add these parameters explicitly
                        column_names=export_data[1] if isinstance(export_data, tuple) else None,
                        column_type_names=export_data[2] if isinstance(export_data, tuple) else None
                    )
                
        return success

    @abstractmethod
    def get_clickhouse_table(self) -> str:
        """Return the appropriate ClickHouse table name"""
        pass
    # def export_to_elastic(self, list_of_dataclasses, tag=None):
    #     self.log.debug(inspect.currentframe().f_code.co_name)

    #     if not isinstance(list_of_dataclasses, list):
    #         self.log.error("Called export_to_elastic wrongly")

    #     now_t = datetime.now(timezone.utc).strftime("%Y-%m-%d %H:%M:%S")
    #     for dataclass_ in list_of_dataclasses:
    #         if not settings.ELASTIC_CLIENT.ping():
    #             self.log.error("[CONNECTION ERROR] ping to elastic failed")
            
    #         # Convert dataclass to dict and filter out None values
    #         document = {k: v for k, v in asdict(dataclass_).items() if v is not None}
            
    #         if tag:
    #             document["tag"] = [tag, self.tag()]
    #         else:
    #             document["tag"] = self.tag()
    #         hashes = asdict(self.hash)
    #         document |= hashes
    #         document["timestamp_utc"] = now_t
    #         # document["source"] = self.source
    #         document["known_benign"] = self.known_benign
    #         document["known_malicious"] = self.known_malicious

    #         if "_id" in document:
    #             tmp_id = document.pop("_id") + document["sha256"]
    #             _id = hashlib.sha256(tmp_id.encode()).hexdigest()
    #         else:
    #             _id = document["sha256"]

    #         # self.log.debug(f"[DEBUG] about to export {type(document)} {document}")
    #         try:
    #             doc_dump = json.dumps(document)
    #         except TypeError as e:
    #             self.log.error(
    #                 f"Failed export of document. " f"full document: {document}"
    #             )
    #             raise e

    #         # body={"doc": doc_dump,
    #         #       "doc_as_upsert": True  # Create the document if it doesn't exist
    #         # }

    #         # Check if the index exists, and create it if it doesn't
    #         # if not settings.ELASTIC_CLIENT.indices.exists(index=self.elastic_index):
    #         #     settings.ELASTIC_CLIENT.indices.create(index=self.elastic_index)
    #         # pprint(doc_dump) #DEBUG
    #         # print("[DEBUG] _id: " + _id)
    #         # print("[DEBUG] index: " + self.elastic_index)
    #         settings.ELASTIC_CLIENT.index(
    #             index=self.elastic_index, id=_id, document=doc_dump
    #         )