Valentin Jijkoun

54 papers A* 5A 5B 1Journal 3Unranked 38
YearRankTypeTitle / Venue / Authors
2018 A* conf
KDD
Qiaoling Liu, Josh Chao, Thomas Mahoney, Alan Chern, Chris Min, Faizan Javed, Valentin Jijkoun
2017 conf
ICDM Workshops
Mahak Goindani, Qiaoling Liu, Josh Chao, Valentin Jijkoun
2013 ch.
Essential Speech and Language Technology for Dutch
Maarten de Rijke, Valentin Jijkoun, Fons Laan, Wouter Weerkamp, Paul Ackermans, Gijs Geleijnse
2011 A* conf
SIGIR
Valentin Jijkoun, Maarten de Rijke
2011 J jnl
SIGIR Forum
Corrado Boscarino, Katja Hofmann, Valentin Jijkoun, Edgar Meij, Maarten de Rijke, Wouter Weerkamp
2010 A* conf
ACL
Valentin Jijkoun, Maarten de Rijke, Wouter Weerkamp
2009 A conf
EACL
Valentin Jijkoun, Katja Hofmann
2008 ed.
CLEF
Carol Peters, Valentin Jijkoun, Thomas Mandl, Henning Müller, Douglas W. Oard, Anselmo Peñas, Vivien Petras, Diana Santos
2008 conf
AND
Valentin Jijkoun, Mahboob Alam Khalid, Maarten Marx, Maarten de Rijke
2008 conf
CLEF (Working Notes)
Valentin Jijkoun, Maarten de Rijke
2008 conf
CLEF
Valentin Jijkoun, Maarten de Rijke
2008 A conf
ECIR
Mahboob Alam Khalid, Valentin Jijkoun, Maarten de Rijke
2008 conf
TAC
Valentin Jijkoun, Maarten de Rijke
2007 A conf
CIKM
Luís Sarmento, Valentin Jijkoun, Maarten de Rijke, Eugénio C. Oliveira
2007 J jnl
J. Appl. Log.
Stefan Schlobach, David Ahn, Maarten de Rijke, Valentin Jijkoun
2007 A* conf
WWW
Valentin Jijkoun, Maarten Marx, Maarten de Rijke, Frank van Waveren
2007 conf
Web Intelligence
Sisay Fissaha Adafre, Valentin Jijkoun, Maarten de Rijke
2007 conf
DEXA Workshops
Mahboob Alam Khalid, Valentin Jijkoun, Maarten de Rijke
2007 conf
CLEF
Valentin Jijkoun, Maarten de Rijke
2007 conf
CLEF (Working Notes)
Valentin Jijkoun, Maarten de Rijke
2007 conf
CLEF
Danilo Giampiccolo, Pamela Forner, Jesús Herrera, Anselmo Peñas, Christelle Ayache, Corina Forascu, Valentin Jijkoun, Petya Osenova, Paulo Rocha, Bogdan Sacaleanu, Richard F. E. Sutcliffe
2007 conf
CLEF (Working Notes)
Danilo Giampiccolo, Pamela Forner, Anselmo Peñas, Christelle Ayache, Dan Cristea, Valentin Jijkoun, Petya Osenova, Paulo Rocha, Bogdan Sacaleanu, Richard F. E. Sutcliffe
2007 conf
CLEF (Working Notes)
Valentin Jijkoun, Katja Hofmann, David Ahn, Mahboob Alam Khalid, Joris van Rantwijk, Maarten de Rijke, Erik F. Tjong Kim Sang
2007 conf
CLEF (Working Notes)
Valentin Jijkoun, Maarten de Rijke
2007 conf
TREC
Katja Hofmann, Valentin Jijkoun, Mahboob Alam Khalid, Joris van Rantwijk, Erik F. Tjong Kim Sang
2007 conf
CLEF
Valentin Jijkoun, Katja Hofmann, David Ahn, Mahboob Alam Khalid, Joris van Rantwijk, Maarten de Rijke, Erik F. Tjong Kim Sang
2007 conf
CLEF
Valentin Jijkoun, Maarten de Rijke
2007 conf
EVIA@NTCIR
Valentin Jijkoun, Maarten de Rijke
2006 conf
CLEF
Sisay Fissaha Adafre, Valentin Jijkoun, Maarten de Rijke
2006 conf
CLEF (Working Notes)
Valentin Jijkoun, Maarten de Rijke
2006 conf
CLEF
Bernardo Magnini, Danilo Giampiccolo, Pamela Forner, Christelle Ayache, Valentin Jijkoun, Petya Osenova, Anselmo Peñas, Paulo Rocha, Bogdan Sacaleanu, Richard F. E. Sutcliffe
2006 conf
CLEF (Working Notes)
Bernardo Magnini, Danilo Giampiccolo, Pamela Forner, Christelle Ayache, Petya Osenova, Anselmo Peñas, Valentin Jijkoun, Bogdan Sacaleanu, Paulo Rocha, Richard F. E. Sutcliffe
2006 conf
CLEF
Valentin Jijkoun, Maarten de Rijke
2006 conf
CLEF
David Ahn, Valentin Jijkoun, Joris van Rantwijk, Maarten de Rijke, Erik F. Tjong Kim Sang
2006 conf
NLPXML@EACL
Wouter Alink, Valentin Jijkoun, David Ahn, Maarten de Rijke, Peter Boncz, Arjen P. de Vries
2006 conf
CLEF (Working Notes)
Valentin Jijkoun, Joris van Rantwijk, David Ahn, Erik F. Tjong Kim Sang, Maarten de Rijke
2006 conf
CLEF (Working Notes)
Sisay Fissaha Adafre, Valentin Jijkoun, Maarten de Rijke
2005 conf
MLCW
Valentin Jijkoun, Maarten de Rijke
2005 A conf
CIKM
Valentin Jijkoun, Maarten de Rijke
2005 conf
CLEF (Working Notes)
David Ahn, Valentin Jijkoun, Karin Müller, Maarten de Rijke, Erik F. Tjong Kim Sang
2005 conf
TREC
David Ahn, Sisay Fissaha Adafre, Valentin Jijkoun, Karin Müller, Maarten de Rijke, Erik F. Tjong Kim Sang
2005 conf
CLEF
David Ahn, Valentin Jijkoun, Karin Müller, Maarten de Rijke, Erik F. Tjong Kim Sang
2005 J jnl
J. Digit. Inf. Manag.
Gilad Mishne, Maarten de Rijke, Valentin Jijkoun
2004 A conf
ECIR
Valentin Jijkoun, Maarten de Rijke
2004 A* conf
ACL
Valentin Jijkoun, Maarten de Rijke
2004 B conf
COLING
Valentin Jijkoun, Jori Mur, Maarten de Rijke
2004 conf
CLEF
David Ahn, Valentin Jijkoun, Karin Müller, Maarten de Rijke, Stefan Schlobach, Gilad Mishne
2004 conf
CLEF (Working Notes)
Valentin Jijkoun, Gilad Mishne, Maarten de Rijke, Stefan Schlobach, David Ahn, Karin Müller
2004 conf
SENSEVAL@ACL
David Ahn, Sisay Fissaha, Valentin Jijkoun, Maarten de Rijke
2004 conf
TREC
David Ahn, Valentin Jijkoun, Gilad Mishne, Karin Müller, Maarten de Rijke, Stefan Schlobach
2003 conf
ACL (Companion)
Valentin Jijkoun
2003 conf
CLEF
Valentin Jijkoun, Gilad Mishne, Maarten de Rijke
2003 conf
CLEF (Working Notes)
Valentin Jijkoun, Gilad Mishne, Maarten de Rijke
2003 conf
TREC
Valentin Jijkoun, Gilad Mishne, Christof Monz, Maarten de Rijke, Stefan Schlobach, Oren Tsur
redb/extractors/elf_extractors/elf_relocations.py
← Index redb/extractors/elf_extractors/elf_relocations.py python
import inspect
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 ELFRelocation


