Oleksii Sidorov

19 papers Journal 10Unranked 9
YearRankTypeTitle / Venue / Authors
2020 conf
CHI Extended Abstracts
Oleksii Sidorov, Marius Pedersen, Sumit Shekhar, Nam Wook Kim
2020 J jnl
Appl. Artif. Intell.
Oleksii Sidorov
2020 conf
Material Appearance
Oleksii Sidorov, Jon Yngve Hardeberg, Sony George, Joshua S. Harvey, Hannah E. Smithson
2020 conf
ECCV (2)
Oleksii Sidorov, Ronghang Hu, Marcus Rohrbach, Amanpreet Singh
2020 J jnl
CoRR
Oleksii Sidorov, Ronghang Hu, Marcus Rohrbach, Amanpreet Singh
2019 J jnl
CoRR
Oleksii Sidorov, Jon Yngve Hardeberg
2019 J jnl
CoRR
Oleksii Sidorov, Marius Pedersen, Nam Wook Kim, Sumit Shekhar
2019 conf
CVPR Workshops
Oleksii Sidorov
2019 conf
CVPR Workshops
Oleksii Sidorov
2019 conf
ICCV Workshops
Oleksii Sidorov, Jon Yngve Hardeberg
2019 J jnl
CoRR
Oleksii Sidorov, Jon Yngve Hardeberg
2019 conf
ICCV Workshops
Oleksii Sidorov, Jon Yngve Hardeberg
2019 conf
ML4H@NeurIPS
Oleksii Sidorov, Congcong Wang, Faouzi Alaya Cheikh
2019 J jnl
CoRR
Oleksii Sidorov, Congcong Wang, Faouzi Alaya Cheikh
2019 J jnl
CoRR
Oleksii Sidorov, Joshua S. Harvey, Hannah E. Smithson, Jon Yngve Hardeberg
2018 J jnl
CoRR
Oleksii Sidorov
2018 J jnl
CoRR
Oleksii Sidorov
2018 J jnl
CoRR
Oleksii Sidorov
2018 conf
CVCS
Oleksii Sidorov
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())