Odile Mella

39 papers A* 2A 12B 6Misc 2Journal 5Unranked 11
YearRankTypeTitle / Venue / Authors
2019 A* conf
ICALP
Karima Abidi, Dominique Fohr, Denis Jouvet, David Langlois, Odile Mella, Kamel Smaïli
2019 A* conf
ICALP
Mohamed Amine Menacer, Carlos-Emiliano González-Gallardo, Karima Abidi, Dominique Fohr, Denis Jouvet, David Langlois, Odile Mella, Fatiha Sadat, Juan-Manuel Torres-Moreno, Kamel Smaïli
2019 conf
Canadian AI
Mohamed Amine Menacer, David Langlois, Denis Jouvet, Dominique Fohr, Odile Mella, Kamel Smaïli
2019 J jnl
J. Intell. Fuzzy Syst.
Kamel Smaïli, Dominique Fohr, Carlos-Emiliano González-Gallardo, Michal Grega, Lucjan Janowski, Denis Jouvet, Arian Kozbial, David Langlois, Mikolaj Leszczuk, Odile Mella, Mohamed Amine Menacer, Amaia Méndez, Elvys Linhares Pontes, Eric SanJuan, Juan-Manuel Torres-Moreno, Begoña García Zapirain
2018 Misc conf
MISSI
Kamel Smaïli, Dominique Fohr, Carlos-Emiliano González-Gallardo, Michal Grega, Lucjan Janowski, Denis Jouvet, Artur Komorowski, Arian Kozbial, David Langlois, Mikolaj Leszczuk, Odile Mella, Mohamed Amine Menacer, Amaia Méndez, Elvys Linhares Pontes, Eric SanJuan, Damian Swist, Juan-Manuel Torres-Moreno, Begoña García Zapirain
2018 Misc conf
MISSI
Michal Grega, Kamel Smaïli, Mikolaj Leszczuk, Carlos-Emiliano González-Gallardo, Juan-Manuel Torres-Moreno, Elvys Linhares Pontes, Dominique Fohr, Odile Mella, Mohamed Menacer, Denis Jouvet
2017 conf
WANLP@EACL
Mohamed Amine Menacer, Odile Mella, Dominique Fohr, Denis Jouvet, David Langlois, Kamel Smaïli
2017 conf
ACLING
Mohamed Amine Menacer, Odile Mella, Dominique Fohr, Denis Jouvet, David Langlois, Kamel Smaïli
2016 B conf
LREC
Jürgen Trouvain, Anne Bonneau, Vincent Colotte, Camille Fauth, Dominique Fohr, Denis Jouvet, Jeanin Jügler, Yves Laprie, Odile Mella, Bernd Möbius, Frank Zimmerer
2016 B conf
COLING
Guillaume Serrière, Christophe Cerisara, Dominique Fohr, Odile Mella
2015 conf
SLaTE
Dominique Fohr, Odile Mella
2015 conf
SLaTE
Odile Mella, Dominique Fohr, Anne Bonneau
2015 conf
SLPAT@Interspeech
Agnès Piquard-Kipffer, Odile Mella, Jérémy Miranda, Denis Jouvet, Luiza Orosanu
2014 B conf
LREC
Camille Fauth, Anne Bonneau, Frank Zimmerer, Jürgen Trouvain, Bistra Andreeva, Vincent Colotte, Dominique Fohr, Denis Jouvet, Jeanin Jügler, Yves Laprie, Odile Mella, Bernd Möbius
2013 A conf
INTERSPEECH
Dominique Fohr, Odile Mella
2012 B conf
LREC
Dominique Fohr, Odile Mella
2012 J jnl
Trait. Autom. des Langues
Anne Bonneau, Dominique Fohr, Irina Illina, Denis Jouvet, Odile Mella, Larbi Mesbahi, Luiza Orosanu
2011 J jnl
Int. J. Pattern Recognit. Artif. Intell.
Joseph Razik, Odile Mella, Dominique Fohr, Jean Paul Haton
2010 J jnl
Comput. Speech Lang.
E. Didiot, Irina Illina, Dominique Fohr, Odile Mella
2009 A conf
INTERSPEECH
Christophe Cerisara, Odile Mella, Dominique Fohr
2008 conf
WOCCI
Joseph Razik, Odile Mella, Dominique Fohr, Jean-Paul Haton
2008 A conf
INTERSPEECH
Joseph Razik, Odile Mella, Dominique Fohr, Jean Paul Haton
2007 conf
ISSPA
Joseph Razik, Odile Mella, Dominique Fohr, Jean Paul Haton
2007 conf
Speaker Classification (2)
Sacha Krstulovic, Frédéric Bimbot, Olivier Boëffard, Delphine Charlet, Dominique Fohr, Odile Mella
2007 A conf
INTERSPEECH
Viet Bac Le, Odile Mella, Dominique Fohr
2006 A conf
INTERSPEECH
E. Didiot, Irina Illina, Odile Mella, Dominique Fohr, Jean Paul Haton
2006 J jnl
Speech Commun.
Sacha Krstulovic, Frédéric Bimbot, Olivier Boëffard, Delphine Charlet, Dominique Fohr, Odile Mella
2006 conf
SIGMAP
E. Didiot, Irina Illina, Odile Mella, Dominique Fohr, Jean Paul Haton
2005 A conf
INTERSPEECH
Joseph Razik, Odile Mella, Dominique Fohr, Jean Paul Haton
2005 A conf
INTERSPEECH
Delphine Charlet, Sacha Krstulovic, Frédéric Bimbot, Olivier Boëffard, Dominique Fohr, Odile Mella, Filip Korkmazsky, Djamel Mostefa, Khalid Choukri, Arnaud Vallée
2004 B conf
LREC
Elisabeth Pinto, Delphine Charlet, Hélène François, Djamel Mostefa, Olivier Boëffard, Dominique Fohr, Odile Mella, Frédéric Bimbot, Khalid Choukri, Yann Philip, Francis Charpentier
2004 A conf
INTERSPEECH
Dominique Fohr, Odile Mella, Irina Illina, Christophe Cerisara
2004 A conf
INTERSPEECH
Christophe Cerisara, Dominique Fohr, Odile Mella, Irina Illina
2004 A conf
INTERSPEECH
Dominique Fohr, Odile Mella, Christophe Cerisara, Irina Illina
2000 A conf
INTERSPEECH
Odile Mella, Dominique Fohr, Laurent Martin, Andreas J. Carlen
2000 A conf
INTERSPEECH
Dominique Fohr, Odile Mella, Christophe Antoine
1998 B conf
LREC
Odile Mella, Dominique Fohr
1997 conf
EUROSPEECH
Odile Mella, Dominique Fohr
1993
Odile Mella
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