Hailing Zhou

43 papers B 15Journal 22Unranked 5
YearRankTypeTitle / Venue / Authors
2025 J jnl
IEEE Open J. Comput. Soc.
Fusen Guo, Ke Xu, Zhibo Zhang, Hailing Zhou, Guo Chen, Jiankun Hu, Jun Zhang, Huadong Mo
2025 J jnl
Comput.
Mehshan Ahmed Khan, Houshyar Asadi, Mohammad Reza Chalak Qazani, Adetokunbo Arogbonlo, Siamak Pedrammehr, Adnan Anwar, Hailing Zhou, Lei Wei, Asim Bhatti, Sam Oladazimi, Burhan Khan, Saeid Nahavandi
2025 J jnl
IEEE J. Sel. Top. Appl. Earth Obs. Remote. Sens.
Zheyang Huang, Jagannath Aryal, Saeid Nahavandi, Xuequan Lu, Chee Peng Lim, Lei Wei, Hailing Zhou
2025 J jnl
CoRR
Zheyang Huang, Jagannath Aryal, Saeid Nahavandi, Xuequan Lu, Chee Peng Lim, Lei Wei, Hailing Zhou
2024 J jnl
CoRR
Rui Jin, Derun Li, Dehui Xiang, Lei Zhang, Hailing Zhou, Fei Shi, Weifang Zhu, Jing Cai, Tao Peng, Xinjian Chen
2024 J jnl
Comput. Vis. Media
Weijia Wang, Xiao Liu, Hailing Zhou, Lei Wei, Zhigang Deng, M. Manzur Murshed, Xuequan Lu
2022 B conf
SMC
Hailing Zhou, Erika Varis Doggett, Keyu Qi, Binghao Tang, Anna M. C. Wolak, Saeid Nahavandi, David T. Nguyen
2022 B conf
IJCNN
Yingying Zhong, Erika Varis Doggett, Weichu Cui, Keyu Qi, Hailing Zhou, Binghao Tang, Anna M. C. Wolak, David T. Nguyen
2020 J jnl
IEEE Access
Tao Peng, Thomas Canhao Xu, Yihuai Wang, Hailing Zhou, Sema Candemir, Wan Mimi Diyana Wan Zaki, Shanq-Jang Ruan, Jing Wang, Xinjian Chen
2020 J jnl
Artif. Intell. Medicine
Mohammed Hassan Attia, Mohammed Hossny, Hailing Zhou, Saeid Nahavandi, Hamed Asadi, Anousha Yazdabadi
2019 J jnl
Int. J. Distributed Sens. Networks
Yonghang Tai, Lei Wei, Hailing Zhou, Jun Peng, Qiong Li, Feiyan Li, Jun Zhang, Junsheng Shi
2019 J jnl
Comput. Methods Programs Biomed.
Mohammed Hassan Attia, Mohammed Hossny, Hailing Zhou, Saeid Nahavandi, Hamed Asadi, Anousha Yazdabadi
2019 J jnl
Virtual Real.
Lei Wei, Hailing Zhou, Saeid Nahavandi
2019 J jnl
Concurr. Comput. Pract. Exp.
Yonghang Tai, Lei Wei, Hailing Zhou, Qiong Li, Xiaoqiao Huang, Junsheng Shi, Saeid Nahavandi
2018 J jnl
IEEE Access
Yonghang Tai, Lei Wei, Minhui Xiao, Hailing Zhou, Qiong Li, Junsheng Shi, Saeid Nahavandi
2018 B conf
SMC
Yonghang Tai, Lei Wei, Hailing Zhou, Jun Peng, Junsheng Shi, Qiong Li, Saeid Nahavandi
2018 J jnl
IEEE Trans. Haptics
Lei Wei, Hailing Zhou, Saeid Nahavandi
2018 J jnl
IEEE Trans. Geosci. Remote. Sens.
Hailing Zhou, Lei Wei, Chee Peng Lim, Douglas C. Creighton, Saeid Nahavandi
2018 B conf
SMC
Hailing Zhou, Lei Wei, Ran Cao, Samer Hanoun, Asim Bhatti, Yonghang Tai, Saeid Nahavandi
2017 B conf
SMC
Yonghang Tai, Lei Wei, Hailing Zhou, Saeid Nahavandi, Junsheng Shi, Qiong Li, Feiyan Li
2017 B conf
SMC
Hailing Zhou, Lei Wei, Michael Fielding, Douglas C. Creighton, Sameer Deshpande, Saeid Nahavandi
2017 J jnl
IEEE Trans. Intell. Transp. Syst.
Hailing Zhou, Hui Kong, Lei Wei, Douglas C. Creighton, Saeid Nahavandi
2016 B conf
SMC
Yonghang Tai, Lei Wei, Hailing Zhou, Saeid Nahavandi, Junsheng Shi
2015 B conf
SMC
Hailing Zhou, Dmitry B. Goldgof, Samuel H. Hawkins, Lei Wei, Ying Liu, Douglas C. Creighton, Robert J. Gillies, Lawrence O. Hall, Saeid Nahavandi
2015 J jnl
IEEE Trans. Intell. Transp. Syst.
Hailing Zhou, Hui Kong, Lei Wei, Douglas C. Creighton, Saeid Nahavandi
2015 B conf
SMC
Lei Wei, Loi Huynh, Hailing Zhou, Saeid Nahavandi
2015 B conf
SMC
Hailing Zhou, Lyndon E. Llewellyn, Lei Wei, Douglas C. Creighton, Saeid Nahavandi
2014 B conf
SMC
Lei Wei, Zoran Najdovski, Hailing Zhou, Sameer Deshpande, Saeid Nahavandi
2014 B conf
Intelligent Vehicles Symposium
Hailing Zhou, Hui Kong, José M. Álvarez, Douglas C. Creighton, Saeid Nahavandi
2014 J jnl
Mach. Vis. Appl.
Hailing Zhou, Lei Wei, Douglas C. Creighton, Saeid Nahavandi
2014 J jnl
IEEE Trans. Hum. Mach. Syst.
Hailing Zhou, Ajmal S. Mian, Lei Wei, Douglas C. Creighton, Mohammed Hossny, Saeid Nahavandi
2014 J jnl
IEEE Trans. Image Process.
Hailing Zhou, Jianmin Zheng, Lei Wei
2014 B conf
SMC
Lei Wei, Hailing Zhou, Saeid Nahavandi
2013 B conf
SMC
Sherif Haggag, Shady M. K. Mohamed, Asim Bhatti, Nong Gu, Hailing Zhou, Saeid Nahavandi
2013 conf
AIM
Lei Wei, Hailing Zhou, Aung K. Soe, Saeid Nahavandi
2013 conf
ICONIP (1)
Hailing Zhou, Shady M. K. Mohamed, Asim Bhatti, Chee Peng Lim, Nong Gu, Sherif Haggag, Saeid Nahavandi
2013 J jnl
Pattern Recognit.
Hailing Zhou, Jianmin Zheng, Lei Wei
2013 conf
UKSim
Hailing Zhou, Douglas C. Creighton, Chee Peng Lim, Lei Wei, David Yang Gao
2013 conf
AIM
Hailing Zhou, Douglas C. Creighton, Lei Wei, David Yang Gao, Saeid Nahavandi
2012 J jnl
Comput. Graph.
Hailing Zhou, Jianmin Zheng, Xunnian Yang
2012 conf
ICME Workshops
Hailing Zhou, Jianmin Zheng, Lei Wei
2012
Hailing Zhou
2010 B conf
ICIP
Hailing Zhou, Jianmin Zheng
redb/extractors/decompiler/bninja/analysis/cfg.py
← Index redb/extractors/decompiler/bninja/analysis/cfg.py python
from binaryninja.enums import LowLevelILOperation as LLIL_OP

