Ingrid Carlbom

40 papers A* 8A 4Journal 14Unranked 13
YearRankTypeTitle / Venue / Authors
2015 conf
SIGGRAPH Asia Technical Briefs
Pontus Olsson, Fredrik Nysjö, Neeru Singh, Andreas Thor, Ingrid Carlbom
2013 conf
World Haptics
Pontus Olsson, Fredrik Nysjö, Jan-Michael Hirsch, Ingrid Carlbom
2012 conf
HAPTICS
Pontus Olsson, Fredrik Nysjö, Stefan Seipel, Ingrid Carlbom
2012 conf
EuroHaptics (1)
Pontus Olsson, Stefan Johansson, Fredrik Nysjö, Ingrid Carlbom
2006 J jnl
Signal Process. Image Commun.
Daniel G. Aliaga, Paul Rosen, Voicu Popescu, Ingrid Carlbom
2005 conf
ICIP (1)
Daniel G. Aliaga, Ingrid Carlbom
2004 J jnl
IEEE Robotics Autom. Mag.
Daniel G. Aliaga, Ingrid Carlbom
2003 conf
SI3D
Daniel G. Aliaga, Dimah Yanovsky, Thomas A. Funkhouser, Ingrid Carlbom
2003 J jnl
IEEE Computer Graphics and Applications
Daniel G. Aliaga, Thomas A. Funkhouser, Dimah Yanovsky, Ingrid Carlbom
2002 J jnl
IEEE Trans. Multim.
Gopal Sarma Pingali, Agata Opalach, Yves Jean, Ingrid Carlbom
2002 conf
ICIP (1)
Gopal Sarma Pingali, Liang Zhao, Ingrid Carlbom
2002 A conf
IEEE Visualization
Daniel G. Aliaga, Thomas A. Funkhouser, Dimah Yanovsky, Ingrid Carlbom
2002 J jnl
IEEE Computer Graphics and Applications
Nicolas Tsingos, Ingrid Carlbom, Gary W. Elko, Robert Kubli, Thomas A. Funkhouser
2001 A* conf
SIGGRAPH
Nicolas Tsingos, Thomas A. Funkhouser, Addy Ngan, Ingrid Carlbom
2001 A* conf
ACM Multimedia
Gopal Sarma Pingali, Agata Opalach, Ingrid Carlbom
2001 A* conf
SIGGRAPH
Daniel G. Aliaga, Ingrid Carlbom
2001 A conf
IEEE Visualization
Gopal Sarma Pingali, Agata Opalach, Yves Jean, Ingrid Carlbom
2000 A conf
IEEE International Conference on Multimedia and Expo (III)
Gopal Sarma Pingali, Yves Jean, Agata Opalach, Ingrid Carlbom
1999 A* conf
ACM Multimedia (1)
Gopal Sarma Pingali, Gamze Tunali, Ingrid Carlbom
1999 conf
VISUAL
Gopal Sarma Pingali, Yves Jean, Ingrid Carlbom
1999 A* conf
SIGGRAPH
Thomas A. Funkhouser, Patrick Min, Ingrid Carlbom
1998 A* conf
SIGGRAPH
Thomas A. Funkhouser, Ingrid Carlbom, Gary W. Elko, Gopal Sarma Pingali, Man Mohan Sondhi, Jim West
1998 conf
SIGGRAPH Abstracts and Applications
Mark Holler, Ingrid Carlbom, Steven Feiner, George G. Robertson, Demetri Terzopoulos
1998 A* conf
CVPR
Gopal Sarma Pingali, Yves Jean, Ingrid Carlbom
1995 conf
CVRMed
Gudrun Klinker, Ingrid Carlbom, William M. Hsu, Demetri Terzopoulos
1994 J jnl
IEEE Trans. Medical Imaging
Ingrid Carlbom, Demetri Terzopoulos, Kristen M. Harris
1993 A conf
IEEE Visualization
Ingrid Carlbom
1992 J jnl
Commun. ACM
Ingrid Carlbom, William M. Hsu, Gudrun Klinker, Richard Szeliski, Keith Waters, Michael Doyle, Jim Gettys, Kristen M. Harris, Thoms M. Levergood, Ricky S. Palmer, Lawrence G. Palmer, Marc Picart, Demetri Terzopoulos, David Tonnesen, Michael W. Vannier, Greg Wallace
1989 J jnl
IEEE Computer Graphics and Applications
Paolo Sabella, Ingrid Carlbom
1987 J jnl
IEEE Computer Graphics and Applications
Ingrid Carlbom
1985 J jnl
IEEE Computer Graphics and Applications
Ingrid Carlbom, Indranil Chakravarty, David Vanderschel
1985 conf
Advances in Computer Graphics
Norman I. Badler, Ingrid Carlbom
1984 conf
Eurographics
Norman I. Badler, Ingrid Carlbom
1983 J jnl
ACM Trans. Graph.
Ingrid Carlbom, James C. Michener
1981 A* conf
IJCAI
Randall Davis, Howard Austin, Ingrid Carlbom, Bud Frawley, Paul Pruchnik, Rich Sneiderman, J. A. Gilreath
1980
Ingrid Carlbom
1979 J jnl
ACM Comput. Surv.
Ingrid Carlbom, Joseph Paciorek
1979 J jnl
ACM Comput. Surv.
Ingrid Carlbom
1978 J jnl
ACM Comput. Surv.
Ingrid Carlbom, Joseph Paciorek
1973 conf
SIGPLAN/SIGMICRO Interface
George M. Stabler, Ingrid Carlbom, Ken Magel
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