James R. Eagan

15 papers A* 6A 1C 1Misc 1Journal 2Unranked 3
YearRankTypeTitle / Venue / Authors
2024 A* conf
CHI
Astrid Bertrand, James R. Eagan, Winston Maxwell, Joshua Brand
2024 A* conf
UIST
Clemens Nylandsted Klokmose, James R. Eagan, Peter van Hardenberg
2023 J jnl
ACM Trans. Comput. Hum. Interact.
Marcel Borowski, Bjarke Vognstrup Fog, Carla F. Griggio, James R. Eagan, Clemens Nylandsted Klokmose
2023 A* conf
CHI
Astrid Bertrand, Tiphaine Viard, Rafik Belloum, James R. Eagan, Winston Maxwell
2023 conf
FAccT
Astrid Bertrand, James R. Eagan, Winston Maxwell
2022 C conf
AIES
Astrid Bertrand, Rafik Belloum, James R. Eagan, Winston Maxwell
2020 J jnl
IEEE Trans. Vis. Comput. Graph.
Jiali Liu, Nadia Boukhelifa, James R. Eagan
2017 A* conf
UIST
Roman Rädle, Midas Nouwens, Kristian Antonsen, James R. Eagan, Clemens Nylandsted Klokmose
2017 conf
INTERACT (3)
James R. Eagan
2016 conf
CSCW Companion
Clemens Nylandsted Klokmose, James R. Eagan, Siemen Baader, Wendy E. Mackay, Michel Beaudouin-Lafon
2011 A* conf
UIST
James R. Eagan, Michel Beaudouin-Lafon, Wendy E. Mackay
2008 Misc conf
UbiComp
Erika Shehan Poole, Christopher A. Le Dantec, James R. Eagan, W. Keith Edwards
2008
James R. Eagan
2008 A* conf
CHI
James R. Eagan, John T. Stasko
2006 A conf
Conference on Designing Interactive Systems
James R. Eagan
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())