# Support both package and standalone imports
try:
    from . import cfg_features
except ImportError:
    from redb.extractors.decompiler.bninja.analysis import cfg_features


# ---------------------------------------------------------------------------
# Task 2.2: Build LLIL operation maps at import time using real enum values
# ---------------------------------------------------------------------------

# Prime product map: LLIL operation integer value -> small prime
cfg_features.LLIL_OP_PRIMES = {
    # SET_REG, SET_REG_SPLIT
    LLIL_OP.LLIL_SET_REG.value: 2,
    LLIL_OP.LLIL_SET_REG_SPLIT.value: 2,
    # SET_FLAG
    LLIL_OP.LLIL_SET_FLAG.value: 3,
    # LOAD
    LLIL_OP.LLIL_LOAD.value: 5,
    # STORE
    LLIL_OP.LLIL_STORE.value: 7,
    # PUSH, POP
    LLIL_OP.LLIL_PUSH.value: 11,
    LLIL_OP.LLIL_POP.value: 13,
    # CALL, TAILCALL, SYSCALL
    LLIL_OP.LLIL_CALL.value: 17,
    LLIL_OP.LLIL_TAILCALL.value: 17,
    LLIL_OP.LLIL_SYSCALL.value: 19,
    # RET, NORET
    LLIL_OP.LLIL_RET.value: 23,
    LLIL_OP.LLIL_NORET.value: 23,
    # IF, GOTO
    LLIL_OP.LLIL_IF.value: 29,
    LLIL_OP.LLIL_GOTO.value: 31,
    # ADD, SUB
    LLIL_OP.LLIL_ADD.value: 37,
    LLIL_OP.LLIL_SUB.value: 41,
    # AND, OR, XOR
    LLIL_OP.LLIL_AND.value: 43,
    LLIL_OP.LLIL_OR.value: 47,
    LLIL_OP.LLIL_XOR.value: 53,
    # LSL, LSR, ASR, ROL, ROR
    LLIL_OP.LLIL_LSL.value: 59,
    LLIL_OP.LLIL_LSR.value: 61,
    LLIL_OP.LLIL_ASR.value: 67,
    LLIL_OP.LLIL_ROL.value: 71,
    LLIL_OP.LLIL_ROR.value: 73,
    # MUL, DIVU, DIVS, MODU, MODS
    LLIL_OP.LLIL_MUL.value: 79,
    LLIL_OP.LLIL_DIVU.value: 83,
    LLIL_OP.LLIL_DIVS.value: 83,
    LLIL_OP.LLIL_MODU.value: 89,
    LLIL_OP.LLIL_MODS.value: 89,
    # NEG, NOT
    LLIL_OP.LLIL_NEG.value: 97,
    LLIL_OP.LLIL_NOT.value: 101,
    # CMP_E, CMP_NE, CMP_SLT, CMP_ULT, CMP_SLE, CMP_ULE
    # CMP_SGT, CMP_UGT, CMP_SGE, CMP_UGE
    LLIL_OP.LLIL_CMP_E.value: 103,
    LLIL_OP.LLIL_CMP_NE.value: 103,
    LLIL_OP.LLIL_CMP_SLT.value: 107,
    LLIL_OP.LLIL_CMP_ULT.value: 107,
    LLIL_OP.LLIL_CMP_SLE.value: 109,
    LLIL_OP.LLIL_CMP_ULE.value: 109,
    LLIL_OP.LLIL_CMP_SGT.value: 113,
    LLIL_OP.LLIL_CMP_UGT.value: 113,
    LLIL_OP.LLIL_CMP_SGE.value: 127,
    LLIL_OP.LLIL_CMP_UGE.value: 127,
    # NOP
    LLIL_OP.LLIL_NOP.value: 1,
    # SX, ZX, LOW_PART, BOOL_TO_INT
    LLIL_OP.LLIL_SX.value: 131,
    LLIL_OP.LLIL_ZX.value: 137,
    LLIL_OP.LLIL_LOW_PART.value: 139,
    LLIL_OP.LLIL_BOOL_TO_INT.value: 149,
    # JUMP, JUMP_TO
    LLIL_OP.LLIL_JUMP.value: 151,
    LLIL_OP.LLIL_JUMP_TO.value: 151,
}

