Xia Lei

64 papers B 3C 1Journal 47Unranked 13
YearRankTypeTitle / Venue / Authors
2026 J jnl
Comput. Commun.
Jianhua Liu, Bo Tang, Jiajia Liu, Xia Lei, Xiaoguang Tu, Xiaofan Wang
2026 J jnl
Int. J. Web Inf. Syst.
Jianhua Liu, Xudong Zhang, Xia Lei, Houqiang Hua, Xiaoguang Tu
2026 J jnl
CCF Trans. Pervasive Comput. Interact.
Jianhua Liu, Guilin Yuan, Bo Tang, Jiajia Liu, Xiaoguang Tu, Xia Lei
2025 J jnl
IEEE J. Sel. Top. Appl. Earth Obs. Remote. Sens.
Mingyang Song, Lu Xu, Nanhuanuowa Zhu, Zihuan Guo, Haoxuan Duan, Jiahua Teng, Xia Lei, Lijun Zuo
2025 J jnl
CoRR
Qing-xin Meng, Xia Lei, Jian-wei Liu
2025 J jnl
IEICE Trans. Inf. Syst.
Xiaoguang Tu, Zhi He, Gui Fu, Jianhua Liu, Mian Zhong, Chao Zhou, Xia Lei, Juhang Yin, Yi Huang, Yu Wang
2025 J jnl
Inf. Sci.
Yongkai Fan, Hongxue Bao, Xia Lei
2025 J jnl
Softw. Pract. Exp.
Xia Lei, Siqi Wang, Yongkai Fan, Wenqian Shang
2025 J jnl
IEEE Internet Things J.
Xia Lei, Siqi Wang, Yongkai Fan
2025 J jnl
IEICE Trans. Inf. Syst.
Xiaoguang Tu, Zhi He, Gui Fu, Jianhua Liu, Mian Zhong, Chao Zhou, Xia Lei, Juhang Yin, Yi Huang, Yu Wang
2025 J jnl
Briefings Bioinform.
Shunying Liu, Lingfei Li, Yi Liang, Yang Tan, Xiaoyu Wang, Yanhai Feng, Nian Chen, Xia Lei
2025 J jnl
PLoS Comput. Biol.
Zhongyuan Cui, Xia Lei, Yani Gou, Zhixian Wu, Xiaojun Huang
2024 J jnl
Sensors
Xiaoqing Xing, Yao Zou, Mian Zhong, Shichen Li, Hongyun Fan, Xia Lei, Juhang Yin, Jiaqing Shen, Xinyi Liu, Man Xu, Yong Jiang, Tao Tang, Yu Qian, Chao Zhou
2024 J jnl
Inf. Fusion
Wenqian Shang, Jiazhao Chai, Jianxiang Cao, Xia Lei, Haibin Zhu, Yongkai Fan, Weiping Ding
2024 J jnl
J. Electronic Imaging
Xiaoguang Tu, Yuang Liu, Mengjie Zhao, Bokai Liu, Jianhua Liu, Xia Lei, Luopeng Xu, Xinyu Zhu, Yu Wang, Yi Huang
2024 J jnl
IEEE Trans. Dependable Secur. Comput.
Yongkai Fan, Kaile Ma, Linlin Zhang, Xia Lei, Guangquan Xu, Gang Tan
2023 J jnl
Comput. Sci. Inf. Syst.
Xia Lei, Jia-Jiang Lin, Xiong-Lin Luo, Yongkai Fan
2023 conf
VTC Fall
Chenglin Zhong, Qinghe Du, Xia Lei, Yue Xiao
2023 J jnl
Digit. Commun. Networks
Xia Lei, Yongkai Fan, Xiong-Lin Luo
2023 J jnl
IEEE Trans. Green Commun. Netw.
Xia Lei, Yongkai Fan
2022 J jnl
Sensors
Tao Zhan, Jiangong Chen, Shan Luan, Xia Lei
2022 J jnl
Sensors
Ningbo Fan, Jiahui Sang, Yulin Heng, Xia Lei, Tao Tao
2022 J jnl
Softw. Pract. Exp.
Yongkai Fan, Xiaodong Lin, Wei Liang, Jinghan Wang, Gang Tan, Xia Lei, Jing Lei
2021 J jnl
ACM Trans. Multim. Comput. Commun. Appl.
Wei Liang, Jing Long, Kuan-Ching Li, Jianbo Xu, Nanjun Ma, Xia Lei
2021 J jnl
IEEE Trans. Emerg. Top. Comput.
Wei Liang, Dafang Zhang, Xia Lei, Mingdong Tang, Kuan-Ching Li, Albert Y. Zomaya
2021 J jnl
Appl. Soft Comput.
Xia Lei, Yongkai Fan, Kuan-Ching Li, Arcangelo Castiglione, Qian Hu
2021 J jnl
ACM Trans. Asian Low Resour. Lang. Inf. Process.
Ruan Guangce, Xia Lei
2021 J jnl
Inf. Sci.
Yongkai Fan, Jiaxu Liu, Kuan-Ching Li, Wei Liang, Xia Lei, Gan Tan, Mingdong Tang
2021 J jnl
J. Parallel Distributed Comput.
Yongkai Fan, Jianrong Bai, Xia Lei, Weiguo Lin, Qian Hu, Guodong Wu, Jiaming Guo, Gang Tan
2021 C conf
IGARSS
Linlin Ge, Yufei Wang, Qi Zhang, Zheyuan Du, Chang Liu, Yifei Dong, Tony Sleigh, Tao Guo, Xia Lei, Zhewen Ma
2021 J jnl
IEEE Internet Things J.
Yongkai Fan, Guanqun Zhao, Xia Lei, Wei Liang, Kuan-Ching Li, Kim-Kwang Raymond Choo, Chunsheng Zhu
2020 J jnl
J. Netw. Comput. Appl.
Yongkai Fan, Jianrong Bai, Xia Lei, Yuqing Zhang, Bin Zhang, Kuan-Ching Li, Gang Tan
2019 conf
BlockSys
Yongkai Fan, Jinghan Wang, Zhenting Hong, Xia Lei, Fanglue Xia, Junjie Ma, Cong Peng, Xiaofeng Sun
2019 conf
BlockSys
Wei Liang, Xia Lei, Kuan-Ching Li, Yongkai Fan, Jiahong Cai
2019 conf
BigDataSecurity/HPSC/IDS
Xia Lei, Wei Liang, Kuan-Ching Li, Haibo Luo, Jianqiang Hu, Jiahong Cai, Yanting Li
2019 conf
IoT S&P@CCS
Yongkai Fan, Guanqun Zhao, Xiaofeng Sun, Jinghan Wang, Xia Lei, Fanglue Xia, Cong Peng
2019 conf
SmartCom
Weidong Xiao, Weihong Huang, Wei Liang, Xia Lei, Jiahong Cai, Yuanming Wang, Yanting Li
2019 J jnl
Clust. Comput.
Cui Zhang, Xia Lei, Yannan Yuan, Lijun Song
2019 J jnl
Future Gener. Comput. Syst.
Wei Liang, Jing Long, Xia Lei, Zhiqiang You, Haibo Luo, Jiahong Cai, Kuan-Ching Li
2019 J jnl
Clust. Comput.
Lijun Song, Feng Yu, Xia Lei, Jiang Du
2019 conf
NAS
Tianran Xiao, Wei Tong, Xia Lei, Jingning Liu, Bo Liu
2018 J jnl
Wirel. Pers. Commun.
Tao Hu, Maozhu Jin, Xia Lei, Zhixue Liao, Peng Ge
2015 J jnl
J. Intell. Fuzzy Syst.
Xia Lei, Hongjian Wu, Yan Shi, Peng Shi
2015 J jnl
Int. J. Bifurc. Chaos
Lijun Song, Xia Lei, Maozhu Jin, Zhihan Lv
2014 J jnl
IET Commun.
Ke Zhong, Xia Lei, Su Hu, Shaoqian Li
2013 conf
HMWC
Ke Zhong, Xia Lei, Shaoqian Li
2013 J jnl
EURASIP J. Wirel. Commun. Netw.
Ke Zhong, Xia Lei, Shaoqian Li
2013 J jnl
Wirel. Pers. Commun.
Ke Zhong, Xia Lei, Shaoqian Li
2013 J jnl
EURASIP J. Adv. Signal Process.
Ke Zhong, Xia Lei, Shaoqian Li
2012 J jnl
EURASIP J. Wirel. Commun. Netw.
Ke Zhong, Xia Lei, Binhong Dong, Shaoqian Li
2012 J jnl
Displays
Xu Wang, Junsheng Yu, Juan Zhao, Xia Lei
2012 J jnl
Displays
Junsheng Yu, Xia Lei, Rong Jiang, Juan Zhao
2011 conf
VTC Spring
Ke Zhong, Xia Lei, Shaoqian Li
2011 J jnl
IEEE Commun. Lett.
Ke Zhong, Xia Lei, Shaoqian Li
2010 J jnl
Int. J. Comput. Intell. Syst.
Xia Lei, Maozhu Jin, Qiang Wang
2010 B conf
WCNC
Chaojin Qing, Youxi Tang, Shihai Shao, Xia Lei
2010 J jnl
Int. J. Comput. Intell. Syst.
Maozhu Jin, Xia Lei, Jian Du
2009 conf
RSKT
Jian Du, Xia Lei, Shaoqian Li
2009 J jnl
Medical Biol. Eng. Comput.
Zhi Wang, Guotong Xu, Yalan Wu, Yuan Guan, Lu Cui, Xia Lei, Jingfa Zhang, Lisha Mou, Baogui Sun, Qiuyan Dai
2009 conf
RSKT
Weihua Chen, Xia Lei, Shaoqian Li
2007 conf
FGCN (2)
Xia Lei, Zheng Li, Youxi Tang, Shaoqian Li
2007 conf
FGCN (2)
Yuan Tian, Xia Lei, Wanbin Tang, Shaoqian Li
2003 B conf
GLOBECOM
Xia Lei, Youxi Tang, Shaoqian Li, Yingtao Li
2003 B conf
PIMRC
Xia Lei, Shaoqian Li, Youxi Tang
redb/extractors/decompiler/bninja/analysis/cfg-old.py
← Index redb/extractors/decompiler/bninja/analysis/cfg-old.py python
from collections import deque
from enum import Enum