class ELFRelocationExtractor(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_relocations = []
        self.elastic_index = self.index_prefix + "-elf_relocations"
        self.log.debug(inspect.currentframe().f_code.co_name)

    def _get_relocation_type_string(self, reloc_type: int, machine_arch: str) -> str:
        """Convert relocation type number to human-readable string based on architecture."""
        # This is a simplified mapping - real implementation would need comprehensive
        # architecture-specific relocation type mappings

        common_types = {
            0: "R_NONE",
            1: "R_DIRECT",
            2: "R_PC_RELATIVE",
            3: "R_GOT",
            4: "R_PLT",
            5: "R_COPY",
            6: "R_GLOB_DAT",
            7: "R_JMP_SLOT",
            8: "R_RELATIVE"
        }

        # Architecture-specific mappings could be added here
        if machine_arch == "x86_64":
            x86_64_types = {
                1: "R_X86_64_64",
                2: "R_X86_64_PC32",
                3: "R_X86_64_GOT32",
                4: "R_X86_64_PLT32",
                5: "R_X86_64_COPY",
                6: "R_X86_64_GLOB_DAT",
                7: "R_X86_64_JUMP_SLOT",
                8: "R_X86_64_RELATIVE"
            }
            return x86_64_types.get(reloc_type, f"R_X86_64_{reloc_type}")
        elif machine_arch == "x86":
            i386_types = {
                1: "R_386_32",
                2: "R_386_PC32",
                3: "R_386_GOT32",
                4: "R_386_PLT32",
                5: "R_386_COPY",
                6: "R_386_GLOB_DAT",
                7: "R_386_JMP_SLOT",
                8: "R_386_RELATIVE"
            }
            return i386_types.get(reloc_type, f"R_386_{reloc_type}")

        return common_types.get(reloc_type, f"R_UNKNOWN_{reloc_type}")

    def _extract_relocation_data(self, relocation, section_name: str, machine_arch: str) -> Dict:
        """Extract data from a single relocation entry."""
        try:
            # Get relocation offset
            relocation_offset = relocation.entry.get('r_offset', 0)

            # Get relocation type
            relocation_type = relocation.entry.get('r_info_type', 0)

            # Get symbol index
            relocation_symbol_index = relocation.entry.get('r_info_sym', 0)

            # Get addend (only present in RELA sections)
            relocation_addend = None
            if hasattr(relocation.entry, 'r_addend'):
                relocation_addend = relocation.entry.get('r_addend', 0)

            # Get symbol name if available
            relocation_symbol_name = ""
            if hasattr(relocation, 'symbol') and relocation.symbol:
                relocation_symbol_name = relocation.symbol.name or f"<symbol_{relocation_symbol_index}>"
            else:
                relocation_symbol_name = f"<symbol_{relocation_symbol_index}>"

            # Get type string mapping
            relocation_type_str = self._get_relocation_type_string(relocation_type, machine_arch)

            return ELFRelocation(
                relocation_offset=relocation_offset,
                relocation_type=relocation_type,
                relocation_type_str=relocation_type_str,
                relocation_symbol_index=relocation_symbol_index,
                relocation_symbol_name=relocation_symbol_name,
                relocation_section=section_name,
                relocation_addend=relocation_addend
            )

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

    def _extract_relocations_from_section(self, section, machine_arch: str) -> List[Dict]:
        """Extract all relocations from a relocation section."""
        relocations = []

        try:
            if not hasattr(section, 'iter_relocations'):
                return relocations

            section_name = section.name or f"<unnamed_section>"

            for relocation in section.iter_relocations():
                reloc_data = self._extract_relocation_data(relocation, section_name, machine_arch)
                if reloc_data:
                    relocations.append(reloc_data)

        except Exception as e:
            self.log.error(f"Error extracting relocations from section {section.name}: {e}")

        return relocations

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

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

            def extract_data(elf):
                # Get architecture for relocation type mapping
                machine_arch = self._get_architecture()
                all_relocations = []

                # Iterate through all sections looking for relocation sections with per-section error handling
                for section_index, section in enumerate(elf.iter_sections()):
                    try:
                        # Check if this is a relocation section (.rel or .rela)
                        if (section.name and
                            (section.name.startswith('.rel') or section.name.startswith('.rela')) and
                            hasattr(section, 'iter_relocations')):

                            section_relocations = self._extract_relocations_from_section(section, machine_arch)
                            all_relocations.extend(section_relocations)
                            self.log.debug(f"Extracted {len(section_relocations)} relocations from section {section.name}")
                    except Exception as e:
                        section_name = getattr(section, 'name', f'section_{section_index}')
                        self.log.warning(f"Error processing relocation section {section_name}: {e}")
                        # Continue processing other sections

                return all_relocations

            if not self._is_elf_file():
                return None

            result = self._with_elf_file(extract_data)
            if result is None:
                return None

            self.elf_relocations = result
            return self.elf_relocations

        except Exception as e:
            self.log.error(f"Error extracting ELF relocations {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_relocations
        elif exporter_type == "ClickHouseExporter":
            try:
                # Return valid empty structure if no relocations (e.g., statically linked binary)
                # None is reserved for actual errors

                # Prepare data arrays for all relocations
                data = []
                current_time = datetime.now(timezone.utc)
                for reloc in self.elf_relocations:
                    row = [
                        self.sha256,
                        self.md5,
                        self.sha1,
                        reloc.relocation_offset,
                        reloc.relocation_type,
                        reloc.relocation_type_str,
                        reloc.relocation_symbol_index,
                        reloc.relocation_symbol_name,
                        reloc.relocation_addend,
                        reloc.relocation_section,
                        current_time
                    ]
                    data.append(row)

                column_names = [
                    'sha256', 'md5', 'sha1',
                    'relocation_offset', 'relocation_type', 'relocation_type_str',
                    'relocation_symbol_index', 'relocation_symbol_name',
                    'relocation_addend', 'relocation_section',
                    'analysis_date'
                ]

                if not data:
                    return None

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

                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_relocations"