Ramesh Gopinath

12 papers A 2Misc 5Unranked 5
YearRankTypeTitle / Venue / Authors
2007 conf
ICASSP (4)
Suleyman Serdar Kozat, Karthik Visweswariah, Ramesh Gopinath
2006 conf
ICASSP (1)
Suleyman Serdar Kozat, Karthik Visweswariah, Ramesh Gopinath
2005 conf
ICASSP (1)
Peder A. Olsen, Karthik Visweswariah, Ramesh Gopinath
2003 conf
ICASSP (1)
Scott Axelrod, Ramesh Gopinath, Peder A. Olsen, Karthik Visweswariah
2003 conf
ICASSP (1)
Karthik Visweswariah, Peder A. Olsen, Ramesh Gopinath, Scott Axelrod
2002 Misc conf
ICASSP
Ramesh Gopinath, Vaibhava Goel, Karthik Visweswariah, Peder A. Olsen
2002 A conf
INTERSPEECH
Jing Huang, Vaibhava Goel, Ramesh Gopinath, Brian Kingsbury, Peder A. Olsen, Karthik Visweswariah
2002 A conf
INTERSPEECH
Scott Axelrod, Ramesh Gopinath, Peder A. Olsen
2002 Misc conf
ICASSP
Vaibhava Goel, Karthik Visweswariah, Ramesh Gopinath
2002 Misc conf
ICASSP
Karthik Visweswariah, Vaibhava Goel, Ramesh Gopinath
2001 Misc conf
ICASSP
Liam Comerford, David Frank, Ponani S. Gopalakrishnan, Ramesh Gopinath, Jan Sedivý
1997 Misc conf
ICASSP
Raimo Bakis, Scott Saobing Chen, Ponani S. Gopalakrishnan, Ramesh Gopinath, Stéphane H. Maes, Lazaros Polymenakos
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())