from binaryninja.enums import (
    BranchType,
    InstructionTextTokenType,
)

# Support both package and standalone imports
try:
    from ..utils.hashes import calculate_md5, calculate_sha256
except ImportError:
    # Fallback to absolute imports (for multiprocessing spawned processes)
    from redb.extractors.decompiler.bninja.utils.hashes import calculate_md5, calculate_sha256


class CFGAnalysis:
    def __init__(self, function):
        self.function = function

    def determine_block_type(self, block) -> str:
        """Determine the type of a basic block."""
        # Check if it's a thunk function (usually just a jump or call)
        if len(block.disassembly_text) <= 2 and any(
            "jmp" in line.tokens[0].text.lower() for line in block.disassembly_text
        ):
            return "THUNK"

        # Check if it contains only data (no valid instructions)
        if all(not line.tokens for line in block.disassembly_text):
            return "DATA"

        # Default to code
        return "CODE"

    def extract_cyclomatic_complexity(self):
        """
        Cyclomatic complexity (McCabe’s metric) measures the number of linearly independent paths
        through a function’s control flow graph (CFG).
        The standard formula is:

            M = E - N + 2

        where:
            - E = number of edges in the CFG
            - N = number of nodes (basic blocks)
            - 2 accounts for the entry and exit nodes of a single connected graph
        """
        if self.function is None:
            return 0

        # number of basic blocks
        num_blocks = len(self.function.basic_blocks)
        # number of edges in the graph
        num_edges = sum(
            len(basic_block.outgoing_edges)
            for basic_block in self.function.basic_blocks
        )
        return num_edges - num_blocks + 2

    def extract_function_cfg(self):
        """Extract information about a function CFG and return it as a dictionary."""

        function = self.function
        function_data = {
            "function_address": self.function.start,
            "blocks": [],
            "measures": {
                "cyclomatic_complexity": self.extract_cyclomatic_complexity(),
            },
        }

        if self.function is None:
            return function_data

        # Get the map of the depth associated to every block
        depths = self.get_map_depth()

        # Get the map of the positions associated to every block
        id_maps = self.get_block_id_map()

        # Extract block data with graph structure information
        for block in function.basic_blocks:
            # dominators per every block translated
            dominators = sorted(self.extract_dominators(block, id_maps))

            # post dominators
            post_dominators = sorted(self.extract_post_dominators(block, id_maps))

            # Build block instructions string
            block_instructions = "\n".join(str(line) for line in block.disassembly_text)

            # Determine block type
            block_type = self.determine_block_type(block)

            # Extract successors directly from basic block
            successor_blocks = [edge.target.start for edge in block.outgoing_edges]
            # We ensure a canonical order and we sort the edges
            successor_blocks.sort()

            # Extract predecessors directly from basic block
            predecessor_blocks = [edge.source.start for edge in block.incoming_edges]
            # We ensure a canonical order and we sort the edges
            predecessor_blocks.sort()

            # Determine branch type from outgoing edges
            branch_type = self.determine_branch_type(block)

            instructions_count = len(block.disassembly_text)

            # Create block record
            block_json = {
                "function_address": self.function.start,
                "block_start_address": block.start,
                "block_end_address": block.end,
                "block_size": block.end - block.start,
                "instructions_count": instructions_count,
                "block_instructions_hash": calculate_sha256(block_instructions),
                "predecessor_blocks": predecessor_blocks,
                "successor_blocks": successor_blocks,
                "depth": depths[block.start],
                "position": id_maps[block.start],
                "branch_type": branch_type,
                "block_type": block_type,
                "flags": self.extract_block_flags(block),
                "dominators": dominators,
                "post_dominators": post_dominators,
            }
            function_data["blocks"].append(block_json)

        return function_data

    def extract_dominators(self, bb, id_maps):
        """Extract the dominators normalized"""
        dom_idx = [id_maps[d.start] for d in bb.dominators]
        return dom_idx

    def extract_post_dominators(self, bb, id_maps):
        """Extract the post-dominators normalized"""
        post_dom_idx = [id_maps[d.start] for d in bb.post_dominators]
        return post_dom_idx

    def determine_branch_type(self, block):
        """
        Determine the type of branch at the end of a basic block.
        This combines edge type information with instruction analysis.
        """
        # If no outgoing edges, it might be a return or terminal block
        if not block.outgoing_edges:
            # Check if the last instruction is a return
            for line in reversed(list(block.disassembly_text)):
                if line.tokens and any(
                    token.text.lower() in ["ret", "retn"] for token in line.tokens
                ):
                    return "RETURN"
            return "UNKNOWN"

        # Collect branch types from all outgoing edges
        branch_types = []
        for edge in block.outgoing_edges:
            edge_type = edge.type
            # Map edge type to our branch type enum
            if isinstance(edge_type, str):
                if edge_type == "IndirectCall":
                    branch_types.append("CALL")
                else:
                    branch_types.append("UNKNOWN")
            else:
                # Use our mapping for integer/enum values
                type_mapping = {
                    BranchType.UnconditionalBranch: "DIRECT",
                    BranchType.FalseBranch: "CONDITIONAL",
                    BranchType.TrueBranch: "CONDITIONAL",
                    BranchType.CallDestination: "CALL",
                    BranchType.FunctionReturn: "RETURN",
                    BranchType.SystemCall: "CALL",
                    BranchType.IndirectBranch: "INDIRECT",
                    BranchType.ExceptionBranch: "UNKNOWN",
                    BranchType.UnresolvedBranch: "UNKNOWN",
                    BranchType.UserDefinedBranch: "UNKNOWN",
                }
                branch_types.append(type_mapping.get(edge_type, "UNKNOWN"))

        # Determine overall branch type (prioritize CALL > RETURN > CONDITIONAL > DIRECT)
        if "CALL" in branch_types:
            return "CALL"
        elif "RETURN" in branch_types:
            return "RETURN"
        elif "CONDITIONAL" in branch_types:
            return "CONDITIONAL"
        elif "DIRECT" in branch_types:
            return "DIRECT"
        elif len(block.outgoing_edges) == 1:
            return "FALLTHROUGH"

        # If edge analysis was inconclusive, fall back to instruction analysis
        last_instr = None
        for line in reversed(list(block.disassembly_text)):
            if line.tokens:
                last_instr = line
                break

        if last_instr:
            mnemonic = None
            for token in last_instr.tokens:
                if token.type == InstructionTextTokenType.InstructionToken:
                    mnemonic = token.text.lower()
                    break

            if mnemonic:
                if mnemonic == "call":
                    return "CALL"
                elif mnemonic == "jmp":
                    return "DIRECT"
                elif mnemonic.startswith("j") and mnemonic != "jmp":
                    return "CONDITIONAL"
                elif mnemonic in ["ret", "retn"]:
                    return "RETURN"

        return "UNKNOWN"

    def get_map_depth(self):
        """
        Run a BFS on the basic blocks of the function to assign a depth to every block
        """

        depths = {}
        entry = self.function.get_basic_block_at(self.function.start)

        ### Simple BFS
        q = deque()
        q.append(entry)
        depths[entry.start] = 0

        while q:
            b = q.popleft()
            b_depth = depths[b.start]
            for edge in b.outgoing_edges:
                tgt = edge.target

                if tgt is None:
                    continue

                if tgt.start not in depths:
                    depths[tgt.start] = b_depth + 1
                    q.append(tgt)

        return depths

    def get_block_id_map(self):
        """
        Assign a unique, sequential ID to each basic block of the function using a BFS starting from the entry block.
        """

        id_map = {}
        entry = self.function.get_basic_block_at(self.function.start)

        q = deque()
        q.append(entry)

        current_id = 0
        id_map[entry.start] = current_id

        while q:
            b = q.popleft()
            for edge in b.outgoing_edges:
                tgt = edge.target

                if tgt is None:
                    continue

                if tgt.start not in id_map:
                    current_id += 1
                    id_map[tgt.start] = current_id
                    q.append(tgt)

        return id_map

    def extract_block_flags(self, block):
        """
        Get the flags for every basic block. Currently, we implemented these heuristics:
            - if a basic block is the entry node for a function
            - if a basic block is the exit block for a function
            - if a basic block is part of a natural loop
        """
        flags = []

        if block.start == self.function.start:
            flags.append(BlockFlags.EntryBlock.value)

        if any(edge.type == BranchType.FunctionReturn for edge in block.outgoing_edges):
            flags.append(BlockFlags.ExitBlock.value)

        # if this block is in its dominance frontier, then it's part of a natural loop
        if block in block.dominance_frontier:
            flags.append(BlockFlags.LoopBlock.value)

        return flags


class BlockFlags(Enum):
    # generally, the basic block identifying the entry point of the function
    EntryBlock = "EntryBlock"
    # any basic blocks that makes the control flow exiting from the current function
    ExitBlock = "ExitBlock"
    # any block is in a natural loop if it is in its own dominance frontier
    LoopBlock = "LoopBlock"


class BlockType(Enum):
    THUNK = "THUNK"
    DATA = "DATA"
    PADDING = "PADDING"
    CODE = "CODE"