Wei-Yao Wang

63 papers A* 12A 4Journal 34Unranked 13
YearRankTypeTitle / Venue / Authors
2026 A conf
WSDM
Yung-Chien Wang, Kuang-Da Wang, Wei-Yao Wang, Wen-Chih Peng
2026 J jnl
CoRR
Christian Simon, Masato Ishii, Wei-Yao Wang, Koichi Saito, Akio Hayakawa, Dongseok Shim, Zhi Zhong, Shuyang Cui, Shusuke Takahashi, Takashi Shibuya, Yuki Mitsufuji
2026 J jnl
CoRR
Masakazu Yoshimura, Teruaki Hayashi, Yuki Hoshino, Wei-Yao Wang, Takeshi Ohashi
2025 J jnl
Mach. Learn.
Wei-Yao Wang, Wei-Wei Du, Derek Xu, Wei Wang, Wen-Chih Peng
2025 A* conf
AAAI
Hong-Wei Wu, Wei-Yao Wang, Kuang-Da Wang, Wen-Chih Peng
2025 J jnl
ACM Trans. Intell. Syst. Technol.
Ching Chang, Wei-Yao Wang, Wen-Chih Peng, Tien-Fu Chen
2025 J jnl
CoRR
Qiyu Wu, Shuyang Cui, Satoshi Hayakawa, Wei-Yao Wang, Hiromi Wakaki, Yuki Mitsufuji
2025 J jnl
CoRR
Yung-Chien Wang, Kuang-Da Wang, Wei-Yao Wang, Wen-Chih Peng
2025 J jnl
CoRR
Yen-Che Chien, Kuang-Da Wang, Wei-Yao Wang, Wen-Chih Peng
2025 J jnl
CoRR
Wei-Yao Wang, Zhao Wang, Helen Suzuki, Yoshiyuki Kobayashi
2025 conf
PAKDD (6)
Wei-Yao Wang, Wen-Chih Peng, Wei Wang
2025 J jnl
CoRR
Zhao Wang, Sota Moriyama, Wei-Yao Wang, Briti Gangopadhyay, Shingo Takamatsu
2025 J jnl
CoRR
Wei-Yao Wang, Kazuya Tateishi, Qiyu Wu, Shusuke Takahashi, Yuki Mitsufuji
2025 J jnl
CoRR
Kuang-Da Wang, Zhao Wang, Yotaro Shimose, Wei-Yao Wang, Shingo Takamatsu
2024 J jnl
CoRR
Wei-Yao Wang, Wei-Wei Du, Derek Xu, Wei Wang, Wen-Chih Peng
2024 J jnl
CoRR
Hong-Wei Wu, Wei-Yao Wang, Kuang-Da Wang, Wen-Chih Peng
2024 A* conf
IJCAI
Wei-Yao Wang, Wei-Wei Du, Wen-Chih Peng, Tsi-Ui Ik
2024 conf
PKDD (4)
Chih-Chia Li, Wei-Yao Wang, Wei-Wei Du, Wen-Chih Peng
2024 conf
ECML/PKDD (10)
Kuang-Da Wang, Wei-Yao Wang, Ping-Chun Hsieh, Wen-Chih Peng
2024 J jnl
CoRR
Kuang-Da Wang, Wei-Yao Wang, Ping-Chun Hsieh, Wen-Chih Peng
2024 A conf
CIKM
Xiusi Chen, Wei-Yao Wang, Ziniu Hu, David Reynoso, Kun Jin, Mingyan Liu, P. Jeffrey Brantingham, Wei Wang
2024 J jnl
CoRR
Cheng-Ming Lin, Ching Chang, Wei-Yao Wang, Kuang-Da Wang, Wen-Chih Peng
2024 A* conf
AAAI
Cheng-Ming Lin, Ching Chang, Wei-Yao Wang, Kuang-Da Wang, Wen-Chih Peng
2024 A* conf
AAAI
Ying-Ying Chang, Wei-Yao Wang, Wen-Chih Peng
2024 conf
EACL (1)
Wei-Yao Wang, Yu-Chieh Chang, Wen-Chih Peng
2024 J jnl
CoRR
Wei-Yao Wang, Yu-Chieh Chang, Wen-Chih Peng
2024 A* conf
AAAI
Kuang-Da Wang, Wei-Yao Wang, Yu-Tse Chen, Yu-Heng Lin, Wen-Chih Peng
2024 A* conf
AAAI
Kuang-Da Wang, Yu-Tse Chen, Yu-Heng Lin, Wei-Yao Wang, Wen-Chih Peng
2024 A* conf
ICDE
Ching Chang, Chiao-Tung Chan, Wei-Yao Wang, Wen-Chih Peng, Tien-Fu Chen
2023 A* conf
AAAI
Li-Chun Huang, Nai-Zen Hseuh, Yen-Che Chien, Wei-Yao Wang, Kuang-Da Wang, Wen-Chih Peng
2023 A conf
CIKM
Wei-Wei Du, Wei-Yao Wang, Wen-Chih Peng
2023 J jnl
CoRR
Wei-Wei Du, Wei-Yao Wang, Wen-Chih Peng
2023 J jnl
ACM Trans. Intell. Syst. Technol.
Wei-Yao Wang, Teng-Fong Chan, Wen-Chih Peng, Hui-Kuo Yang, Chih-Chuan Wang, Yao-Chung Fan
2023 J jnl
CoRR
Xiusi Chen, Wei-Yao Wang, Ziniu Hu, Curtis Chou, Lam Hoang, Kun Jin, Mingyan Liu, P. Jeffrey Brantingham, Wei Wang
2023 conf
EMNLP (Findings)
Yu-Chien Tang, Wei-Yao Wang, An-Zi Yen, Wen-Chih Peng
2023 J jnl
CoRR
Yu-Chien Tang, Wei-Yao Wang, An-Zi Yen, Wen-Chih Peng
2023 J jnl
CoRR
Ying-Ying Chang, Wei-Yao Wang, Wen-Chih Peng
2023 J jnl
CoRR
Wei-Yao Wang, Wen-Chih Peng, Wei Wang, Philip S. Yu
2023 J jnl
CoRR
Wei-Yao Wang, Wei-Wei Du, Wen-Chih Peng
2023 A* conf
KDD
Wei-Yao Wang, Yung-Chang Huang, Tsi-Ui Ik, Wen-Chih Peng
2023 J jnl
CoRR
Wei-Yao Wang, Yung-Chang Huang, Tsi-Ui Ik, Wen-Chih Peng
2023 conf
DE-FACTIFY@AAAI
Wei-Wei Du, Hong-Wei Wu, Wei-Yao Wang, Wen-Chih Peng
2023 J jnl
CoRR
Wei-Wei Du, Hong-Wei Wu, Wei-Yao Wang, Wen-Chih Peng
2023 J jnl
CoRR
Ching Chang, Chiao-Tung Chan, Wei-Yao Wang, Wen-Chih Peng, Tien-Fu Chen
2023 A* conf
AAAI
Kai-Shiang Chang, Wei-Yao Wang, Wen-Chih Peng
2023 conf
ICEBE
Kuen-Yu Tsai, Guang-Yun Meng, Tung-Ling Wu, Ming-Hui Zheng, Wei-Yao Wang, Chih-Ming Kung, Yen-Chuan Chen, Chi-Fa Huang, Tsang-Chieh Hsieh, Hsin-Sheng Hsu, Huei-Der Lin, Jing-Xiang Shi
2022 J jnl
CoRR
Li-Chun Huang, Nai-Zen Hseuh, Yen-Che Chien, Wei-Yao Wang, Kuang-Da Wang, Wen-Chih Peng
2022 conf
WWW (Companion Volume)
Yu-Wun Tseng, Hui-Kuo Yang, Wei-Yao Wang, Wen-Chih Peng
2022 J jnl
CoRR
Chih-Chia Li, Wei-Yao Wang, Wei-Wei Du, Wen-Chih Peng
2022 A conf
CIKM
Wei-Yao Wang
2022 conf
LT-EDI
Wei-Yao Wang, Yu-Chien Tang, Wei-Wei Du, Wen-Chih Peng
2022 conf
CIKM Workshops
Wei-Yao Wang, Wei-Wei Du, Wen-Chih Peng
2022 A* conf
AAAI
Wei-Yao Wang, Hong-Han Shuai, Kai-Shiang Chang, Wen-Chih Peng
2022 conf
WWW (Companion Volume)
Cheng-Te Li, Lun-Wei Ku, Yu-Che Tsai, Wei-Yao Wang
2022 conf
DE-FACTIFY@AAAI
Wei-Yao Wang, Wen-Chih Peng
2022 J jnl
CoRR
Wei-Yao Wang, Wen-Chih Peng
2022 conf
CIKM Workshops
Wei-Wei Du, Wei-Yao Wang, Wen-Chih Peng
2022 J jnl
CoRR
Wei-Wei Du, Wei-Yao Wang, Wen-Chih Peng
2022 J jnl
CoRR
Kai-Shiang Chang, Wei-Yao Wang, Wen-Chih Peng
2021 A* conf
ICDM
Wei-Yao Wang, Teng-Fong Chan, Hui-Kuo Yang, Chih-Chuan Wang, Yao-Chung Fan, Wen-Chih Peng
2021 J jnl
CoRR
Wei-Yao Wang, Teng-Fong Chan, Hui-Kuo Yang, Chih-Chuan Wang, Yao-Chung Fan, Wen-Chih Peng
2021 J jnl
CoRR
Wei-Yao Wang, Hong-Han Shuai, Kai-Shiang Chang, Wen-Chih Peng
2020 J jnl
CoRR
Wei-Yao Wang, Kai-Shiang Chang, Yu-Chien Tang
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