Vincent Houtsma

59 papers Journal 16Unranked 43
YearRankTypeTitle / Venue / Authors
2025 conf
ECOC
Vincent Houtsma, Wouter Lanneer, Kovendhan Vijayan, Robert Borkowski, Doutje T. van Veen
2025 conf
OFC
Kovendhan Vijayan, Robert Borkowski, Qian Hu, Doutje T. van Veen, Vincent Houtsma
2025 conf
OFC
Robert Borkowski, Brian Stern, Kovendhan Vijayan, Qian Hu, Kwangwoong Kim, Bob Farah, Ed Sutter, Vincent Houtsma, Doutje T. van Veen, Nicolas K. Fontaine
2025 conf
ECOC
Kovendhan Vijayan, Patrick Iannone, Vincent Houtsma, Gregory Raybon, Doutje T. van Veen, David T. Neilson, Robert Borkowski
2025 conf
ECOC
Robert Borkowski, Kovendhan Vijayan, Haoshuo Chen, Qian Hu, Jianxiang Wen, Tingyun Wang, Dora van Veen, Vincent Houtsma
2025 conf
OFC
Christoph Füllner, Dora van Veen, Michael Straub, Michiel Verplaetse, Robert Borkowski, Wouter Lanneer, Yannick Lefevre, Vincent Houtsma, René Bonk, Peter Desmet, Colin Wu, Jochen Maes
2025 conf
OFC
Robert Borkowski, Kovendhan Vijayan, Suresh Chandrasekaran, John Valdez, Erwin Wardojo, Srimadhaven Thirumurthy, Vincent Houtsma, Christoph Füllner, Dora van Veen, Michael Straub, René Bonk, Chris Edwards, Jochen Maes
2025 conf
OFC
Doutje T. van Veen, Kovendhan Vijayan, Robert Borkowski, Vincent Houtsma
2024 conf
OFC
Robert Borkowski, Kovendhan Vijayan, Vincent Houtsma, Qian Hu, Amitkumar Mahadevan, Patrick Iannone, Doutje T. van Veen
2024 conf
OFC
Doutje T. van Veen, Robert Borkowski, Kovendhan Vijayan, Amitkumar Mahadevan, Vincent Houtsma
2024 J jnl
J. Opt. Commun. Netw.
Doutje T. van Veen, Amitkumar Mahadevan, Michael Straub, Robert Borkowski, Rene Bonk, Vincent Houtsma
2024 J jnl
J. Opt. Commun. Netw.
Vincent Houtsma, Dora van Veen
2023 conf
OFC
Dora van Veen, Robert Borkowski, Amitkumar Mahadevan, Vincent Houtsma
2023 J jnl
J. Opt. Commun. Netw.
Doutje T. van Veen, Vincent Houtsma
2023 conf
OFC
Vincent Houtsma, Dora van Veen
2022 conf
OFC
Shuang Yao, Amitkumar Mahadevan, Yannick Lefevre, Noriaki Kaneda, Vincent Houtsma, Doutje T. van Veen
2022 conf
OFC
Hanzi Huang, Haoshuo Chen, Nicolas K. Fontaine, Yingxiong Song, Mikael Mazur, Lauren Dallachiesa, Yuanhang Zhang, Chenhui Ye, Dora van Veen, Vincent Houtsma, Roland Ryf, David T. Neilson
2022 J jnl
JOCN
Noriaki Kaneda, Rui Zhang, Yannick Lefevre, Amitkumar Mahadevan, Doutje T. van Veen, Vincent Houtsma
2022 J jnl
JOCN
Robert Borkowski, Yannick Lefevre, Amitkumar Mahadevan, Doutje T. van Veen, Michael Straub, Ralph Kaptur, Björn Czerwinski, Bruno Cornaglia, Vincent Houtsma, Werner Coomans, René Bonk, Jochen Maes
2022 conf
OFC
Amitkumar Mahadevan, Yannick Lefevre, Ed Harstead, Werner Van Hoof, Doutje T. van Veen, Vincent Houtsma
2022 J jnl
JOCN
Rene Bonk, Ed Harstead, Robert Borkowski, Vincent Houtsma, Yannick Lefevre, Amitkumar Mahadevan, Dora van Veen, Michiel Verplaetse, Sheldon Walklin
2021 conf
ECOC
Haoshuo Chen, Nicolas K. Fontaine, Mikael Mazur, Lauren Dallachiesa, Y. Zhang, Hanzi Huang, Dora van Veen, Vincent Houtsma, Andrea Blanco Redondo, Roland Ryf, David T. Neilson
2021 conf
OFC
Noriaki Kaneda, Rui Zhang, Yannick Lefevre, Amitkumar Mahadevan, Doutje T. van Veen, Vincent Houtsma
2021 J jnl
JOCN
Amitkumar Mahadevan, Doutje T. van Veen, Noriaki Kaneda, Alex Duque, Adriaan J. de Lind van Wijngaarden, Vincent Houtsma
2021 conf
OFC
Amitkumar Mahadevan, Yannick Lefevre, Wouter Lanneer, Paul Cautereels, Doutje T. van Veen, Noriaki Kaneda, Vincent Houtsma
2021 conf
ECOC
Robert Borkowski, Yannick Lefevre, Michael Straub, Zeljko Jelic, Amitkumar Mahadevan, Noriaki Kaneda, Yanni Ou, Wouter Lanneer, Ralph Kaptur, Björn Czerwinski, Bruno Cornaglia, Dora van Veen, Vincent Houtsma, Werner Coomans, René Bonk, Jochen Maes
2021 J jnl
JOCN
Vincent Houtsma, Amitkumar Mahadevan, Noriaki Kaneda, Doutje T. van Veen
2020 conf
OFC
Amitkumar Mahadevan, Doutje T. van Veen, Noriaki Kaneda, Alex Duque, Adriaan J. de Lind van Wijngaarden, Vincent Houtsma
2020 conf
ECOC
Amitkumar Mahadevan, Vincent Houtsma, Noriaki Kaneda, Doutje T. van Veen
2020 conf
ECOC
Noriaki Kaneda, Doutje T. van Veen, Amitkumar Mahadevan, Vincent Houtsma
2020 conf
OFC
Noriaki Kaneda, Ziyi Zhu, Chun-Yen Chuang, Amitkumar Mahadevan, Bob Farah, Keren Bergman, Doutje T. van Veen, Vincent Houtsma
2020 J jnl
JOCN
Ed Harstead, René Bonk, Sheldon Walklin, Dora van Veen, Vincent Houtsma, Noriaki Kaneda, Amitkumar Mahadevan, Robert Borkowski
2020 conf
ECOC
Rui Zhang, Noriaki Kaneda, Yannick Lefevre, Amitkumar Mahadevan, Doutje T. van Veen, Vincent Houtsma
2020 J jnl
JOCN
Doutje T. van Veen, Vincent Houtsma
2020 conf
OFC
Robert Borkowski, Harald Schmuck, Giancarlo Cerulo, Jean-Guy Provost, Vincent Houtsma, Dora van Veen, Ed Harstead, Franck Mallecot, René Bonk
2020 conf
OFC
Dora van Veen, Vincent Houtsma
2020 conf
ECOC
Robert Borkowski, Michael Straub, Yanni Ou, Yannick Lefevre, Zeljko Jelic, Wouter Lanneer, Noriaki Kaneda, Amitkumar Mahadevan, Volker Hückstädt, Dora van Veen, Vincent Houtsma, Werner Coomans, René Bonk, Jochen Maes
2019 conf
OFC
Vincent Houtsma, Elaine Chou, Doutje T. van Veen
2019 conf
OFC
Vincent Houtsma, Doutje T. van Veen
2019 J jnl
JOCN
Doutje T. van Veen, Vincent Houtsma, Stefano Porto, Nagesh Basavanhally, Cristian A. Bolle, Harald Schmuck
2018 conf
OFC
Stefano Porto, Doutje T. van Veen, Vincent Houtsma, Nagesh Basavanhally, Cristian A. Bolle, Harald Schmuck, Paul D. Townsend, Mark P. Earnshaw, Thomas Pfeiffer
2018 conf
ECOC
Doutje T. van Veen, Vincent Houtsma
2018 conf
OFC
Vincent Houtsma, Doutje T. van Veen, Stefano Porto, Nagesh Basavanhally, Cristian A. Bolle, Harald Schmuck
2017 conf
OFC
Chuan Qin, Vincent Houtsma, Doutje T. van Veen, Jeffrey Lee, HungKei Keith Chow, Peter Vetter
2017 conf
OFC
Doutje T. van Veen, Vincent Houtsma
2017 conf
OFC
René Bonk, Robert Borkowski, Wolfgang Pöhlmann, Joris Van Kerrebrouck, C. Chase, R. Lucas, Timothy De Keulenaer, Johan Bauwelinck, Doutje T. van Veen, Vincent Houtsma, Xin Yin, Thomas Pfeiffer
2016 conf
OFC
Doutje T. van Veen, Vincent Houtsma
2016 conf
OFC
Shuang Yin, Doutje T. van Veen, Vincent Houtsma, Peter Vetter
2015 conf
OFC
Vincent Houtsma, Doutje T. van Veen, Alan Gnauck, Patrick Iannone
2015 conf
ECOC
Vincent Houtsma, Doutje T. van Veen
2015 conf
ECOC
Doutje T. van Veen, Vincent Houtsma, HungKei Keith Chow
2015 conf
ECOC
Patrick Iannone, Dora van Veen, Alan Gnauck, Vincent Houtsma
2014 conf
ECOC
Doutje T. van Veen, Vincent Houtsma, Alan Gnauck, Patrick Iannone
2009 J jnl
Bell Labs Tech. J.
Nils Weimann, Vincent Houtsma, Rose Kopf, Yves Baeyens, Joseph Weiner, Alaric Tate, John Frackoviak, Young-Kai Chen, Gregory Raybon, Jean Godin, Muriel Riet, Virginie Nodjiadjim, Agnieszka Konczykowska, Jean-Yves Dupuy, Filipe Jorge, André Scavennec, Gabriel Charlet
2006 conf
CICC
Ying-Kuang Chen, Yves Baeyens, Nils Weimann, Jaesik Lee, Joe Weiner, Vincent Houtsma, Yang Yang
2004 J jnl
IEEE J. Solid State Circuits
Joseph S. Weiner, Jaesik Lee, Andreas Leven, Yves Baeyens, Vincent Houtsma, George Georgiou, Yang Yang, John Frackoviak, Alaric Tate, Roberto Reyes, Rose F. Kopf, Wei-Jer Sung, Nils Weimann, Young-Kai Chen
2004 J jnl
IEEE J. Solid State Circuits
Yves Baeyens, Nils Weimann, Pascal Roux, Andreas Leven, Vincent Houtsma, Rose F. Kopf, Yang Yang, John Frackoviak, Alaric Tate, Joseph S. Weiner, Peter Paschke, Young-Kai Chen
2003 J jnl
IEEE J. Solid State Circuits
Joseph S. Weiner, Andreas Leven, Vincent Houtsma, Yves Baeyens, Young-Kai Chen, Peter Paschke, Yang Yang, John Frackoviak, Wei-Jer Sung, Alaric Tate, Roberto Reyes, Rose F. Kopf, Nils Weimann
2002 J jnl
IEEE J. Solid State Circuits
Yves Baeyens, George Georgiou, Joseph S. Weiner, Andreas Leven, Vincent Houtsma, Peter Paschke, Q. Lee, Rose F. Kopf, Yang Yang, L. Chua, C. Chen, C. T. Liu, Young-Kai Chen
redb/extractors/elf_extractors/elf_segments.py
← Index redb/extractors/elf_extractors/elf_segments.py python
import inspect
import hashlib
import math
from collections import Counter
from datetime import datetime, timezone
from typing import Any, List, Dict

