Olivier Besson

156 papers C 1Misc 19Journal 115Unranked 20
YearRankTypeTitle / Venue / Authors
2026 J jnl
Signal Process.
Olivier Besson
2025 J jnl
IEEE Signal Process. Lett.
Olivier Besson
2025 J jnl
Signal Process.
Olivier Besson
2024 J jnl
Signal Process.
Olivier Besson
2024 J jnl
IEEE Signal Process. Lett.
Olivier Besson
2023 J jnl
IEEE Signal Process. Lett.
Olivier Besson
2023 J jnl
IEEE Trans. Aerosp. Electron. Syst.
Olivier Besson
2023 J jnl
IEEE Signal Process. Lett.
François Vincent, Olivier Besson, Benjamin Gigleux, Eric Chaumette
2023 J jnl
Signal Process.
Benjamin Gigleux, François Vincent, Olivier Besson, Eric Chaumette
2023 J jnl
IEEE Trans. Signal Process.
Olivier Besson
2022 J jnl
IEEE Trans. Signal Process.
Olivier Besson, François Vincent
2022 J jnl
IEEE Trans. Geosci. Remote. Sens.
Corinne Mailhes, Olivier Besson, Amandine Guillot, Sophie Le Gac
2021 J jnl
Signal Process.
Olivier Besson, François Vincent, Stefania Matteoli
2021 J jnl
Signal Process.
François Vincent, Olivier Besson, Stefania Matteoli
2021 J jnl
IEEE Trans. Signal Process.
Olivier Besson
2021 J jnl
Signal Process.
Olivier Besson
2021 J jnl
Signal Process.
François Vincent, Olivier Besson
2021 J jnl
Signal Process.
François Vincent, Olivier Besson
2020 J jnl
IEEE Signal Process. Lett.
Olivier Besson
2020 J jnl
Signal Process.
Olivier Besson
2020 J jnl
IEEE Trans. Signal Process.
Olivier Besson
2020 J jnl
Signal Process.
François Vincent, Jordi Vilà-Valls, Olivier Besson, Daniel Medina, Eric Chaumette
2020 J jnl
Signal Process.
François Vincent, Olivier Besson
2020 C conf
IGARSS
Corinne Mailhes, Olivier Besson, Amandine Guillot, Sophie Le Gac
2020 J jnl
Signal Process.
Olivier Besson
2020 J jnl
IEEE Signal Process. Lett.
François Vincent, Olivier Besson
2020 J jnl
IEEE Trans. Geosci. Remote. Sens.
François Vincent, Olivier Besson
2020 J jnl
Signal Process.
Olivier Besson, François Vincent
2020 J jnl
Signal Process.
Olivier Besson, François Vincent
2019 J jnl
IEEE Trans. Signal Process.
Pia Addabbo, Olivier Besson, Danilo Orlando, Giuseppe Ricci
2019 J jnl
IEEE Trans. Signal Process.
Angelo Coluccia, Giuseppe Ricci, Olivier Besson
2019 J jnl
IEEE Signal Process. Lett.
Olivier Besson
2019 conf
CAMSAP
François Vincent, Olivier Besson
2018 J jnl
Signal Process.
Olivier Besson
2017 J jnl
Signal Process.
François Vincent, Frédéric Pascal, Olivier Besson
2017 conf
CAMSAP
François Vincent, Olivier Besson, Eric Chaumette
2017 J jnl
IEEE Trans. Signal Process.
Olivier Besson, Angelo Coluccia, Eric Chaumette, Giuseppe Ricci, François Vincent
2017 conf
EUSIPCO
François Vincent, Eric Chaumette, Olivier Besson
2016 J jnl
IEEE Trans. Signal Process.
Olivier Besson
2016 Misc conf
ACSSC
Olivier Besson
2016 J jnl
IEEE Trans. Signal Process.
Yuri I. Abramovich, Olivier Besson, Ben A. Johnson
2016 J jnl
Signal Process.
Olivier Besson, Yuri I. Abramovich, Ben A. Johnson
2016 Misc conf
ICASSP
Pu Wang, Hongbin Li, Olivier Besson, Jun Fang
2016 conf
GlobalSIP
François Vincent, Olivier Besson, S. Abakar-Issakha, F. Bodereau, Laurent Ferro-Famil
2015 J jnl
IEEE Trans. Signal Process.
Francesco Bandiera, Olivier Besson, Angelo Coluccia, Giuseppe Ricci
2015 conf
CAMSAP
Olivier Besson, Eric Chaumette, François Vincent
2015 J jnl
IEEE Signal Process. Lett.
François Vincent, Olivier Besson, Eric Chaumette
2015 J jnl
Signal Process.
Marie Lasserre, Stéphanie Bidon, Olivier Besson, François Le Chevalier
2015 J jnl
IEEE Trans. Signal Process.
Yuri I. Abramovich, Olivier Besson, Ben A. Johnson
2015 J jnl
IEEE Signal Process. Lett.
Yuri I. Abramovich, Olivier Besson
2015 conf
EUSIPCO
Yuri I. Abramovich, Ben A. Johnson, Olivier Besson
2015 J jnl
IEEE Signal Process. Lett.
Olivier Besson
2015 J jnl
Signal Process.
Eric Chaumette, François Vincent, Olivier Besson
2015 J jnl
IEEE Signal Process. Lett.
Yuri I. Abramovich, Olivier Besson
2015 J jnl
IEEE Signal Process. Lett.
Olivier Besson, Yuri I. Abramovich
2014 J jnl
IEEE Signal Process. Lett.
Olivier Besson, Yuri I. Abramovich
2014 J jnl
Signal Process.
François Vincent, Olivier Besson, Eric Chaumette
2014 ch.
Optimal Transport
Olivier Besson, Martine Picq, Jérôme Poussin
2014 J jnl
J. Multivar. Anal.
Olivier Besson, Yuri I. Abramovich
2013 J jnl
IEEE Trans. Signal Process.
Olivier Besson, Stéphanie Bidon
2013 conf
CAMSAP
François Vincent, Olivier Besson, Eric Chaumette
2013 Misc conf
ICASSP
Olivier Besson, Stéphanie Bidon
2013 Misc conf
ICASSP
Yuri I. Abramovich, Olivier Besson
2013 Misc conf
ACSSC
Olivier Besson, Yuri I. Abramovich
2013 J jnl
IEEE Signal Process. Lett.
Olivier Besson, Yuri I. Abramovich
2013 J jnl
IEEE Trans. Signal Process.
Yuri I. Abramovich, Olivier Besson
2013 J jnl
IEEE Trans. Signal Process.
Olivier Besson, Yuri I. Abramovich
2013 J jnl
Signal Process.
Olivier Besson, Stéphanie Bidon
2013 J jnl
IEEE Trans. Aerosp. Electron. Syst.
Francois Deudon, Stéphanie Bidon, Olivier Besson, Jean-Yves Tourneret
2012 conf
ACSCC
Francesco Bandiera, Olivier Besson, Giuseppe Ricci
2012 conf
SSP
Olivier Besson, Stéphanie Bidon
2012 Misc conf
ICASSP
Olivier Besson, Nicolas Dobigeon, Jean-Yves Tourneret
2012 J jnl
IEEE Trans. Signal Process.
Olivier Besson, Nicolas Dobigeon, Jean-Yves Tourneret
2011 J jnl
IEEE Trans. Signal Process.
Francesco Bandiera, Olivier Besson, Giuseppe Ricci
2011 J jnl
IET Commun.
Julien Montesinos, Olivier Besson, Cécile Larue de Tournemine
2011 conf
ACSCC
Olivier Besson, Nicolas Dobigeon, Jean-Yves Tourneret
2011 J jnl
IEEE Trans. Aerosp. Electron. Syst.
Stéphanie Bidon, Olivier Besson, Jean-Yves Tourneret
2011 J jnl
IEEE Trans. Signal Process.
Olivier Besson, Nicolas Dobigeon, Jean-Yves Tourneret
2011 conf
DSP
Francois Deudon, Stéphanie Bidon, Olivier Besson, Jean-Yves Tourneret
2011 J jnl
Traitement du Signal
Stéphanie Bidon, Olivier Besson, Jean-Yves Tourneret
2010 Misc conf
ICASSP
Francesco Bandiera, Olivier Besson, Giuseppe Ricci
2010 J jnl
IEEE Trans. Signal Process.
Francesco Bandiera, Olivier Besson, Giuseppe Ricci
2010 J jnl
Signal Process.
Olivier Besson, Stéphanie Bidon, Cécile Larue de Tournemine
2009 J jnl
IEEE Signal Process. Lett.
Olivier Besson, Julien Montesinos, Cécile Larue de Tournemine
2008 J jnl
IEEE Trans. Signal Process.
Stéphanie Bidon, Olivier Besson, Jean-Yves Tourneret
2008 Misc conf
ICASSP
Francesco Bandiera, Olivier Besson, Danilo Orlando, Giuseppe Ricci
2008 J jnl
IEEE Trans. Signal Process.
Francesco Bandiera, Olivier Besson, Giuseppe Ricci
2008 J jnl
IEEE Trans. Signal Process.
Francesco Bandiera, Olivier Besson, Danilo Orlando, Giuseppe Ricci
2008 J jnl
IEEE Trans. Signal Process.
Olivier Besson, Stéphanie Bidon, Jean-Yves Tourneret
2008 J jnl
IEEE Trans. Signal Process.
Olivier Besson, Stéphanie Bidon, Jean-Yves Tourneret
2008 J jnl
IEEE Trans. Signal Process.
François Vincent, Olivier Besson, Cédric Richard
2008 J jnl
ARIMA J.
Olivier Besson, Soulèye Kane, Mamadou Sy
2008 J jnl
IEEE Signal Process. Lett.
Stéphanie Bidon, Olivier Besson, Jean-Yves Tourneret
2008 J jnl
IEEE Trans. Signal Process.
Francesco Bandiera, Olivier Besson, Danilo Orlando, Giuseppe Ricci
2008 J jnl
Eur. Trans. Telecommun.
Garmy Sow, Olivier Besson, Marie-Laure Boucheret, Cécile Guiraud
2007 J jnl
IEEE Trans. Signal Process.
Olivier Besson
2007 J jnl
IEEE Signal Process. Lett.
Olivier Besson, Danilo Orlando
2007 conf
ICASSP (3)
Olivier Besson, Jean-Yves Tourneret, Stéphanie Bidon
2007 J jnl
IEEE Signal Process. Lett.
Olivier Besson
2007 J jnl
IEEE Trans. Signal Process.
Francesco Bandiera, Olivier Besson, Danilo Orlando, Giuseppe Ricci, Louis L. Scharf
2007 J jnl
IEEE Signal Process. Lett.
Olivier Besson, Jean-Yves Tourneret, Stéphanie Bidon
2007 conf
ICASSP (3)
François Vincent, Bernard Mouton, Eric Chaumette, Claude Nouals, Olivier Besson
2006 J jnl
IEEE Trans. Signal Process.
Olivier Besson, Louis L. Scharf, Shawn Kraut
2006 J jnl
IEEE Trans. Signal Process.
Olivier Besson, Louis L. Scharf
2006 J jnl
IEEE Trans. Signal Process.
Olivier Besson, Shawn Kraut, Louis L. Scharf
2006 conf
ICASSP (3)
Francesco Bandiera, Olivier Besson, Danilo Orlando, Giuseppe Ricci, Louis L. Scharf
2005 J jnl
IEEE Trans. Signal Process.
Olivier Besson, G. Varfolomeev, François Vincent
2005 J jnl
IEEE Trans. Signal Process.
Olivier Besson, Louis L. Scharf, François Vincent
2005 conf
ICASSP (4)
Olivier Besson, Louis L. Scharf, François Vincent
2005 J jnl
IEEE Trans. Signal Process.
Olivier Besson, François Vincent
2004 J jnl
IEEE Trans. Signal Process.
Andrei A. Monakov, Olivier Besson
2004 conf
ICASSP (2)
Olivier Besson, François Vincent
2004 J jnl
IEEE Trans. Signal Process.
Olivier Besson, Andrei A. Monakov, Christophe Chalus
2003 J jnl
Signal Process.
Monika Agrawal, Petre Stoica, Olivier Besson, Per Åhgren
2003 J jnl
IEEE Trans. Commun.
Yukihiro Kamiya, Olivier Besson
2003 J jnl
IEEE Trans. Signal Process.
Olivier Besson, Petre Stoica
2003 J jnl
IEEE Trans. Commun.
Petre Stoica, Olivier Besson
2003 J jnl
Digit. Signal Process.
Olivier Besson, Petre Stoica
2002 conf
EUSIPCO
Yukihiro Kamiya, Olivier Besson
2002 Misc conf
ICASSP
Olivier Besson, Petre Stoica
2002 J jnl
IEEE Trans. Signal Process.
Olivier Besson, Petre Stoica, Yukihiro Kamiya
2001 J jnl
Wirel. Pers. Commun.
Olivier Besson, Petre Stoica
2001 Misc conf
ICASSP
Olivier Besson, Petre Stoica, Alex B. Gershman
2001 J jnl
IEEE Trans. Signal Process.
Petre Stoica, Olivier Besson, Alex B. Gershman
2001 J jnl
IEEE Trans. Signal Process.
Mounir Ghogho, Olivier Besson, Ananthram Swami
2001 J jnl
IEEE Commun. Lett.
Olivier Besson, Petre Stoica
2001 J jnl
IEEE Trans. Signal Process.
Olivier Besson, Petre Stoica, Alex B. Gershman
2000 J jnl
IEEE Trans. Signal Process.
Olivier Besson, François Vincent, Petre Stoica, Alex B. Gershman
2000 conf
EUSIPCO
Petre Stoica, Olivier Besson
2000 J jnl
IEEE Trans. Signal Process.
Olivier Besson, Petre Stoica
1999 J jnl
Digit. Signal Process.
Olivier Besson, Petre Stoica
1999 J jnl
Parallel Distributed Comput. Pract.
Olivier Besson
1999 J jnl
IEEE Trans. Signal Process.
Olivier Besson, Georgios B. Giannakis, Fulvio Gini
1999 J jnl
Digit. Signal Process.
Olivier Besson, Petre Stoica
1999 Misc conf
ICASSP
Olivier Besson, Mounir Ghogho, Ananthram Swami
1999 J jnl
IEEE Trans. Signal Process.
Olivier Besson, Mounir Ghogho, Ananthram Swami
1999 J jnl
IEEE Trans. Signal Process.
Olivier Besson, Petre Stoica
1998 J jnl
Signal Process.
Olivier Besson, Petre Stoica
1998 Misc conf
ICASSP
Olivier Besson, Petre Stoica
1998 Misc conf
ICASSP
Frédéric Galtier, Olivier Besson
1998 J jnl
Signal Process.
Frédéric Galtier, Olivier Besson
1997 Misc conf
ICASSP
Frédéric Galtier, Olivier Besson
1997 Misc conf
ICASSP
Olivier Besson, Petre Stoica
1996 J jnl
IEEE Trans. Signal Process.
Olivier Besson, Petre Stoica
1996 conf
EUSIPCO
Olivier Besson, Frédéric Galtier
1996 J jnl
IEEE Trans. Signal Process.
Olivier Besson, Frédéric Galtier
1996 Misc conf
ICASSP
Olivier Besson, Petre Stoica
1996 J jnl
IEEE Trans. Signal Process.
Olivier Besson, Petre Stoica
1996 conf
EUSIPCO
Olivier Besson, Petre Stoica
1995 Misc conf
ICASSP
Olivier Besson
1995 J jnl
Signal Process.
Olivier Besson
1995 J jnl
IEEE Trans. Signal Process.
Olivier Besson, Petre Stoica
1995 J jnl
Signal Process.
Olivier Besson, Petre Stoica
1993 J jnl
Signal Process.
Olivier Besson, Francis Castanie
1991 Misc conf
ICASSP
Olivier Besson, Francis Castanie
1990 Misc conf
ICASSP
Olivier Besson, Francis Castanie
redb/extractors/ioc_extractor/ioc_extractor.py
← Index redb/extractors/ioc_extractor/ioc_extractor.py python
"""
IOC Extractor - Extractor class for extracting IOCs from decompilation results.

This extractor works with in-memory data from DecompileBinja, following the
standard Extractor pattern to support both ClickHouse and PrintExporter (dry-run).

Usage:
    # After DecompileBinja completes:
    ioc_extractor = IOCExtractorFromResults(
        analysis_results=decompiler.analysis_results,
        sha256=sha256,
        log=logger,
        exporters=exporters,
        index_prefix=index_prefix
    )
    ioc_extractor.export_data()
"""