# Category map: LLIL operation integer value -> category index
_ARITHMETIC = {
    LLIL_OP.LLIL_ADD, LLIL_OP.LLIL_ADC, LLIL_OP.LLIL_SUB, LLIL_OP.LLIL_SBB,
    LLIL_OP.LLIL_MUL, LLIL_OP.LLIL_MULU_DP, LLIL_OP.LLIL_MULS_DP,
    LLIL_OP.LLIL_DIVU, LLIL_OP.LLIL_DIVU_DP, LLIL_OP.LLIL_DIVS,
    LLIL_OP.LLIL_DIVS_DP, LLIL_OP.LLIL_MODU, LLIL_OP.LLIL_MODS,
    LLIL_OP.LLIL_NEG,
}
_LOGIC = {
    LLIL_OP.LLIL_AND, LLIL_OP.LLIL_OR, LLIL_OP.LLIL_XOR, LLIL_OP.LLIL_NOT,
    LLIL_OP.LLIL_LSL, LLIL_OP.LLIL_LSR, LLIL_OP.LLIL_ASR,
    LLIL_OP.LLIL_ROL, LLIL_OP.LLIL_RLC, LLIL_OP.LLIL_ROR, LLIL_OP.LLIL_RRC,
}
_TRANSFER = {
    LLIL_OP.LLIL_SET_REG, LLIL_OP.LLIL_SET_REG_SPLIT, LLIL_OP.LLIL_SET_FLAG,
    LLIL_OP.LLIL_GOTO, LLIL_OP.LLIL_IF, LLIL_OP.LLIL_JUMP, LLIL_OP.LLIL_JUMP_TO,
    LLIL_OP.LLIL_RET, LLIL_OP.LLIL_NORET, LLIL_OP.LLIL_PUSH, LLIL_OP.LLIL_POP,
}
_CALL = {
    LLIL_OP.LLIL_CALL, LLIL_OP.LLIL_TAILCALL, LLIL_OP.LLIL_SYSCALL,
}
_COMPARISON = {
    LLIL_OP.LLIL_CMP_E, LLIL_OP.LLIL_CMP_NE,
    LLIL_OP.LLIL_CMP_SLT, LLIL_OP.LLIL_CMP_ULT,
    LLIL_OP.LLIL_CMP_SLE, LLIL_OP.LLIL_CMP_ULE,
    LLIL_OP.LLIL_CMP_SGE, LLIL_OP.LLIL_CMP_UGE,
    LLIL_OP.LLIL_CMP_SGT, LLIL_OP.LLIL_CMP_UGT,
    LLIL_OP.LLIL_TEST_BIT, LLIL_OP.LLIL_FLAG_COND,
}
_MEMORY = {
    LLIL_OP.LLIL_LOAD, LLIL_OP.LLIL_STORE,
}

