Caroline Prodhon

45 papers B 4C 4Journal 29Unranked 7
YearRankTypeTitle / Venue / Authors
2026 J jnl
CoRR
Ali Abbassi, Yann Dujardin, Eric Gourdin, Philippe Lacomme, Caroline Prodhon
2026 J jnl
CoRR
Ali Abbassi, Yann Dujardin, Eric Gourdin, Philippe Lacomme, Caroline Prodhon
2026 J jnl
Ann. Oper. Res.
Edgar Ricardo Silva Russi, Nacima Labadie, Caroline Prodhon
2025 C conf
CoDIT
Ali Abbassi, Yann Dujardin, Eric Gourdin, Philippe Lacomme, Caroline Prodhon
2024 J jnl
IEEE Trans. Netw. Serv. Manag.
Hichem Magnouche, Guillaume Doyen, Caroline Prodhon
2024 conf
MIC (1)
Gérard Fleury, Philippe Lacomme, Caroline Prodhon
2023 B conf
CNSM
Hichem Magnouche, Guillaume Doyen, Caroline Prodhon
2022 B conf
NetSoft
Hichem Magnouche, Guillaume Doyen, Caroline Prodhon
2022 conf
OR
Edgar Ricardo Silva Russi, Nacima Labadie, Caroline Prodhon
2021 J jnl
J. Oper. Res. Soc.
Ana María Anaya-Arenas, Caroline Prodhon, Jacques Renaud, Angel B. Ruiz
2021 J jnl
Comput. Oper. Res.
Hatice Çalik, Ammar Oulamara, Caroline Prodhon, Saïd Salhi
2019 J jnl
Algorithms
Syrine Roufaida Ait Haddadene, Nacima Labadie, Caroline Prodhon
2016 J jnl
Transp. Sci.
José-Manuel Belenguer, Enrique Benavent, Antonio Martínez, Christian Prins, Caroline Prodhon, Juan G. Villegas
2016 J jnl
Expert Syst. Appl.
Syrine Roufaida Ait Haddadene, Nacima Labadie, Caroline Prodhon
2015 J jnl
Eng. Appl. Artif. Intell.
Philippe Lacomme, Christian Prins, Caroline Prodhon, Libo Ren
2015 J jnl
Int. Trans. Oper. Res.
William J. Guerrero, Caroline Prodhon, Nubia Velasco, Ciro-Alberto Amaya
2014 C conf
ICORES
Philippe Lacomme, Caroline Prodhon, Christian Prins, Xavier Gandibleux, Boris Beillevaire, Libo Ren
2014 J jnl
Eur. J. Oper. Res.
Caroline Prodhon, Christian Prins
2014 C conf
ICORES
Birome Holo Ba, Christian Prins, Caroline Prodhon
2014 B conf
WiMob
Syrine Roufaida Ait Haddadene, Nacima Labadie, Caroline Prodhon
2013 ch.
Hybrid Metaheuristics
Christophe Duhamel, Christophe Gouinaud, Philippe Lacomme, Caroline Prodhon
2013 J jnl
Eur. J. Oper. Res.
Juan G. Villegas, Christian Prins, Caroline Prodhon, Andrés L. Medaglia, Nubia Velasco
2013 J jnl
Electron. Notes Discret. Math.
William J. Guerrero, Nubia Velasco, Caroline Prodhon, Ciro-Alberto Amaya
2012 J jnl
Eng. Appl. Artif. Intell.
Christophe Duhamel, Philippe Lacomme, Caroline Prodhon
2012 J jnl
Eng. Appl. Artif. Intell.
Viet-Phuong Nguyen, Christian Prins, Caroline Prodhon
2012 J jnl
Eur. J. Oper. Res.
Viet-Phuong Nguyen, Christian Prins, Caroline Prodhon
2011 J jnl
Comput. Oper. Res.
José-Manuel Belenguer, Enrique Benavent, Christian Prins, Caroline Prodhon, Roberto Wolfler Calvo
2011 J jnl
Comput. Oper. Res.
Juan G. Villegas, Christian Prins, Caroline Prodhon, Andrés L. Medaglia, Nubia Velasco
2011 J jnl
Eur. J. Oper. Res.
Caroline Prodhon
2011 J jnl
Comput. Oper. Res.
Christophe Duhamel, Philippe Lacomme, Caroline Prodhon
2010 J jnl
Comput. Oper. Res.
Christophe Duhamel, Philippe Lacomme, Christian Prins, Caroline Prodhon
2010 conf
Hybrid Metaheuristics
Viet-Phuong Nguyen, Christian Prins, Caroline Prodhon
2010 J jnl
Eng. Appl. Artif. Intell.
Juan G. Villegas, Christian Prins, Caroline Prodhon, Andrés L. Medaglia, Nubia Velasco
2010 J jnl
Comput. Oper. Res.
Christian Prins, Nacima Labadi, Caroline Prodhon, Roberto Wolfler Calvo
2009 conf
Hybrid Metaheuristics
Caroline Prodhon
2009 C conf
IJCCI
Caroline Prodhon, Demetrio Macías, Farouk Yalaoui, Alexandre Vial, Lionel Amodeo
2009 conf
EvoWorkshops
Caroline Prodhon, Demetrio Macías, Farouk Yalaoui, Alexandre Vial, Lionel Amodeo
2008 conf
Hybrid Metaheuristics
Caroline Prodhon, Christian Prins
2007 conf
OR
Caroline Prodhon
2007 J jnl
Transp. Sci.
Christian Prins, Caroline Prodhon, Angel B. Ruiz, Patrick Soriano, Roberto Wolfler Calvo
2007 J jnl
4OR
Caroline Prodhon
2007 J jnl
Annu. Rev. Control.
Alexandre Dolgui, Caroline Prodhon
2006 B conf
EvoCOP
Christian Prins, Caroline Prodhon, Roberto Wolfler Calvo
2006 J jnl
4OR
Christian Prins, Caroline Prodhon, Roberto Wolfler Calvo
2006 J jnl
Ann. Oper. Res.
Christian Prins, Caroline Prodhon, Roberto Wolfler Calvo
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