Makoto Iwayama

57 papers A* 8A 2B 5Journal 7Unranked 35
YearRankTypeTitle / Venue / Authors
2022 A conf
INTERSPEECH
Naokazu Uchida, Takeshi Homma, Makoto Iwayama, Yasuhiro Sogawa
2019 conf
NTCIR
Ken-Ichi Yokote, Makoto Iwayama
2018 conf
SCAI@EMNLP
Giovanni Yoko Kristianto, Huiwen Zhang, Bin Tong, Makoto Iwayama, Yoshiyuki Kobayashi
2017 A* conf
KDD
Bin Tong, Martin Klinkigt, Makoto Iwayama, Toshihiko Yanase, Yoshiyuki Kobayashi, Anshuman Sahu, Ravigopal Vennelakanti
2016 J jnl
New Gener. Comput.
Yu Asano, Seiji Koide, Makoto Iwayama, Fumihiro Kato, Iwao Kobayashi, Tadashi Mima, Ikki Ohmukai, Hideaki Takeda
2016 A conf
CIKM
Bin Tong, Martin Klinkigt, Makoto Iwayama, Yoshiyuki Kobayashi, Anshuman Sahu, Ravigopal Vennelakanti
2015 conf
ACL (System Demonstrations)
Misa Sato, Kohsuke Yanai, Toshinori Miyoshi, Toshihiko Yanase, Makoto Iwayama, Qinghua Sun, Yoshiki Niwa
2015 conf
GSB@SIGIR
Bin Tong, Toshihiko Yanase, Hiroaki Ozaki, Makoto Iwayama
2015 conf
ArgMining@HLT-NAACL
Toshihiko Yanase, Toshinori Miyoshi, Kohsuke Yanai, Misa Sato, Makoto Iwayama, Yoshiki Niwa, Paul Reisert, Kentaro Inui
2015 conf
ICDM Workshops
Bin Tong, Hiroaki Ozaki, Makoto Iwayama, Yoshiyuki Kobayashi, Anshuman Sahu, Ravigopal Vennelakanti
2010 conf
NTCIR
Yusuke Sato, Makoto Iwayama
2010 conf
NTCIR
Hisao Mase, Makoto Iwayama
2010 conf
NTCIR
Hidetsugu Nanba, Atsushi Fujii, Makoto Iwayama, Taiichi Hashimoto
2009 conf
PaIR@CIKM
Yusuke Sato, Makoto Iwayama
2008 conf
NTCIR
Hisao Mase, Makoto Iwayama
2008 conf
NTCIR
Hidetsugu Nanba, Atsushi Fujii, Makoto Iwayama, Taiichi Hashimoto
2008 conf
PaIR
Hidetsugu Nanba, Atsushi Fujii, Makoto Iwayama, Taiichi Hashimoto
2007 J jnl
Inf. Process. Manag.
Atsushi Fujii, Makoto Iwayama, Noriko Kando
2007 conf
NTCIR
Hisao Mase, Makoto Iwayama
2007 conf
NTCIR
Makoto Iwayama, Atsushi Fujii, Noriko Kando
2007 conf
NTCIR
Atsushi Fujii, Makoto Iwayama, Noriko Kando
2006 J jnl
Inf. Process. Manag.
Makoto Iwayama, Atsushi Fujii, Noriko Kando, Yuzo Marukawa
2006 B conf
LREC
Atsushi Fujii, Makoto Iwayama, Noriko Kando
2005 conf
Wissensmanagement
Makoto Iwayama
2005 conf
Wissensmanagement (LNCS Volume)
Makoto Iwayama, Yoshiki Niwa
2005 conf
NTCIR
Hisao Mase, Tadataka Matsubayashi, Yuichi Ogawa, Takaaki Yayoi, Yusuke Sato, Makoto Iwayama
2005 conf
NTCIR
Makoto Iwayama, Atsushi Fujii, Noriko Kando
2005 conf
NTCIR
Atsushi Fujii, Makoto Iwayama, Noriko Kando
2005 J jnl
ACM Trans. Asian Lang. Inf. Process.
Hisao Mase, Tadataka Matsubayashi, Yuichi Ogawa, Makoto Iwayama, Tadaaki Oshio
2004 conf
NTCIR
Akihiro Shinmori, Manabu Okumura, Yuzo Marukawa, Makoto Iwayama
2004 conf
NTCIR
Atsushi Fujii, Makoto Iwayama, Noriko Kando
2004 J jnl
SIGIR Forum
Makoto Iwayama, Atsushi Fujii, Noriko Kando, Akihiko Takano
2004 J jnl
CoRR
Atsushi Fujii, Makoto Iwayama, Noriko Kando
2004 B conf
LREC
Atsushi Fujii, Makoto Iwayama, Noriko Kando
2004 A* conf
SIGIR
Atsushi Fujii, Makoto Iwayama, Noriko Kando
2004 conf
NTCIR
Hisao Mase, Tadataka Matsubayashi, Yuichi Ogawa, Makoto Iwayama, Tadaaki Oshio
2003 A* conf
SIGIR
Makoto Iwayama, Atsushi Fujii, Noriko Kando, Yuzo Marukawa
2002 conf
NTCIR
Yohichi Nakatani, Koutarou Takada, Michihiro Isoda, Manabu Okumura, Makoto Iwayama, Yuzo Marukawa, Akihiro Shinmori
2002 conf
NTCIR
Makoto Iwayama, Atsushi Fujii, Noriko Kando, Akihiko Takano
2002 conf
NTCIR
Akihiro Shinmori, Manabu Okumura, Yuzo Marukawa, Makoto Iwayama
2001 conf
NLPRS
Akihiko Takano, Yoshiki Niwa, Shingo Nishioka, Toru Hisamitsu, Makoto Iwayama, Osamu Imaichi
2001 conf
NTCIR
Makoto Iwayama, Yoshiki Niwa, Shingo Nishioka, Akihiko Takano, Toru Hisamitsu, Osamu Imaichi, Hirofumi Sakurai, Masakazu Fujio
2000 conf
Kyoto International Conference on Digital Libraries
Akihiko Takano, Yoshiki Niwa, Shingo Nishioka, Makoto Iwayama, Toru Hisamitsu, Osamu Imaichi, Hirofumi Sakurai
2000 B conf
SOFSEM
Akihiko Takano, Yoshiki Niwa, Shingo Nishioka, Makoto Iwayama, Toru Hisamitsu, Osamu Imaichi, Hirofumi Sakurai
2000 conf
RIAO
Hajime Mochizuki, Makoto Iwayama, Manabu Okumura
2000 A* conf
SIGIR
Makoto Iwayama
1999 conf
NTCIR
Yoshiki Niwa, Makoto Iwayama, Toru Hisamitsu, Shingo Nishioka, Akihiko Takano, Hirofumi Sakurai, Osamu Imaichi
1999 conf
NTCIR
Toru Hisamitsu, Yoshiki Niwa, Shingo Nishioka, Hirofumi Sakurai, Osamu Imaichi, Makoto Iwayama, Akihiko Takano
1997 conf
RIAO
Makoto Iwayama, Takenobu Tokunaga
1997 J jnl
CoRR
Yoshiki Niwa, Shingo Nishioka, Makoto Iwayama, Akihiko Takano, Yoshihiko Nitta
1995 A* conf
IJCAI
Takenobu Tokunaga, Makoto Iwayama, Hozumi Tanaka
1995 A* conf
SIGIR
Makoto Iwayama, Takenobu Tokunaga
1995 A* conf
IJCAI
Makoto Iwayama, Takenobu Tokunaga
1994 conf
ANLP
Makoto Iwayama, Takenobu Tokunaga
1993 B conf
ALT
Makoto Iwayama, Nitin Indurkhya, Hiroshi Motoda
1990 A* conf
AAAI
Makoto Iwayama, Takenobu Tokunaga, Hozumi Tanaka
1988 B conf
COLING
Takenobu Tokunaga, Makoto Iwayama, Hozumi Tanaka, Tadashi Kamiwaki
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