cfg_features.LLIL_OP_CATEGORIES = {}
for _op in _ARITHMETIC:
    cfg_features.LLIL_OP_CATEGORIES[_op.value] = cfg_features.CAT_ARITHMETIC
for _op in _LOGIC:
    cfg_features.LLIL_OP_CATEGORIES[_op.value] = cfg_features.CAT_LOGIC
for _op in _TRANSFER:
    cfg_features.LLIL_OP_CATEGORIES[_op.value] = cfg_features.CAT_TRANSFER
for _op in _CALL:
    cfg_features.LLIL_OP_CATEGORIES[_op.value] = cfg_features.CAT_CALL
for _op in _COMPARISON:
    cfg_features.LLIL_OP_CATEGORIES[_op.value] = cfg_features.CAT_COMPARISON
for _op in _MEMORY:
    cfg_features.LLIL_OP_CATEGORIES[_op.value] = cfg_features.CAT_MEMORY

# Set of CALL operation values for counting
_CALL_OPS = {op.value for op in _CALL}


# ---------------------------------------------------------------------------
# Task 2.1 + 2.3: Rewritten CFGAnalysis
# ---------------------------------------------------------------------------

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

    def extract_function_cfg(self):
        """Extract function-level CFG features as a flat dictionary."""

        if self.function is None:
            return None

        blocks = list(self.function.basic_blocks)
        if not blocks:
            return None

        n = len(blocks)

        # 1. Build index-based adjacency from Binary Ninja blocks
        addr_to_idx = {b.start: i for i, b in enumerate(blocks)}
        successors = [[] for _ in range(n)]
        predecessors = [[] for _ in range(n)]
        for i, block in enumerate(blocks):
            for edge in block.outgoing_edges:
                if edge.target is None:
                    continue
                target_idx = addr_to_idx.get(edge.target.start)
                if target_idx is not None:
                    successors[i].append(target_idx)
                    predecessors[target_idx].append(i)

        # 2. BFS order (reusable across multiple features)
        bfs = cfg_features.bfs_order(successors, n)

        # 3. Collect per-block LLIL operations (for prime product + ACFG features)
        block_llil_ops = self._collect_block_llil_ops(blocks, addr_to_idx, n)
        all_llil_ops = [op for block_ops in block_llil_ops for op in block_ops]

        # 4. Structural counts
        edge_count = sum(len(s) for s in successors)
        total_llil = sum(len(ops) for ops in block_llil_ops)
        call_count = sum(
            1 for ops in block_llil_ops for op in ops
            if op in _CALL_OPS
        )

        # 5. Compute all features
        bb_features = cfg_features.build_block_features(block_llil_ops, successors, n)

        return {
            "cfg_topology_hash": cfg_features.compute_topology_hash(successors, bfs, n),
            "block_count": n,
            "edge_count": edge_count,
            "llil_total_operations": total_llil,
            "call_count": call_count,
            "cyclomatic_complexity": edge_count - n + 2,
            "loop_count": cfg_features.count_back_edges(successors, n),
            "max_depth": cfg_features.bfs_max_depth(successors, n),
            "max_fan_out": max((len(s) for s in successors), default=0),
            "md_index_topdown": cfg_features.compute_md_index_topdown(successors, predecessors, bfs),
            "md_index_bottomup": cfg_features.compute_md_index_bottomup(successors, predecessors, n),
            "prime_product_llil": cfg_features.compute_prime_product(all_llil_ops),
            "cfg_feature_tlsh": cfg_features.compute_cfg_feature_tlsh(bb_features, bfs),
            "wl_minhash": cfg_features.compute_wl_minhash(successors, predecessors, bb_features, n),
            "bb_features": bb_features,
            "cfg_adjacency": cfg_features.pack_adjacency(successors),
        }

    def _collect_block_llil_ops(self, blocks, addr_to_idx, n):
        """
        Collect LLIL operation integers per native basic block.
        Walks the full expression tree of each instruction so that
        nested operations (e.g. ADD inside SET_REG) are captured.
        Returns list of n lists, one per block.
        """
        block_ops = [[] for _ in range(n)]

        if self.llil_function is None:
            return block_ops

        try:
            for llil_block in self.llil_function.basic_blocks:
                # Map LLIL block to native block via source_block
                if llil_block.source_block is not None:
                    native_idx = addr_to_idx.get(llil_block.source_block.start)
                    if native_idx is not None:
                        for instr in llil_block:
                            self._walk_llil_ops(instr, block_ops[native_idx])
        except Exception:
            pass  # Return empty ops — LLIL-dependent fields will be 0/null

        return block_ops

    @staticmethod
    def _walk_llil_ops(expr, ops_list):
        """Collect operation values from an LLIL expression tree iteratively."""
        stack = [expr]
        while stack:
            node = stack.pop()
            if hasattr(node, 'operation'):
                ops_list.append(node.operation.value)
            if hasattr(node, 'operands'):
                for operand in node.operands:
                    if hasattr(operand, 'operation'):
                        stack.append(operand)