from elftools.elf.elffile import ELFFile
from elftools.common.exceptions import ELFError

from redb.extractors.enum import Tag
from redb.extractors.elf_extractor import ELFExtractor
from redb.models.dataclasses import ELFSegment


class ELFSegmentExtractor(ELFExtractor):

    def __init__(
        self,
        filepath,
        log,
        exporters=None,
        index_prefix=None,
        elastic_index=None,
        known_benign=False,
        known_malicious=False,
        elf=None,
    ):
        super().__init__(
            filepath,
            log,
            exporters,
            index_prefix,
            elastic_index,
            known_benign,
            known_malicious,
            elf,
        )
        self.elf_segments = []
        self.elastic_index = self.index_prefix + "-elf_segments"
        self.log.debug(inspect.currentframe().f_code.co_name)

    def _is_empty_result(self, extracted_data) -> bool:
        """
        Override: Empty segments is an ERROR, not a valid empty case.
        A valid ELF file must have segments (program headers).
        """
        # Always return False - empty segments should be treated as an error
        return False

    def _calculate_entropy(self, data: bytes) -> float:
        """Calculate Shannon entropy of data."""
        if not data:
            return 0.0

        try:
            # Count frequency of each byte
            byte_counts = Counter(data)
            data_len = len(data)

            # Calculate entropy
            entropy = 0.0
            for count in byte_counts.values():
                if count > 0:
                    frequency = count / data_len
                    entropy -= frequency * math.log2(frequency)

            return entropy
        except Exception as e:
            self.log.error(f"Error calculating entropy: {e}")
            return 0.0

    def _map_segment_type(self, p_type_str: str) -> int:
        """Map segment type string to enum value."""
        type_map = {
            'PT_NULL': 0,
            'PT_LOAD': 1,
            'PT_DYNAMIC': 2,
            'PT_INTERP': 3,
            'PT_NOTE': 4,
            'PT_SHLIB': 5,
            'PT_PHDR': 6,
            'PT_TLS': 7
        }
        return type_map.get(p_type_str, 0)

    def _decode_segment_flags(self, flags: int) -> List[str]:
        """Decode segment flags to human-readable strings."""
        flag_strings = []

        if flags & 0x1:  # PF_X
            flag_strings.append('EXECUTE')
        if flags & 0x2:  # PF_W
            flag_strings.append('WRITE')
        if flags & 0x4:  # PF_R
            flag_strings.append('READ')

        return flag_strings if flag_strings else ['NONE']

    def _extract_segment_data(self, segment) -> ELFSegment:
        """Extract data from a single segment with granular error handling."""
        # Initialize with safe defaults
        segment_type = 0
        segment_type_str = 'unknown'
        segment_flags = 0
        segment_flags_str = ['NONE']
        segment_offset = 0
        segment_vaddr = 0
        segment_paddr = 0
        segment_filesz = 0
        segment_memsz = 0
        segment_align = 0
        segment_entropy = 0.0
        segment_sha256 = ""
        segment_md5 = ""

        # Try to get segment header
        header = None
        try:
            header = segment.header
        except Exception as e:
            self.log.warning(f"Could not access segment header: {e}")
            return ELFSegment(
                segment_type=segment_type, segment_type_str=segment_type_str,
                segment_flags=segment_flags, segment_flags_str=segment_flags_str,
                segment_offset=segment_offset, segment_vaddr=segment_vaddr,
                segment_paddr=segment_paddr, segment_filesz=segment_filesz,
                segment_memsz=segment_memsz, segment_align=segment_align,
                segment_entropy=segment_entropy, segment_sha256=segment_sha256,
                segment_md5=segment_md5
            )

        # Extract segment type
        try:
            p_type_str = header.get('p_type', 'PT_NULL')
            segment_type = self._map_segment_type(p_type_str)
            segment_type_str = p_type_str.replace('PT_', '') if p_type_str.startswith('PT_') else p_type_str
        except Exception as e:
            self.log.warning(f"Could not extract segment type: {e}")

        # Extract segment flags
        try:
            segment_flags = header.get('p_flags', 0)
            segment_flags_str = self._decode_segment_flags(segment_flags)
        except Exception as e:
            self.log.warning(f"Could not extract segment flags: {e}")

        # Extract segment addresses and sizes
        try:
            segment_offset = header.get('p_offset', 0)
        except Exception as e:
            self.log.warning(f"Could not extract segment offset: {e}")

        try:
            segment_vaddr = header.get('p_vaddr', 0)
        except Exception as e:
            self.log.warning(f"Could not extract segment vaddr: {e}")

        try:
            segment_paddr = header.get('p_paddr', 0)
        except Exception as e:
            self.log.warning(f"Could not extract segment paddr: {e}")

        try:
            segment_filesz = header.get('p_filesz', 0)
        except Exception as e:
            self.log.warning(f"Could not extract segment filesz: {e}")

        try:
            segment_memsz = header.get('p_memsz', 0)
        except Exception as e:
            self.log.warning(f"Could not extract segment memsz: {e}")

        try:
            segment_align = header.get('p_align', 0)
        except Exception as e:
            self.log.warning(f"Could not extract segment align: {e}")

        # Calculate entropy and hashes for segment data (most likely to fail)
        try:
            if segment_filesz > 0:
                segment_data = segment.data()
                if segment_data:
                    # Calculate entropy
                    segment_entropy = self._calculate_entropy(segment_data)

                    # Calculate hashes
                    segment_sha256 = hashlib.sha256(segment_data).hexdigest()
                    segment_md5 = hashlib.md5(segment_data).hexdigest()
        except Exception as e:
            self.log.warning(f"Could not read segment data for hashing: {e}")
            # Keep defaults (0.0, "", "")

        return ELFSegment(
            segment_type=segment_type,
            segment_type_str=segment_type_str,
            segment_flags=segment_flags,
            segment_flags_str=segment_flags_str,
            segment_offset=segment_offset,
            segment_vaddr=segment_vaddr,
            segment_paddr=segment_paddr,
            segment_filesz=segment_filesz,
            segment_memsz=segment_memsz,
            segment_align=segment_align,
            segment_entropy=segment_entropy,
            segment_sha256=segment_sha256,
            segment_md5=segment_md5
        )

    def tag(self):
        return Tag.ELF_SEGMENTS.value if hasattr(Tag, 'ELF_SEGMENTS') else "elf_segments"

    def extract(self):
        try:
            self.log.debug(inspect.currentframe().f_code.co_name)

            def extract_segments(elf):
                segments_data = []

                # Iterate through all segments with per-segment error handling
                for segment_index, segment in enumerate(elf.iter_segments()):
                    try:
                        segment_data = self._extract_segment_data(segment)
                        if segment_data:
                            segments_data.append(segment_data)
                        else:
                            self.log.warning(f"Failed to extract data for segment {segment_index}")
                    except Exception as e:
                        self.log.warning(f"Error processing segment {segment_index}: {e}")
                        # Continue processing other segments

                return segments_data

            # Check if file is valid ELF
            if not self._is_elf_file():
                self.log.error(f"No valid ELF file for {self.hash.sha256}")
                return None

            segments_data = self._with_elf_file(extract_segments)
            if segments_data is None:
                return None

            self.elf_segments = segments_data
            return self.elf_segments

        except Exception as e:
            self.log.error(f"Error extracting ELF segments {self.hash.sha256}: {e}")
            return None

    def prepare_export_data(self, exporter_type: str) -> Any:
        self.log.debug(inspect.currentframe().f_code.co_name)

        if exporter_type == "ElasticsearchExporter":
            return self.elf_segments
        elif exporter_type == "ClickHouseExporter":
            try:
                if not self.elf_segments:
                    return None

                # Prepare data arrays for all segments
                data = []
                current_time = datetime.now(timezone.utc)
                for segment in self.elf_segments:
                    row = [
                        self.sha256,
                        self.md5,
                        self.sha1,
                        segment.segment_type,
                        segment.segment_type_str,
                        segment.segment_flags,
                        segment.segment_flags_str,
                        segment.segment_offset,
                        segment.segment_vaddr,
                        segment.segment_paddr,
                        segment.segment_filesz,
                        segment.segment_memsz,
                        segment.segment_align,
                        segment.segment_entropy,
                        segment.segment_sha256,
                        segment.segment_md5,
                        current_time
                    ]
                    data.append(row)

                column_names = [
                    'sha256', 'md5', 'sha1',
                    'segment_type', 'segment_type_str', 'segment_flags', 'segment_flags_str',
                    'segment_offset', 'segment_vaddr', 'segment_paddr',
                    'segment_filesz', 'segment_memsz', 'segment_align',
                    'segment_entropy', 'segment_sha256', 'segment_md5',
                    'analysis_date'
                ]

                column_type_names = [
                    'FixedString(64)', 'FixedString(32)', 'FixedString(40)',
                    "Enum8('NULL'=0, 'LOAD'=1, 'DYNAMIC'=2, 'INTERP'=3, 'NOTE'=4, 'SHLIB'=5, 'PHDR'=6, 'TLS'=7)",
                    'LowCardinality(String)',
                    'UInt32',
                    'Array(LowCardinality(String))',
                    'UInt64', 'UInt64', 'UInt64', 'UInt64', 'UInt64', 'UInt64',
                    'Float64',
                    'FixedString(64)', 'FixedString(32)',
                    'DateTime64(3, \'UTC\')'
                ]

                if not data:
                    return None

                return (data, column_names, column_type_names)

            except Exception as e:
                self.log.error(f"Error preparing export data: {e}")
                raise

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