Mahshid Riahinia

12 papers Misc 1Journal 6Unranked 4
YearRankTypeTitle / Venue / Authors
2025 J jnl
CoRR
Pouria Fallahpour, Alex B. Grilo, Garazi Muguruza, Mahshid Riahinia
2025 J jnl
IACR Cryptol. ePrint Arch.
Pouria Fallahpour, Alex B. Grilo, Garazi Muguruza, Mahshid Riahinia
2025 conf
ASIACRYPT (7)
Lennart Braun, Geoffroy Couteau, Kelsey Melissaris, Mahshid Riahinia, Elahe Sadeghi
2025 J jnl
IACR Cryptol. ePrint Arch.
Lennart Braun, Geoffroy Couteau, Kelsey Melissaris, Mahshid Riahinia, Elahe Sadeghi
2024
Mahshid Riahinia
2024 conf
EUROCRYPT (6)
Dung Bui, Geoffroy Couteau, Pierre Meyer, Alain Passelègue, Mahshid Riahinia
2024 J jnl
IACR Cryptol. ePrint Arch.
Dung Bui, Geoffroy Couteau, Pierre Meyer, Alain Passelègue, Mahshid Riahinia
2023 conf
EUROCRYPT (3)
Geoffroy Couteau, Pierre Meyer, Alain Passelègue, Mahshid Riahinia
2023 J jnl
IACR Cryptol. ePrint Arch.
Geoffroy Couteau, Pierre Meyer, Alain Passelègue, Mahshid Riahinia
2022 Misc conf
SCN
Benoît Libert, Alain Passelègue, Mahshid Riahinia
2022 J jnl
IACR Cryptol. ePrint Arch.
Benoît Libert, Alain Passelègue, Mahshid Riahinia
2022 conf
ASIACRYPT (4)
Benoît Libert, Alain Passelègue, Mahshid Riahinia
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())