Xia Shen

28 papers B 1C 1Misc 1Journal 19Unranked 6
YearRankTypeTitle / Venue / Authors
2026 J jnl
IEEE Internet Things J.
Zhiwei Wei, Bing Li, Rongqing Zhang, Xia Shen, Lingyang Song
2025 J jnl
Int. J. Circuit Theory Appl.
Xia Shen, Chao Shen, Feng Zhao, Wen Huang
2025 J jnl
Int. J. Circuit Theory Appl.
Tiesheng Yan, Zhihao Wang, Xia Shen, Wenyang Li
2025 J jnl
IEEE Trans. Smart Grid
Chao Shen, Wei Gu, Xia Shen, Yijun Xu
2025 J jnl
IEEE Trans. Aerosp. Electron. Syst.
Xuyang Zhang, Xinwei Yue, Zhihao Han, Tian Li, Xia Shen, Yafei Wang, Rongke Liu
2025 J jnl
CoRR
Haishan Huang, Pengchen Liang, Naier Lin, Luxi Wang, Bin Pu, Jianguo Chen, Qing Chang, Xia Shen, Guo Ran
2024 J jnl
IEEE Trans. Wirel. Commun.
Xinwei Yue, Jin Xie, Chongjun Ouyang, Yuanwei Liu, Xia Shen, Zhiguo Ding
2024 J jnl
CoRR
Xuyang Zhang, Xinwei Yue, Zhihao Han, Tian Li, Xia Shen, Yafei Wang, Rongke Liu
2022 conf
WOCC
Xia Shen, Hujun Li, Yuan Wang, Zhiqing Wei, Zhiyong Feng, Zhiqin Wang
2022 J jnl
IEEE Wirel. Commun. Lett.
Zhiqin Wang, Kaifeng Han, Xia Shen, Weijie Yuan, Fan Liu
2021 J jnl
Environ. Model. Softw.
Fuxin Zhang, Hong Zhang, Edoardo Bertone, Rodney A. Stewart, Xia Shen, Kathy Cinque
2020 J jnl
ISPRS Int. J. Geo Inf.
Tianfeng Wei, Donghui Shangguan, Xia Shen, Yongjian Ding, Shuhua Yi
2020 C conf
ICCC
Hui Liu, Jiamo Jiang, Xia Shen, Jiahui Li
2018 J jnl
IEEE Access
Jianrong Wu, Enrong Li, Xia Shen, Shiyi Yao, Zhishen Tong, Chenyu Hu, Zhentao Liu, Shengying Liu, Shiyu Tan, Shensheng Han
2017 J jnl
J. Commun. Inf. Networks
Tinghan Yang, Xiang Cheng, Xia Shen, Shanzhi Chen, Liuqing Yang
2016 Misc conf
ICCS
Yan Feng, Xia Shen, Rongqing Zhang, Ping Zhou
2015 J jnl
IEEE Trans. Intell. Transp. Syst.
Rongqing Zhang, Xiang Cheng, Liuqing Yang, Xia Shen, Bingli Jiao
2015 J jnl
IEEE Trans. Intell. Transp. Syst.
Xiang Cheng, Liuqing Yang, Xia Shen
2015 J jnl
R J.
Moudud Alam, Lars Rönnegård, Xia Shen
2014 J jnl
IEEE Trans. Intell. Transp. Syst.
Xia Shen, Xiang Cheng, Liuqing Yang, Rongqing Zhang, Bingli Jiao
2014 conf
WCSP
Jian Yang, Xia Shen, Xiang Cheng, Liuqing Yang
2013 conf
WCSP
Rongqing Zhang, Jinsung Lee, Xia Shen, Xiang Cheng, Liuqing Yang, Bingli Jiao
2013 conf
ICC
Xia Shen, Rongqing Zhang, Xiang Cheng, Zhimin Liu, Bingli Jiao
2013 B conf
GLOBECOM
Xia Shen, Rongqing Zhang, Xiang Cheng, Liuqing Yang, Bingli Jiao
2013 J jnl
IEEE Intell. Transp. Syst. Mag.
Xia Shen, Xiang Cheng, Rongqing Zhang, Bingli Jiao, Yang Yang
2012 conf
ITST
Xia Shen, Rongqing Zhang, Xiang Cheng, Yang Yang, Bingli Jiao
2010 J jnl
R J.
Lars Rönnegård, Xia Shen, Moudud Alam
2006 conf
Edutainment
Dan Hou, Xia Shen, Xiaowei Li, Yue Liu, Yongtian Wang
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