Xiaohan Zhao

71 papers A* 6A 4B 2C 3Misc 4Journal 34Unranked 17
YearRankTypeTitle / Venue / Authors
2026 J jnl
ACM Trans. Softw. Eng. Methodol.
Yanchun Sun, Jiawei Wu, Xiaohan Zhao, Haizhou Xu, Ye Zhu, Zhenpeng Chen, Sihan Wang, Huizhen Jiang, Gang Huang
2026 J jnl
CoRR
Xiaohan Zhao, Xinyi Shang, Jiacheng Liu, Zhiqiang Shen
2026 J jnl
CoRR
Xinyi Shang, Yi Tang, Jiacheng Cui, Ahmed Elhagry, Salwa K. Al Khatib, Sondos Mahmoud Bsharat, Jiacheng Liu, Xiaohan Zhao, Jing-Hao Xue, Hao Li, Salman Khan, Zhiqiang Shen
2026 J jnl
CoRR
Jiacheng Liu, Yaxin Luo, Jiacheng Cui, Xinyi Shang, Xiaohan Zhao, Zhiqiang Shen
2026 J jnl
CoRR
Xiaohan Zhao, Zhaoyi Li, Yaxin Luo, Jiacheng Cui, Zhiqiang Shen
2026 J jnl
Neural Networks
Xiao Du, Wanli Shi, Xiaohan Zhao, Yang Cao, Bin Gu, Tieru Wu
2025 J jnl
CoRR
Zhaoyi Li, Xiaohan Zhao, Dong-Dong Wu, Jiacheng Cui, Zhiqiang Shen
2025 conf
ICSOC (1)
Jiaqi Zhang, Yanchun Sun, Sihan Wang, Xiaohan Zhao
2025 Misc conf
ICASSP
Xiaohan Zhao, Yongzhe Li, Ran Tao
2025 J jnl
CoRR
Jiacheng Cui, Xinyue Bi, Yaxin Luo, Xiaohan Zhao, Jiacheng Liu, Zhiqiang Shen
2025 J jnl
IEEE Trans. Haptics
Xiaohan Zhao, Mengwei Pang, Ping Ji, Aimin Hao, Dangxiao Wang
2025 J jnl
CoRR
Jiacheng Cui, Bingkui Tong, Xinyue Bi, Xiaohan Zhao, Jiacheng Liu, Zhiqiang Shen
2025 conf
EUSIPCO
Xiaohan Zhao, Yongzhe Li, Ran Tao
2025 conf
SSE
Sihan Wang, Yanchun Sun, Xiaohan Zhao, Huizhen Jiang, Huaqian Cai, Changfa Lu, Gang Huang
2025 J jnl
CoRR
Xiaohan Zhao, Hongyu Xiang, Shengze Ye, Song Li, Zhengkun Tian, Guanyu Chen, Ke Ding, Guanglu Wan
2025 J jnl
CoRR
Yaxin Luo, Zhaoyi Li, Jiacheng Liu, Jiacheng Cui, Xiaohan Zhao, Zhiqiang Shen
2025 J jnl
Adv. Eng. Softw.
Hao Du, Jiaxing Gao, Lexin Zhang, Shaoxin Gong, Xiaohan Zhao
2024 A* conf
ASE
Yanchun Sun, Jiawei Wu, Xiaohan Zhao, Haizhou Xu, Sihan Wang, Jiaqi Zhang, Ye Zhu, Gang Huang
2024 conf
EUSIPCO
Xiaohan Zhao, Yongzhe Li, Ran Tao
2024 conf
Agro-Geoinformatics
Zipeng Song, Liang Liang, Xiaohan Zhao, Yan Zhang, Meng Li, Yizhi Wang
2024 conf
ECCV (72)
Yanmeng Yao, Xiaohan Zhao, Bin Gu
2024 conf
EUSIPCO
Xiaohan Zhao, Yongzhe Li, Ran Tao
2024 conf
CIPAE
Huan Liu, Xiaohan Zhao
2023 B conf
IJCB
Yucong Suo, Xiaohan Zhao, Yuanfang Guo, Yangxi Li, Yunhong Wang
2023 A* conf
NeurIPS
Xiaohan Zhao, Hualin Zhang, Zhouyuan Huo, Bin Gu
2023 J jnl
J. Intell. Fuzzy Syst.
Xue Fu, Liangkuan Zhu, Bowen Wu, Jingyu Wang, Xiaohan Zhao, Arystan Ryspayev
2023 J jnl
J. Intell. Fuzzy Syst.
Xiaohan Zhao, Liangkuan Zhu, Bowen Wu
2023 A* conf
NeurIPS
Bhaskar Mukhoty, Velibor Bojkovic, William de Vazelhes, Xiaohan Zhao, Giulia De Masi, Huan Xiong, Bin Gu
2023 Misc conf
ICASSP
Xiaohan Zhao, Yongzhe Li, Ran Tao
2023 J jnl
Digit. Appl. Archaeol. Cult. Heritage
Xiaohan Zhao, Chang Shu, Shuping Jiang, Yutong Hu
2023 J jnl
CoRR
Yida Chen, Yixian Gan, Sijia Li, Li Yao, Xiaohan Zhao
2023 conf
EUSIPCO
Xiaohan Zhao, Yongzhe Li, Ran Tao
2023 J jnl
Nucleic Acids Res.
Yimin Wang, Yunchao Ling, Jiao Gong, Xiaohan Zhao, Hanwen Zhou, Bo Xie, Haiyi Lou, Xinhao Zhuang, Li Jin, Shaohua Fan, Guoqing Zhang, Shuhua Xu
2023 C conf
iSPEC
Gang Li, Ke Wang, Xiaohan Zhao, Ming Yang
2022 conf
SSCI
Xiaohan Zhao, Wen Song, Qiqiang Li, Huadong Shi, Zhichao Kang, Chunmei Zhang
2022 conf
EUSIPCO
Xiaohan Zhao, Yongzhe Li, Ran Tao
2022 J jnl
IEEE ACM Trans. Comput. Biol. Bioinform.
Shuai Liu, Xinran Xu, Zhihao Yang, Xiaohan Zhao, Shichao Liu, Wen Zhang
2022 C conf
ISCAS
Ruijie Yang, Yuanfang Guo, Ruikui Wang, Xiaohan Zhao, Yunhong Wang
2022 J jnl
CoRR
Yi Liu, Song Guo, Jie Zhang, Qihua Zhou, Yingchun Wang, Xiaohan Zhao
2022 A* conf
NeurIPS
Xingyu Qu, Diyang Li, Xiaohan Zhao, Bin Gu
2022 J jnl
CoRR
Xingyu Qu, Diyang Li, Xiaohan Zhao, Bin Gu
2022 conf
AsiaHaptics
Xiaohan Zhao, Quanmin Guo, Dangxiao Wang
2022 conf
PRCV (3)
Xiaohan Zhao, Yunhong Wang, Ruijie Yang, Yuanfang Guo
2021 J jnl
IEEE Access
Bo Zhang, Xiaohan Zhao, Zhenhai Dou, Lianxin Liu
2021 J jnl
Virtual Real. Intell. Hardw.
Fan Ye, Luwei Liu, Bin Yan, Xiaohan Zhao, Aimin Hao
2021 J jnl
Briefings Bioinform.
Zhouxin Yu, Feng Huang, Xiaohan Zhao, Wenjie Xiao, Wen Zhang
2020 J jnl
Frontiers Robotics AI
Xiaohan Zhao, Zhuoli Zhu, Yu Cong, Yongtao Zhao, Yuru Zhang, Dangxiao Wang
2019 conf
BIBM
Yanzhen Xu, Xiaohan Zhao, Shuai Liu, Shichao Liu, Yanqing Niu, Wen Zhang, Leyi Wei
2018 A* conf
AAAI
Xiaohan Zhao, Bo Zong, Ziyu Guan, Kai Zhang, Wei Zhao
2017 J jnl
IEEE Trans. Haptics
Dangxiao Wang, Xiaohan Zhao, Youjiao Shi, Yuru Zhang, Jing Xiao
2016 A conf
Internet Measurement Conference
Qingyun Liu, Shiliang Tang, Xinyi Zhang, Xiaohan Zhao, Ben Y. Zhao, Haitao Zheng
2016 J jnl
ACM Trans. Model. Perform. Evaluation Comput. Syst.
Qingyun Liu, Xiaohan Zhao, Walter Willinger, Xiao Wang, Ben Y. Zhao, Haitao Zheng
2016 J jnl
IEEE Trans. Haptics
Dangxiao Wang, Xiaohan Zhao, Youjiao Shi, Yuru Zhang, Jianxia Hou, Jing Xiao
2016 Misc conf
NSDI
Sergey Legtchenko, Nicholas Chen, Daniel Cletheroe, Antony I. T. Rowstron, Hugh Williams, Xiaohan Zhao
2015 J jnl
CoRR
Xiaohan Zhao, Qingyun Liu, Lin Zhou, Haitao Zheng, Ben Y. Zhao
2015 J jnl
Int. J. Manuf. Res.
Deyun Wang, Xiaohan Zhao, Kejun Zhu
2015 conf
COSN
Xiaohan Zhao, Qingyun Liu, Haitao Zheng, Ben Y. Zhao
2014
Xiaohan Zhao
2014 A conf
ICWSM
Matteo Zignani, Sabrina Gaito, Gian Paolo Rossi, Xiaohan Zhao, Haitao Zheng, Ben Y. Zhao
2013 J jnl
Proc. VLDB Endow.
Xiaohan Zhao, Adelbert Chang, Atish Das Sarma, Haitao Zheng, Ben Y. Zhao
2013 Misc conf
HotNets
Zengbin Zhang, Lin Zhou, Xiaohan Zhao, Gang Wang, Yu Su, Miriam J. Metzger, Haitao Zheng, Ben Y. Zhao
2012 J jnl
CoRR
Xiaohan Zhao, Alessandra Sala, Christo Wilson, Xiao Wang, Sabrina Gaito, Haitao Zheng, Ben Y. Zhao
2012 A conf
Internet Measurement Conference
Xiaohan Zhao, Alessandra Sala, Christo Wilson, Xiao Wang, Sabrina Gaito, Haitao Zheng, Ben Y. Zhao
2012 A* conf
WWW
Gang Wang, Christo Wilson, Xiaohan Zhao, Yibo Zhu, Manish Mohanlal, Haitao Zheng, Ben Y. Zhao
2011 C conf
CollaborateCom
Xiaohan Zhao, Alessandra Sala, Haitao Zheng, Ben Y. Zhao
2011 J jnl
CoRR
Xiaohan Zhao, Alessandra Sala, Haitao Zheng, Ben Y. Zhao
2011 J jnl
CoRR
Gang Wang, Christo Wilson, Xiaohan Zhao, Yibo Zhu, Manish Mohanlal, Haitao Zheng, Ben Y. Zhao
2011 A conf
Internet Measurement Conference
Alessandra Sala, Xiaohan Zhao, Christo Wilson, Haitao Zheng, Ben Y. Zhao
2010 conf
WOSN
Xiaohan Zhao, Haitao Zheng
2009 B conf
Networking
Yang Chen, Xiao Wang, Xiaoxiao Song, Eng Keong Lua, Cong Shi, Xiaohan Zhao, Beixing Deng, Xing Li
2009 conf
CCNC
Xiaoxiao Song, Xiaohan Zhao, Eng Keong Lua, Zengbin Zhang, Beixing Deng, Xing Li
redb/extractors/decompiler/apk/smali_normalization.py
← Index redb/extractors/decompiler/apk/smali_normalization.py python
"""Semantic normalization of Dalvik/smali instructions.

Analogous to Binary Ninja's LLIL normalization: strips register allocation
noise and instruction encoding variants while preserving semantic operations.

Three normalization levels (most aggressive to most detailed):
  - 'category':    semantic category only (MOV, ALU, CALL, ...)
  - 'opcode':      base opcode, width-invariant (add, sub, invoke, ...)
  - 'opcode_api':  opcode category + API method/field references for
                   invoke/field/alloc instructions (default for MinHash)

References:
  - Smali+ 12-category reduction (Canfora et al.)
  - MOSDroid opcode family grouping
  - DroidSIFT/DroidSim API-sensitive similarity
"""