import inspect
from datetime import datetime, timezone
from pathlib import Path
from typing import Any, List, Dict, Optional

from redb.extractors.enum import Tag
from redb.extractors.database_exporters import DatabaseExporter

# Import the IOCScraper and related classes from standalone module
from redb.extractors.ioc_extractor.standalone_ioc_extractor import (
    IOCScraper,
    IOCType,
    SourceType,
    ExtractedIOC,
)
from typing import Set


class IOCExtractorFromResults:
    """
    Extracts IOCs from in-memory decompilation results.

    This follows a simplified Extractor pattern but doesn't inherit from Extractor
    since it doesn't read from a binary file - instead it takes already-processed
    analysis results from DecompileBinja.
    """

    def __init__(
        self,
        analysis_results: Dict[str, Any],
        sha256: str,
        log: Any,
        exporters: Optional[List[DatabaseExporter]] = None,
        index_prefix: Optional[str] = None,
        tld_file: Optional[Path] = None,
        suppress_types: Optional[Set[IOCType]] = None,
        js_context: bool = False,
    ):
        """
        Initialize IOC Extractor with analysis results.

        Args:
            analysis_results: Dict containing 'strings' and 'decompiled' lists from DecompileBinja
            sha256: Sample SHA256 hash
            log: Logger instance
            exporters: List of database exporters (ClickHouse, Print, etc.)
            index_prefix: Index prefix for database
            tld_file: Optional path to TLD list file
            js_context: When True, the underlying IOCScraper rejects FQDN
                candidates that match JS object-access syntax (see
                JS_FP_TLDS / JS_FP_SLDS). Set this for the JS pipeline only;
                APK suppresses FQDN entirely via suppress_types and binary
                callers leave it disabled.
        """
        self.log = log
        self.log.debug(f"Creating {self.__class__.__name__}")
        self.analysis_results = analysis_results
        self.sha256 = sha256
        self.exporters = exporters or []
        self.index_prefix = index_prefix
        self.scraper = IOCScraper(
            tld_file, suppress_types=suppress_types, js_context=js_context,
        )
        self.extracted_iocs: List[ExtractedIOC] = []

    def extract(self) -> List[ExtractedIOC]:
        """
        Extract IOCs from strings and decompiled functions in analysis_results.

        Returns:
            List of ExtractedIOC objects
        """
        self.log.debug(inspect.currentframe().f_code.co_name)
        self.extracted_iocs = []

        # Extract from strings
        strings_count = self._extract_from_strings()

        # Extract from decompiled functions
        functions_count = self._extract_from_decompiled()

        # Extract from text-based artefact surfaces (JS, PowerShell, etc.)
        text_count = self._extract_from_text()

        self.log.info(
            f"Extracted {len(self.extracted_iocs)} IOCs for {self.sha256[:16]}... "
            f"(strings: {strings_count}, functions: {functions_count}, "
            f"text: {text_count})"
        )

        return self.extracted_iocs

    def _extract_from_strings(self) -> int:
        """Extract IOCs from sample's strings."""
        count = 0
        strings = self.analysis_results.get("strings", [])

        for s in strings:
            string_value = s.get("string", "")
            string_offset = s.get("string_offset", 0)

            if isinstance(string_value, bytes):
                string_value = string_value.decode('utf-8', errors='replace')

            for ioc in self.scraper.scrape(string_value, SourceType.STRING, str(string_offset)):
                self.extracted_iocs.append(ioc)
                count += 1

        return count

    def _extract_from_decompiled(self) -> int:
        """Extract IOCs from sample's decompiled functions.

        Supports both Binja format (key: "decompiled", fields: "decompiled_function",
        "decompiled_function_hash", "function_type") and APK format (key:
        "decompiled_content", fields: "decompiled_method", "decompiled_method_hash",
        "method_type").
        """
        count = 0

        # Binja format
        decompiled = self.analysis_results.get("decompiled", [])
        for func in decompiled:
            func_type = func.get("function_type", "UNKNOWN")
            if func_type in ("LIBRARY", "THUNK"):
                continue

            func_content = func.get("decompiled_function", "")
            func_hash = func.get("decompiled_function_hash", "unknown")

            if isinstance(func_content, bytes):
                func_content = func_content.decode('utf-8', errors='replace')

            for ioc in self.scraper.scrape(func_content, SourceType.DECOMPILED_FUNCTION, func_hash):
                self.extracted_iocs.append(ioc)
                count += 1

        # APK format (decompiled_content with method-level fields)
        decompiled_content = self.analysis_results.get("decompiled_content", [])
        for func in decompiled_content:
            func_type = func.get("method_type", "UNKNOWN")
            if func_type in ("LIBRARY", "THUNK"):
                continue

            func_content = func.get("decompiled_method", "")
            func_hash = func.get("decompiled_method_hash", "unknown")

            if isinstance(func_content, bytes):
                func_content = func_content.decode('utf-8', errors='replace')

            for ioc in self.scraper.scrape(func_content, SourceType.DECOMPILED_FUNCTION, func_hash):
                self.extracted_iocs.append(ioc)
                count += 1

        return count

    def _extract_from_text(self) -> int:
        """Extract IOCs from text-based artefact surfaces.

        Walks `analysis_results["text_raw"]` and `analysis_results["text_normalized"]`,
        each a list of `{"content": str, "content_hash": str}` dicts. Each
        list is routed through its own SourceType (`TEXT_RAW` /
        `TEXT_NORMALIZED`) so analysts can distinguish IOCs that were already
        present in the raw source from those exposed only after normalisation
        (deobfuscation/beautification). Generic across text-based formats —
        used by JS today, intended for PowerShell, Python, email body,
        extracted PDF/Office text in the future.
        """
        count = 0

        for key, source_type in (
            ("text_raw", SourceType.TEXT_RAW),
            ("text_normalized", SourceType.TEXT_NORMALIZED),
        ):
            for entry in self.analysis_results.get(key, []):
                content = entry.get("content", "")
                content_hash = entry.get("content_hash", "unknown")

                if isinstance(content, bytes):
                    content = content.decode('utf-8', errors='replace')

                for ioc in self.scraper.scrape(content, source_type, content_hash):
                    self.extracted_iocs.append(ioc)
                    count += 1

        return count

    def prepare_export_data(self, exporter_type: str) -> Any:
        """
        Prepare data for specific export type.

        Returns tuple for ClickHouse or list of dicts for Print/Elasticsearch.
        """
        self.log.debug(inspect.currentframe().f_code.co_name)

        if not self.extracted_iocs:
            return None

        now = datetime.now(timezone.utc)

        if exporter_type == "ClickHouseExporter":
            data = [
                [
                    self.sha256,
                    ioc.ioc_type.value,
                    ioc.ioc_value,
                    ioc.source_type.value,
                    ioc.source_identifier,
                    now,
                ]
                for ioc in self.extracted_iocs
            ]

            column_names = [
                "sha256",
                "ioc_type",
                "ioc_value",
                "source_type",
                "source_identifier",
                "extracted_at",
            ]

            column_type_names = [
                "FixedString(64)",
                "Enum8('ipv4'=1, 'ipv6'=2, 'fqdn'=3, 'url'=4, 'email'=5, 'server'=6, "
                "'hash_md5'=10, 'hash_sha1'=11, 'hash_sha256'=12, 'cve'=20, 'cwe'=21, 'cpe'=22, "
                "'crypto_btc'=30, 'crypto_eth'=31, 'crypto_xrp'=32, 'crypto_bch'=33, "
                "'crypto_ada'=34, 'crypto_substrate'=35, 'path_linux'=40, 'path_windows'=41, "
                "'registry_key'=42, 'onion'=50)",
                "String",
                "Enum8('decompiled_function'=1, 'disassembled_function'=2, 'string'=3, "
                "'text_raw'=4, 'text_normalized'=5)",
                "String",
                "DateTime64(3, 'UTC')",
            ]

            return (data, column_names, column_type_names)

        else:
            # For PrintExporter and others - return list of dicts
            return [
                {
                    "sha256": self.sha256,
                    "ioc_type": ioc.ioc_type.value,
                    "ioc_value": ioc.ioc_value,
                    "source_type": ioc.source_type.value,
                    "source_identifier": ioc.source_identifier,
                    "extracted_at": now.isoformat(),
                }
                for ioc in self.extracted_iocs
            ]

    def get_clickhouse_table(self) -> str:
        """Return the ClickHouse table name for IOCs."""
        return "redb_iocs"

    def tag(self) -> str:
        """Return the tag for this extractor."""
        return Tag.IOC.value if hasattr(Tag, 'IOC') else "ioc"

    def export_data(self) -> bool:
        """
        Export extracted IOCs to all configured exporters.

        Returns:
            True if export succeeded, False if failed, None if no data
        """
        self.log.debug(inspect.currentframe().f_code.co_name)

        # First extract the IOCs
        extracted = self.extract()

        if not extracted:
            self.log.debug("No IOCs extracted, skipping export")
            return None

        success = True

        from redb.extractors.database_exporters import PrintExporter, ClickHouseExporter

        for exporter in self.exporters:
            try:
                if isinstance(exporter, PrintExporter):
                    # For PrintExporter, pass the list of dicts
                    export_data = self.prepare_export_data("PrintExporter")
                    success &= exporter.export(export_data)

                elif isinstance(exporter, ClickHouseExporter):
                    # For ClickHouse, pass tuple with table info
                    export_data = self.prepare_export_data("ClickHouseExporter")
                    if export_data:
                        success &= exporter.export(
                            export_data,
                            table=self.get_clickhouse_table(),
                            column_names=export_data[1],
                            column_type_names=export_data[2]
                        )

            except Exception as e:
                self.log.error(f"Error exporting IOCs to {exporter.__class__.__name__}: {e}")
                success = False

        return success