Indra Widjaja

51 papers A* 10A 1B 8C 1Journal 19Unranked 11
YearRankTypeTitle / Venue / Authors
2014 J jnl
SIGMETRICS Perform. Evaluation Rev.
Milan Bradonjic, Iraj Saniee, Indra Widjaja
2014 J jnl
Comput. Commun.
Indra Widjaja, Anwar Walid, Yanbin Luo, Yang Xu, H. Jonathan Chao
2013 J jnl
Bell Labs Tech. J.
Giorgio Cazzaniga, Christian Hermsmeyer, Iraj Saniee, Indra Widjaja
2013 B conf
CCGRID
Indra Widjaja, Sem C. Borst, Iraj Saniee
2013 B conf
IWQoS
Indra Widjaja, Anwar Walid, Yanbin Luo, Yang Xu, H. Jonathan Chao
2013 J jnl
SIGMETRICS Perform. Evaluation Rev.
Indra Widjaja, Anwar Walid, Yanbin Luo, Yang Xu, H. Jonathan Chao
2012 J jnl
Bell Labs Tech. J.
Xueli An, Fabio Pianese, Indra Widjaja, Utku Günay Acer
2012 B conf
ACNS
Zi Chu, Indra Widjaja, Haining Wang
2012 conf
ICC
Hyundo Park, Indra Widjaja, Heejo Lee
2012 A* conf
INFOCOM
Mengjun Xie, Indra Widjaja, Haining Wang
2012 conf
ICC
Indra Widjaja
2011 A conf
ITC
Indra Widjaja, Carl J. Nuzman
2011 B conf
LCN
Xueli An, Fabio Pianese, Indra Widjaja, Utku Günay Acer
2010 conf
VTC Fall
Indra Widjaja, Humberto J. La Roche, Carl J. Nuzman
2009 conf
VTC Fall
Indra Widjaja, Peter Bosch, Humberto J. La Roche
2009 J jnl
Bell Labs Tech. J.
Iraj Saniee, Indra Widjaja
2009 conf
VTC Fall
Indra Widjaja, Humberto J. La Roche
2008 B conf
ICNP
Volker Hilt, Indra Widjaja
2008 B conf
GLOBECOM
Jin Cao, Aiyou Chen, Indra Widjaja, Nengfeng Zhou
2006 J jnl
Bell Labs Tech. J.
Adiseshu Hari, Volker Hilt, Markus Hofmann, Debasis Mitra, Iraj Saniee, Anwar Walid, Indra Widjaja
2006 C conf
BROADNETS
Indra Widjaja
2006 J jnl
Bell Labs Tech. J.
Steven L. Makowski, Anwar Walid, Indra Widjaja
2006 A* conf
INFOCOM
Carl J. Nuzman, Indra Widjaja
2004 conf
ICON
Yang Qin, Daojun Xue, Chee Kheong Siew, Iraj Saniee, Indra Widjaja
2004 J jnl
SIGMETRICS Perform. Evaluation Rev.
Iraj Saniee, Indra Widjaja, John Morrison
2004 conf
FDNA@SIGCOMM
Indra Widjaja, Iraj Saniee
2003 conf
ICC
Indra Widjaja, Iraj Saniee, Lijun Qian, Anwar Elwalid, John Ellson, Lily Cheng
2003 conf
Hot Interconnects
Kevin Ross, Nicholas Bambos, Krishnan Kumaran, Iraj Saniee, Indra Widjaja
2003 A* conf
INFOCOM
Indra Widjaja, Anwar Elwalid
2003 J jnl
IEEE Commun. Mag.
Indra Widjaja, Iraj Saniee, Randy Giles, Debasis Mitra
2003 J jnl
IEEE J. Sel. Areas Commun.
Kevin Ross, Nicholas Bambos, Krishnan Kumaran, Iraj Saniee, Indra Widjaja
2002 J jnl
Comput. Networks
Anwar Elwalid, Cheng Jin, Steven H. Low, Indra Widjaja
2002 J jnl
RFC
Daniel O. Awduche, Angela L. Chiu, Anwar Elwalid, Indra Widjaja, Xipeng Xiao
2002 conf
ICC
Indra Widjaja, Anwar Elwalid
2001 A* conf
INFOCOM
Anwar Elwalid, Cheng Jin, Steven H. Low, Indra Widjaja
1999 J jnl
RFC
Indra Widjaja, Anwar Elwalid
1999 J jnl
IEEE J. Sel. Areas Commun.
Indra Widjaja, Anwar I. Walid
1999 A* conf
INFOCOM
Indra Widjaja, Haining Wang, Steven Wright, Amalendu Chatterjee
1998 J jnl
Perform. Evaluation
Jian-Min Li, Indra Widjaja, Marcel F. Neuts
1998 A* conf
INFOCOM
Indra Widjaja, Anwar Elwalid
1997 ed.
Broadband Networking Technologies
Seyhan Civanlar, Indra Widjaja
1997 conf
Broadband Networking Technologies
Indra Widjaja, Anwar Elwalid
1997 J jnl
IEEE Commun. Mag.
Brian P. Crow, Indra Widjaja, Jeong Geun Kim, Prescott Sakai
1997 A* conf
INFOCOM
Brian P. Crow, Indra Widjaja, Jeong Geun Kim, Prescott Sakai
1996 A* conf
INFOCOM
Indra Widjaja, Marcel F. Neuts, Jian-Min Li
1995 B conf
ICCCN
Aruna Kumar Kompella, Indra Widjaja
1994 J jnl
IEEE Trans. Commun.
Indra Widjaja, Alberto Leon-Garcia
1993 J jnl
Comput. Networks ISDN Syst.
Indra Widjaja, Alberto Leon-Garcia, Hussein T. Mouftah
1992 B conf
Data Compression Conference
Masoud R. K. Khansari, Indra Widjaja, Alberto Leon-Garcia
1992 A* conf
INFOCOM
Indra Widjaja, Alberto Leon-Garcia
1991 A* conf
INFOCOM
Hyong Sok Kim, Indra Widjaja, Alberto Leon-Garcia
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