import re
from typing import List

# ---------------------------------------------------------------------------
# Dalvik opcode -> semantic category mapping
# ---------------------------------------------------------------------------
# Prefix-matched against instruction opcodes. Order matters for overlapping
# prefixes (longer/more-specific prefixes should come first in iteration,
# but since we use startswith and break on first match, we order by
# specificity within the list).

OPCODE_CATEGORIES = {
    # Arithmetic/logic
    "add": "ALU", "sub": "ALU", "mul": "ALU", "div": "ALU",
    "rem": "ALU", "and": "ALU", "or": "ALU", "xor": "ALU",
    "shl": "ALU", "shr": "ALU", "ushr": "ALU", "neg": "ALU",
    "not": "ALU",
    # Data movement
    "move": "MOV", "const": "CONST",
    # Memory access (field/array)
    "iget": "LOAD", "sget": "LOAD", "aget": "LOAD",
    "iput": "STORE", "sput": "STORE", "aput": "STORE",
    # Invocations
    "invoke": "CALL",
    # Control flow
    "if": "BRANCH", "goto": "JMP",
    "switch": "SWITCH",
    "return": "RET",
    # Object/type
    "new": "ALLOC", "check": "TYPE", "instance": "TYPE",
    # Array
    "fill": "ARR", "array": "ARR",
    # Comparison
    "cmpl": "CMP", "cmpg": "CMP", "cmp": "CMP",
    # Exception / synchronization
    "throw": "EXC", "monitor": "SYNC",
    # Conversion (int-to-long, float-to-int, etc.)
    "int-to": "CONV", "long-to": "CONV", "float-to": "CONV",
    "double-to": "CONV",
}

