Kaixiang Zhu

12 papers A 1B 1C 1Journal 4Unranked 5
YearRankTypeTitle / Venue / Authors
2026 J jnl
ACM Trans. Design Autom. Electr. Syst.
Kaixiang Zhu, Zhen Li, Jide Zhang, Wai-Shing Luk, Lingli Wang
2026 conf
ASP-DAC
Kaixiang Zhu, Jiangnan Li, Lingli Wang, Wai-Shing Luk
2025 J jnl
CoRR
Moucheng Yang, Kaixiang Zhu, Lingli Wang, Xuegong Zhou
2025 A conf
ICCAD
Jiangnan Li, Xianfeng Cao, Kaixiang Zhu, Wenbo Yin, Lingli Wang
2025 B conf
FPL
Yuanqi Wang, Yunfei Dai, Jiangnan Li, Kaixiang Zhu, Huizhen Kuang, Hao Zhou, Eric Ren, Xifan Tang, Weijun Qin, Tao Li, Lingli Wang
2025 J jnl
ACM Trans. Reconfigurable Technol. Syst.
Moucheng Yang, Chengyu Zeng, Kaixiang Zhu, Lingli Wang
2025 conf
ASP-DAC
Kaixiang Zhu, Wai-Shing Luk, Lingli Wang
2024 J jnl
CoRR
Zhen Li, Kaixiang Zhu, Xuegong Zhou, Lingli Wang
2023 conf
ASICON
Mingyang Chen, Yunhui Qiu, Kaixiang Zhu, Lingli Wang
2023 conf
ICFPT
Moucheng Yang, Kaixiang Zhu, Lingli Wang, Xuegong Zhou
2023 conf
ASICON
Jide Zhang, Kaixiang Zhu, Kaichuang Shi, Lingli Wang, Hao Zhou
2021 C conf
BROADNETS
Kaixiang Zhu, Lily D. Li, Michael M. Li
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())