Jan Bessai

17 papers A 1B 1C 1Journal 3Unranked 10
YearRankTypeTitle / Venue / Authors
2024 conf
LION
Anne Meyer, Hadi Kutabi, Jan Bessai, Daniel Scholtyssek
2022 C conf
WAFR
Tristan Schäfer, Jan Bessai, Constantin Chaumet, Jakob Rehof, Christian Riest
2022 B conf
FSCD
Jan Bessai, Lukasz Czajka, Felix Laarmann, Jakob Rehof
2021 J jnl
Dagstuhl Artifacts Ser.
Jan Bessai, George T. Heineman, Boris Düdder
2021 A conf
ECOOP
Jan Bessai, George T. Heineman, Boris Düdder
2019
Jan Bessai
2019 conf
F-IDE@FM
Jan Bessai, Moritz Roidl, Anna Vasileva
2018 conf
Models, Mindsets, Meta
Jan Bessai, Jakob Rehof, Boris Düdder
2018 J jnl
Log. Methods Comput. Sci.
Jan Bessai, Tzu-Chun Chen, Andrej Dudenhefner, Boris Düdder, Ugo de'Liguoro, Jakob Rehof
2018 conf
F-IDE@FLoC
Jan Bessai, Anna Vasileva
2017 J jnl
CoRR
Jan Bessai, Tzu-Chun Chen, Andrej Dudenhefner, Boris Düdder, Ugo de'Liguoro, Jakob Rehof
2016 conf
ISoLA (1)
George T. Heineman, Jan Bessai, Boris Düdder, Jakob Rehof
2016 conf
ISoLA (1)
Jan Bessai, Andrej Dudenhefner, Boris Düdder, Moritz Martens, Jakob Rehof
2015 conf
FACS
Jan Bessai, Boris Düdder, George T. Heineman, Jakob Rehof
2015 conf
TLCA
Jan Bessai, Andrej Dudenhefner, Boris Düdder, Tzu-Chun Chen, Ugo de'Liguoro, Jakob Rehof
2014 conf
ISoLA (1)
Jan Bessai, Andrej Dudenhefner, Boris Düdder, Moritz Martens, Jakob Rehof
2014 conf
ITRS
Jan Bessai, Boris Düdder, Andrej Dudenhefner, Tzu-Chun Chen, Ugo de'Liguoro
redb/extractors/decompiler/bninja/analysis/strings.py
← Index redb/extractors/decompiler/bninja/analysis/strings.py python
from collections import Counter
import math

class StringAnalysis:
    def __init__(self, bv, functions):
        self.bv = bv
        self.functions = functions

    def entropy(self, s: str) -> float:
        """Compute Shannon entropy of a string."""
        if not s:
            return 0.0
        freq = Counter(s)
        length = len(s)
        return -sum((count / length) * math.log2(count / length) for count in freq.values())

    def analyze(self):
        """
        Extract unique strings from the binary.

        Deduplicates by (string, encoding) within the same binary, keeping the
        first occurrence (lowest offset). Cross-binary deduplication and
        aggregation is handled by ClickHouse materialized views.
        """
        strings = {}

        # Sort strings by their starting address
        sorted_entries = sorted(self.bv.strings, key=lambda e: e.start)

        for entry in sorted_entries:
            # Key is the string and its encoding
            key = (entry.value, entry.type.name)

            # Skip if this string (value + encoding) was already added.
            # Because entries are sorted by address, the first one is always kept.
            if key in strings:
                continue

            # Store only the first occurrence with schema-matching field names
            # entry.length is the raw byte length, len(entry.value) is decoded string length
            string_entry = {
                "string": entry.value,
                "string_raw": entry.raw,
                "string_encoding": entry.type.name,
                "string_offset": entry.start,
                "string_length": len(entry.value),
                "string_raw_length": entry.length,
                "string_entropy": self.entropy(entry.value),
            }

            strings[key] = string_entry

        # Return as list for export compatibility
        return list(strings.values())