# Pre-compiled regexes for operand extraction
_METHOD_REF_RE = re.compile(r"(L[\w/$]+;->[\w<>]+\(.*?\)[\w/$;\[]*)")
_FIELD_REF_RE = re.compile(r"(L[\w/$]+;->[\w]+:[\w/$;\[]+)")
_CLASS_REF_RE = re.compile(r"(L[\w/$]+;)")
_CONST_STRING_RE = re.compile(r'^const-string(?:/jumbo)?\s')


def categorize_opcode(opcode: str) -> str:
    """Map a Dalvik opcode to its semantic category.

    Prefix-matched: 'add-int/2addr' matches 'add' -> 'ALU'.
    Returns 'OTHER' for unrecognized opcodes.
    """
    for prefix, cat in OPCODE_CATEGORIES.items():
        if opcode.startswith(prefix):
            return cat
    return "OTHER"


# Mapping from semantic categories to the ACFG feature vector indices
# used by Binary Ninja's build_block_features (cfg_features.py).
# This enables cross-platform ACFG feature comparison.
CATEGORY_TO_ACFG_INDEX = {
    "ALU": 0,       # CAT_ARITHMETIC
    "CONV": 0,      # arithmetic-adjacent
    "CMP": 4,       # CAT_COMPARISON
    "MOV": 2,       # CAT_TRANSFER
    "CONST": 2,     # transfer-adjacent (loading constants)
    "LOAD": 5,      # CAT_MEMORY
    "STORE": 5,     # CAT_MEMORY
    "CALL": 3,      # CAT_CALL
    "BRANCH": 1,    # CAT_LOGIC (conditional logic)
    "JMP": 1,       # CAT_LOGIC
    "SWITCH": 1,    # CAT_LOGIC
    "RET": 2,       # CAT_TRANSFER
    "ALLOC": 5,     # CAT_MEMORY (heap allocation)
    "TYPE": 6,      # CAT_OTHER
    "ARR": 5,       # CAT_MEMORY
    "EXC": 6,       # CAT_OTHER
    "SYNC": 6,      # CAT_OTHER
    "OTHER": 6,     # CAT_OTHER
}


