Ran Duan

16 papers A* 1A 2B 1Journal 8Unranked 4
YearRankTypeTitle / Venue / Authors
2025 conf
ROBIO
Changhong Fu, Mengyuan Li, Haobo Zuo, Liangliang Yao, Guangze Zheng, Ran Duan, Bo Wu
2024 J jnl
IEEE J. Sel. Top. Appl. Earth Obs. Remote. Sens.
Ran Duan, Long Chen, Zhaojin Li, Zeyu Chen, Bo Wu
2024 J jnl
IEEE Trans. Instrum. Meas.
Jin He, Ran Duan, Mianxiong Dong, Yonggui Kao, Ge Guo, Jun Liu
2024 conf
ICARM
Ran Duan, Bo Wu, Hao Zhou, Haobo Zuo, Zhengshu He, Chenxi Xiao, Changhong Fu
2024 conf
ICARM
Haobo Zuo, Changhong Fu, Liang Lu, Ran Duan, Yinqiang Zhang
2023 J jnl
IEEE Trans. Instrum. Meas.
Ran Duan, Danda Pani Paudel, Chih-Yung Wen, Peng Lu
2021 A* conf
ICRA
Ran Duan, Changhong Fu, Kostas Alexis, Erdal Kayacan
2019 A conf
IROS
Changhong Fu, Ziyuan Huang, Yiming Li, Ran Duan, Peng Lu
2019 J jnl
CoRR
Changhong Fu, Ziyuan Huang, Yiming Li, Ran Duan, Peng Lu
2019 J jnl
IEEE Access
Changhong Fu, Yinqiang Zhang, Ziyuan Huang, Ran Duan, Zongwu Xie
2019 J jnl
Inf. Sci.
Changhong Fu, Ran Duan, Erdal Kayacan
2018 conf
ROBIO
Changhong Fu, Yinqiang Zhang, Ran Duan, Zongwu Xie
2017 J jnl
Eng. Appl. Artif. Intell.
Ran Duan, Changhong Fu, Erdal Kayacan
2016 J jnl
Sensors
Changhong Fu, Ran Duan, Dogan Kircali, Erdal Kayacan
2016 B conf
ICIP
Ran Duan, Changhong Fu, Erdal Kayacan, Danda Pani Paudel
2016 A conf
IROS
Ran Duan, Changhong Fu, Erdal Kayacan
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())