Hanno Scharr

93 papers A* 7A 2B 1C 3Misc 1Journal 39Unranked 37
YearRankTypeTitle / Venue / Authors
2026 J jnl
CoRR
Alessio Quercia, Arya Bangun, Ira Assent, Hanno Scharr
2026 A* conf
AAAI
Qin Wang, Alessio Quercia, Benjamin Bruns, Abigail Morrison, Hanno Scharr, Kai Krajsek
2025 J jnl
CoRR
Alessio Quercia, Zhuo Cao, Arya Bangun, Richard D. Paul, Abigail Morrison, Ira Assent, Hanno Scharr
2025 J jnl
CoRR
Xuan Zhao, Zhuo Cao, Arya Bangun, Hanno Scharr, Ira Assent
2025 J jnl
CoRR
Nils Friederich, Angelo Jovin Yamachui Sitcheu, Annika Nassal, Erenus Yildiz, Matthias Pesch, Maximilian Beichter, Lukas Scholtes, Bahar Akbaba, Thomas Lautenschlager, Oliver Neumann, Dietrich Kohlheyer, Hanno Scharr, Johannes Seiffarth, Katharina Nöh, Ralf Mikut
2025 J jnl
CoRR
Omini Rathore, Richard Paul, Abigail Morrison, Hanno Scharr, Elisabeth Pfaehler
2025 A conf
WACV
Alessio Quercia, Erenus Yildiz, Zhuo Cao, Kai Krajsek, Abigail Morrison, Ira Assent, Hanno Scharr
2025 J jnl
CoRR
Alessio Quercia, Erenus Yildiz, Zhuo Cao, Kai Krajsek, Abigail Morrison, Ira Assent, Hanno Scharr
2025 J jnl
CoRR
Arya Bangun, Maximilian Töllner, Xuan Zhao, Christian Kübel, Hanno Scharr
2025 J jnl
Knowl. Inf. Syst.
Alessio Quercia, Fernanda Nader, Abigail Morrison, Hanno Scharr, Ira Assent
2025 J jnl
CoRR
Zhuo Cao, Lena Krieger, Hanno Scharr, Ira Assent
2025 J jnl
CoRR
Richard D. Paul, Johannes Seiffarth, David Rügamer, Hanno Scharr, Katharina Nöh
2025 J jnl
CoRR
Zhuo Cao, Xuan Zhao, Lena Krieger, Hanno Scharr, Ira Assent
2025 A conf
WACV
Arya Bangun, Zhuo Cao, Alessio Quercia, Hanno Scharr, Elisabeth Pfaehler
2025 J jnl
CoRR
Laurentius Valdy, Richard D. Paul, Alessio Quercia, Zhuo Cao, Xuan Zhao, Hanno Scharr, Arya Bangun
2025 conf
VISIGRAPP (2): VISAPP
Qin Wang, Kai Krajsek, Hanno Scharr
2025 J jnl
CoRR
Qin Wang, Benjamin Bruns, Hanno Scharr, Kai Krajsek
2024 J jnl
CoRR
Nils Friederich, Angelo Jovin Yamachui Sitcheu, Annika Nassal, Matthias Pesch, Erenus Yildiz, Maximilian Beichter, Lukas Scholtes, Bahar Akbaba, Thomas Lautenschlager, Oliver Neumann, Dietrich Kohlheyer, Hanno Scharr, Johannes Seiffarth, Katharina Nöh, Ralf Mikut
2024 J jnl
CoRR
Qin Wang, Kai Krajsek, Hanno Scharr
2024 B conf
VRST
Dirk Norbert Baker, Tobias Selzner, Jens Henrik Göbbert, Hanno Scharr, Morris Riedel, Ebba Þóra Hvannberg, Andrea Schnepf, Daniel Zielasko
2024 J jnl
CoRR
Arya Bangun, Zhuo Cao, Alessio Quercia, Hanno Scharr, Elisabeth Pfaehler
2024 J jnl
SoftwareX
Johannes Seiffarth, Tim Scherr, Bastian Wollenhaupt, Oliver Neumann, Hanno Scharr, Dietrich Kohlheyer, Ralf Mikut, Katharina Nöh
2024 J jnl
CoRR
Richard D. Paul, Alessio Quercia, Vincent Fortuin, Katharina Nöh, Hanno Scharr
2024 J jnl
IEEE J. Sel. Top. Appl. Earth Obs. Remote. Sens.
Miguel Pato, Jim Buffat, Kevin Alonso, Stefan Auer, Emiliano Carmona, Stefan W. Maier, Rupert Müller, Patrick Rademske, Uwe Rascher, Hanno Scharr
2024 conf
ECCV Workshops (3)
Jim Buffat, Miguel Pato, Kevin Alonso, Stefan Auer, Emiliano Carmona, Stefan W. Maier, Rupert Müller, Patrick Rademske, Uwe Rascher, Hanno Scharr
2024 J jnl
CoRR
Jim Buffat, Miguel Pato, Kevin Alonso, Stefan Auer, Emiliano Carmona, Stefan W. Maier, Rupert Müller, Patrick Rademske, Uwe Rascher, Hanno Scharr
2024 conf
ISBI
Richard D. Paul, Johannes Seiffarth, Hanno Scharr, Katharina Nöh
2024 conf
ECCV Workshops (16)
Johannes Seiffarth, Luisa Blöbaum, Richard D. Paul, Nils Friederich, Angelo Jovin Yamachui Sitcheu, Ralf Mikut, Hanno Scharr, Alexander Grünberger, Katharina Nöh
2024 J jnl
CoRR
Johannes Seiffarth, Luisa Blöbaum, Richard D. Paul, Nils Friederich, Angelo Jovin Yamachui Sitcheu, Ralf Mikut, Hanno Scharr, Alexander Grünberger, Katharina Nöh
2024 J jnl
CoRR
Elisabeth Pfaehler, Daniel Pflugfelder, Hanno Scharr
2023 C conf
IGARSS
Jim Buffat, Miguel Pato, Kevin Alonso, Stefan Auer, Emiliano Carmona, Stefan W. Maier, Rupert Müller, Patrick Rademske, Uwe Rascher, Hanno Scharr
2023 conf
ICCV (Workshops)
Vsevolod Cherepashkin, Erenus Yildiz, Andreas Fischbach, Leif Kobbelt, Hanno Scharr
2023 J jnl
Frontiers Artif. Intell.
Ian Stavness, Mario Valerio Giuffrida, Hanno Scharr
2023 C conf
IGARSS
Miguel Pato, Kevin Alonso, Stefan Auer, Jim Buffat, Emiliano Carmona, Stefan W. Maier, Rupert Müller, Patrick Rademske, Uwe Rascher, Hanno Scharr
2023 A* conf
ICDM
Alessio Quercia, Abigail Morrison, Hanno Scharr, Ira Assent
2021 J jnl
CoRR
Dirk Norbert Helmrich, Jens Henrik Göbbert, Mona Giraud, Hanno Scharr, Andrea Schnepf, Morris Riedel
2020 conf
ECCV Workshops (6)
Hanno Scharr, Benjamin Bruns, Andreas Fischbach, Johanna Roussel, Lukas Scholtes, Jonas vom Stein
2020 J jnl
IEEE Trans. Image Process.
Daniel Pflugfelder, Hanno Scharr
2018 C conf
IGARSS
Maria Pilar Cendrero Mateo, Simon Bennertz, Andreas Burkart, Tommaso Julitta, Sergio Cogliati, Hanno Scharr, Patrick Rademske, Luis Alonso, Francisco Pinto, Uwe Rascher
2017 J jnl
Comput. Electron. Agric.
Alejandro Agostini, Guillem Alenyà, Andreas Fischbach, Hanno Scharr, Florentin Wörgötter, Carme Torras
2017 conf
ICCV Workshops
Mario Valerio Giuffrida, Hanno Scharr, Sotirios A. Tsaftaris
2017 J jnl
CoRR
Mario Valerio Giuffrida, Hanno Scharr, Sotirios A. Tsaftaris
2017 conf
ICCV Workshops
Hanno Scharr, Tony P. Pridmore, Sotirios A. Tsaftaris
2016 J jnl
Int. J. Comput. Vis.
Kai Krajsek, Marion I. Menzel, Hanno Scharr
2016 J jnl
Pattern Recognit. Lett.
Massimo Minervini, Andreas Fischbach, Hanno Scharr, Sotirios A. Tsaftaris
2016 J jnl
Mach. Vis. Appl.
Hanno Scharr, Massimo Minervini, Andrew P. French, Christian Klukas, David M. Kramer, Xiaoming Liu, Imanol Luengo, Jean-Michel Pape, Gerrit Polder, Danijela Vukadinovic, Xi Yin, Sotirios A. Tsaftaris
2016 J jnl
Mach. Vis. Appl.
Hanno Scharr, Hannah M. Dee, Andrew P. French, Sotirios A. Tsaftaris
2015 conf
CVCS
Freddie Åström, Michael Felsberg, Hanno Scharr
2015 conf
GIL Jahrestagung
Benjamin Bruns, Hanno Scharr, Florian Schmidt
2015 J jnl
IEEE ACM Trans. Comput. Biol. Bioinform.
Babette Dellen, Hanno Scharr, Carme Torras
2015 J jnl
IEEE Signal Process. Mag.
Massimo Minervini, Hanno Scharr, Sotirios A. Tsaftaris
2015 J jnl
Comput. Electron. Agric.
Eren Erdal Aksoy, Alexey Abramov, Florentin Wörgötter, Hanno Scharr, Andreas Fischbach, Babette Dellen
2014 conf
VISAPP (3)
Kai Krajsek, Christian Heinemann, Hanno Scharr
2014 conf
VISAPP (1)
Christian Heinemann, Freddie Åström, George Baravdish, Kai Krajsek, Michael Felsberg, Hanno Scharr
2013 conf
GIL Jahrestagung
Florian Schmidt, Benjamin Bruns, Thomas Bode, Hanno Scharr, Armin B. Cremers
2012 conf
VISAPP (2)
Hannes Schulz, Johannes A. Postma, Dagmar van Dusschoten, Hanno Scharr, Sven Behnke
2012 A* conf
CVPR
Kai Krajsek, Hanno Scharr
2012 ch.
Mathematical Methods for Signal and Image Analysis and Representation
Hanno Scharr, Kai Krajsek
2012 conf
VISIGRAPP (Selected Papers)
Hannes Schulz, Johannes A. Postma, Dagmar van Dusschoten, Hanno Scharr, Sven Behnke
2011 conf
DAGM-Symposium
Kai Krajsek, Ines Dedovic, Hanno Scharr
2010 A* conf
CVPR
Kai Krajsek, Hanno Scharr
2010 conf
ECCV (4)
Tobias Schuchert, Hanno Scharr
2010 J jnl
IEEE Trans. Pattern Anal. Mach. Intell.
Tobias Schuchert, Til Aach, Hanno Scharr
2009 A* conf
ICCV
Kai Krajsek, Marion I. Menzel, Hanno Scharr
2008 conf
Statistical and Geometrical Approaches to Visual Motion Analysis
Tobias Schuchert, Hanno Scharr
2008 J jnl
Int. J. Comput. Vis.
Tobias Preusser, Hanno Scharr, Kai Krajsek, Robert M. Kirby
2008 conf
DAGM-Symposium
Matthias Mühlich, Daniel Truhn, Kerstin Nagel, Achim Walter, Hanno Scharr, Til Aach
2008 conf
ECCV (1)
Tobias Schuchert, Til Aach, Hanno Scharr
2008 conf
ECCV (4)
Kai Krajsek, Marion I. Menzel, Michael Zwanger, Hanno Scharr
2008 conf
DAGM-Symposium
Kai Krajsek, Rudolf Mester, Hanno Scharr
2007 conf
EUSIPCO
Hanno Scharr
2007 conf
DAGM-Symposium
Tobias Schuchert, Hanno Scharr
2006 J jnl
IEEE Trans. Pattern Anal. Mach. Intell.
Michael Felsberg, Per-Erik Forssén, Hanno Scharr
2006 ed.
IWCM
Bernd Jähne, Rudolf Mester, Erhardt Barth, Hanno Scharr
2006 conf
DAGM-Symposium
Hanno Scharr
2005 J jnl
Signal Process. Image Commun.
Hanno Scharr, Hagen Spies
2005 conf
EUSIPCO
Hanno Scharr, Ingo Stuke, Cicero Mota, Erhardt Barth
2004 conf
IWCM
Hanno Scharr
2004 conf
IWCM
Hanno Scharr
2003 A* conf
ICCV
Hanno Scharr, Michael J. Black, Horst W. Haussecker
2003 conf
CVPR Workshops
Hanno Scharr, Michael Felsberg, Per-Erik Forssén
2002 J jnl
J. Vis. Commun. Image Represent.
Joachim Weickert, Hanno Scharr
2001 conf
DAGM-Symposium
Hanno Scharr, Dietmar Uttenweiler
2001 A* conf
ICCV
Hagen Spies, Hanno Scharr
2001 Misc conf
ICIAP
Norbert Kirchgeßner, Hagen Spies, Hanno Scharr, Uli Schurr
2001 conf
DAGM-Symposium
Norbert Kirchgeßner, Hagen Spies, Hanno Scharr, Uli Schurr
2000 conf
DAGM-Symposium
Norbert Kirchgeßner, Hanno Scharr, Uli Schurr
2000 conf
DAGM-Symposium
Hanno Scharr, Joachim Weickert
2000 conf
VMV
Hagen Spies, Norbert Kirchgeßner, Hanno Scharr, Bernd Jähne
2000 conf
DAGM-Symposium
Hanno Scharr, Bernd Jähne, Stefan Böckle, Jan Kazenwadel, Thomas Kunzelmann, Christof Schulz
2000
Hanno Scharr
1998 conf
ECCV (2)
Bernd Jähne, Horst W. Haussecker, Hanno Scharr, Hagen Spies, Dominik Schmundt, Uli Schurr
1997 conf
DAGM-Symposium
Hanno Scharr, Stefan Körkel, Bernd Jähne
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