def normalize_instruction(line: str, level: str = "opcode_api") -> str:
    """Normalize a single smali instruction line.

    Args:
        line: A single smali instruction (whitespace-stripped).
        level: Normalization level:
            'category'   - most aggressive: just semantic category
            'opcode'     - base opcode only, width/addressing-mode invariant
            'opcode_api' - category + API references for invoke/field/alloc
                          (default, best for MinHash similarity)

    Returns:
        Normalized instruction string, or empty string for non-instructions.
    """
    stripped = line.strip()
    if not stripped:
        return ""

    parts = stripped.split(None, 1)
    opcode = parts[0]
    operands = parts[1] if len(parts) > 1 else ""

    if level == "category":
        return categorize_opcode(opcode)

    if level == "opcode":
        # Strip type/width suffixes for invariance:
        # add-int, add-long, add-float -> 'add'
        # add-int/2addr -> 'add'
        base = re.split(r"[-/]", opcode)[0]
        return base

    if level == "opcode_api":
        # const-string: preserve string content (encrypted strings are a
        # key malware indicator)
        if _CONST_STRING_RE.match(stripped):
            # Extract the string literal
            str_match = re.search(r'"(.*)"', operands)
            if str_match:
                return f"CONST_STR \"{str_match.group(1)}\""
            return "CONST_STR"

        # invoke-*: preserve method reference
        if opcode.startswith("invoke"):
            ref = _METHOD_REF_RE.search(operands)
            if ref:
                return f"CALL {ref.group(1)}"
            return "CALL"

        # Field access: preserve field reference
        if opcode.startswith(("iget", "iput", "sget", "sput")):
            ref = _FIELD_REF_RE.search(operands)
            if ref:
                cat = "LOAD" if "get" in opcode else "STORE"
                return f"{cat} {ref.group(1)}"
            # Fallback: try space-separated format from androguard
            # e.g. "iget v0, p0, Lcom/Foo;->field Ljava/lang/String;"
            space_ref = re.search(
                r"(L[\w/$]+;->[\w]+)\s+([\w/$;\[]+)", operands
            )
            if space_ref:
                cat = "LOAD" if "get" in opcode else "STORE"
                return f"{cat} {space_ref.group(1)}:{space_ref.group(2)}"
            cat = "LOAD" if "get" in opcode else "STORE"
            return cat

        # new-instance: preserve allocated type
        if opcode.startswith("new-instance") or opcode == "new-array":
            ref = _CLASS_REF_RE.search(operands)
            if ref:
                return f"ALLOC {ref.group(1)}"
            return "ALLOC"

        # Everything else: just the category
        return categorize_opcode(opcode)

    # Unknown level: return raw opcode
    return opcode


def normalize_method_body(
    body: str, level: str = "opcode_api"
) -> List[str]:
    """Normalize all instructions in a smali method body.

    Filters out directives (.), labels (:), comments (#), and blank lines.
    Returns a list of normalized instruction strings.

    Args:
        body: Raw smali method body text.
        level: Normalization level (see normalize_instruction).

    Returns:
        List of normalized instruction strings (no empty strings).
    """
    normalized = []
    for line in body.split("\n"):
        stripped = line.strip()
        # Skip non-instructions
        if not stripped:
            continue
        if stripped.startswith((".",":", "#")):
            continue
        result = normalize_instruction(stripped, level)
        if result:
            normalized.append(result)
    return normalized