Wei Huang

35 papers Journal 34Unranked 1
YearRankTypeTitle / Venue / Authors
2025 J jnl
IEEE Trans Autom. Sci. Eng.
Xiangping Xu, Xinli Shi, Jinde Cao, Wei Huang
2025 J jnl
Neural Networks
Zhuoxuan Li, Jinde Cao, Hairuo Shi, Xinli Shi, Tao Ma, Wei Huang
2024 J jnl
IEEE Trans. Intell. Transp. Syst.
Jian Gong, Yuan Zhao, Jinde Cao, Jianhua Guo, Mahmoud A. Abdel-Aty, Wei Huang
2024 J jnl
Expert Syst. Appl.
Hanjie Liu, Jinde Cao, Wei Huang, Xinli Shi, Xingye Zhou, Zhuoxuan Li
2024 J jnl
Eng. Appl. Artif. Intell.
Jian Gong, Yuan Zhao, Jinde Cao, Wei Huang, Weijie Chen, Mahmoud A. Abdel-Aty
2024 J jnl
Inf. Sci.
Jinren Zhang, Jinde Cao, Xinli Shi, Wei Huang, Tao Ma, Xingye Zhou
2023 J jnl
IEEE CAA J. Autom. Sinica
Zhuoxuan Li, Iakov Korovin, Xinli Shi, Sergey Gorbachev, Nadezhda Gorbacheva, Wei Huang, Jinde Cao
2023 J jnl
CoRR
Zhuoxuan Li, Iakov Korovin, Xinli Shi, Sergey Gorbachev, Nadezhda Gorbacheva, Wei Huang, Jinde Cao
2023 J jnl
Symmetry
Zhuoxuan Li, Meng Tao, Jinde Cao, Xinli Shi, Tao Ma, Wei Huang
2023 J jnl
IEEE Trans. Intell. Transp. Syst.
Chengjia Han, Tao Ma, Linhao Gu, Jinde Cao, Xinli Shi, Wei Huang, Zheng Tong
2023 J jnl
IEEE Trans. Neural Networks Learn. Syst.
Xiulan Wei, Yong Zhang, Yun Wei, Yongli Hu, Shuzhen Tong, Wei Huang, Jinde Cao
2023 J jnl
Soft Comput.
Zhuoxuan Li, Jinde Cao, Xinli Shi, Wei Huang
2023 J jnl
Neural Networks
Jinren Zhang, Jinde Cao, Wei Huang, Xinli Shi, Xingye Zhou
2023 J jnl
Sci. China Inf. Sci.
Yu Wang, Jiaojiao Yan, Wei Huang, Leszek Rutkowski, Jinde Cao
2022 J jnl
Sci. China Inf. Sci.
Hanjie Liu, Jinde Cao, Wei Huang, Xinli Shi, Xudong Wang
2022 J jnl
J. Artif. Intell. Soft Comput. Res.
Ping Liu, Jinde Cao, Yiping Luo, Jianhua Guo, Wei Huang
2022 J jnl
IEEE Trans. Syst. Man Cybern. Syst.
Di Liu, Simone Baldi, Wenwu Yu, Jinde Cao, Wei Huang
2020 J jnl
IEEE Trans. Syst. Man Cybern. Syst.
Di Liu, Wenwu Yu, Simone Baldi, Jinde Cao, Wei Huang
2020 J jnl
Math. Comput. Simul.
Ping Liu, Zao Fu, Jinde Cao, Yun Wei, Jianhua Guo, Wei Huang
2020 J jnl
Math. Comput. Simul.
Wei Wang, Hanyu Zhang, Tong Li, Jianhua Guo, Wei Huang, Yun Wei, Jinde Cao
2020 J jnl
Math. Comput. Simul.
Yaqi Wang, Jianquan Lu, Jinde Cao, Wei Huang, Jianhua Guo, Yun Wei
2020 J jnl
IEEE Trans. Syst. Man Cybern. Syst.
Ying Wan, Jinde Cao, Wei Huang, Jianhua Guo, Yun Wei
2020 J jnl
Math. Comput. Simul.
Jian Gong, Jinde Cao, Yuan Zhao, Yun Wei, Jianhua Guo, Wei Huang
2020 conf
ICAISC (2)
Xuan Zhao, Ruixuan Bi, Ran Yang, Yue Chu, Jianhua Guo, Wei Huang, Jinde Cao
2019 J jnl
Math. Comput. Simul.
Jianhua Guo, Ye Kong, Zongzhi Li, Wei Huang, Jinde Cao, Yun Wei
2019 J jnl
Math. Comput. Simul.
Ke Lu, Pingping Du, Jinde Cao, Qiming Zou, Tianjia He, Wei Huang
2019 J jnl
Math. Comput. Simul.
Jianhua Guo, Yu Liu, Xiugang Li, Wei Huang, Jinde Cao, Yun Wei
2019 J jnl
Math. Comput. Simul.
Yun Wei, Qing Tian, Jianhua Guo, Wei Huang, Jinde Cao
2019 J jnl
Neural Process. Lett.
Chuan Luo, Chi Huang, Jinde Cao, Jianquan Lu, Wei Huang, Jianhua Guo, Yun Wei
2019 J jnl
J. Artif. Intell. Soft Comput. Res.
Yun Wei, Ying Yu, Lifeng Xu, Wei Huang, Jianhua Guo, Ying Wan, Jinde Cao
2018 J jnl
IEEE Trans. Cybern.
Xinli Shi, Jinde Cao, Wei Huang
2018 J jnl
Neurocomputing
Gan Chai, Jinde Cao, Wei Huang, Jianhua Guo
2018 J jnl
IEEE Trans. Intell. Transp. Syst.
Wei Huang, Wenwen Jia, Jianhua Guo, Billy M. Williams, Guogang Shi, Yun Wei, Jinde Cao
2017 J jnl
IEEE Trans. Circuits Syst. I Regul. Pap.
Ying Wan, Jinde Cao, Guanrong Chen, Wei Huang
2017 J jnl
Sci. China Inf. Sci.
Wei Huang, Yun Wei, Jianhua Guo, Jinde Cao
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