Omar Boucelma

97 papers A* 1A 5B 5C 8Misc 1Journal 11Unranked 59
YearRankTypeTitle / Venue / Authors
2025 conf
SIGSPATIAL/GIS
Omar Ghannou, Etienne Thuillier, Omar Boucelma
2024 J jnl
Comput. Sci. Inf. Syst.
Omar Ghannou, Etienne Thuillier, Omar Boucelma
2023 conf
EDBT/ICDT Workshops
Yassine Guermazi, Sana Sellami, Omar Boucelma
2023 J jnl
Expert Syst. J. Knowl. Eng.
Tao Peng, Sana Sellami, Omar Boucelma, Richard Chbeir
2023 ed.
Trans. Large-Scale Data- and Knowledge-Centered Systems
Abdelkader Hameurlain, A Min Tjoa, Omar Boucelma, Farouk Toumani
2023 B conf
ICCCI
Tao Peng, Sana Sellami, Omar Boucelma, Richard Chbeir
2022 conf
ADBIS (Short Papers)
Yassine Guermazi, Sana Sellami, Omar Boucelma
2022 A conf
ICWS
Lara Kallab, Richard Chbeir, Sana Sellami, Omar Boucelma
2020 conf
PKDD/ECML Workshops
Yassine Guermazi, Sana Sellami, Omar Boucelma
2020 conf
AALTD@PKDD/ECML
Tao Peng, Sana Sellami, Omar Boucelma
2019 J jnl
Open J. Internet Things
Tao Peng, Sana Sellami, Omar Boucelma
2017 conf
HPCS
Matteo Interlandi, Julien Lacroix, Omar Boucelma, Francesco Guerra
2017 conf
ICITST
Clara Bertolissi, Omar Boucelma, Worachet Uttha
2017 conf
International KEYSTONE Conference
Fatma Slaimi, Sana Sellami, Omar Boucelma
2017 conf
International KEYSTONE Conference
Omar Boucelma
2017 C conf
MobiQuitous
Anne-Marie Lesas, Omar Boucelma, Julien Lacroix
2016 conf
OTM Conferences
Fatma Slaimi, Sana Sellami, Omar Boucelma, Ahlem Ben Hassine
2016 conf
ICEBE
Fatma Slaimi, Sana Sellami, Omar Boucelma, Ahlem Ben Hassine
2015 conf
OTM Conferences
Fatma Slaimi, Sana Sellami, Omar Boucelma, Ahlem Ben Hassine
2015 conf
OTM Conferences
Julien Lacroix, Omar Boucelma
2015 conf
OTM Conferences
Sahar Aljalbout, Omar Boucelma, Sana Sellami
2014 J jnl
Int. J. Agric. Environ. Inf. Syst.
Sandro Bimonte, Omar Boucelma, Olivier Machabert, Sana Sellami
2014 J jnl
Comput. Environ. Urban Syst.
Sandro Bimonte, Omar Boucelma, Olivier Machabert, Sana Sellami
2014 conf
ICCSA (4)
Sandro Bimonte, Omar Boucelma, Olivier Machabert, Sana Sellami
2014 ed.
SDSW@ISWC
Paulo Rupino da Cunha, Ngoc Thanh Nguyen, Omar Boucelma, Bogdan Cautis, Yannis Velegrakis
2014 conf
SDSW@ISWC
Paulo Rupino da Cunha, Ngoc Thanh Nguyen, Omar Boucelma, Bogdan Cautis, Yannis Velegrakis
2014 conf
IEEE CLOUD
Julien Lacroix, Omar Boucelma
2014 conf
EDA
Sandro Bimonte, Omar Boucelma, Olivier Machabert, Sana Sellami
2013 conf
OTM Conferences
Fatma Slaimi, Sana Sellami, Omar Boucelma, Ahlem Ben Hassine
2013 conf
IEEE CLOUD
Yingmin Li, Omar Boucelma
2013 conf
IEEE SCC
Julien Lacroix, Omar Boucelma
2013 ch.
Advanced Query Processing (1)
Gilles Nachouki, Mohamed Quafafou, Omar Boucelma, François-Marie Colonna
2013 A conf
ICWS
Sana Sellami, Omar Boucelma
2012 conf
BIOSIGNALS
Ammar Mechouche, Azeddine Zidouni, Mohamed Quafafou, Omar Boucelma
2012 B conf
EC-TEL
Ivan Madjarov, Omar Boucelma
2012 conf
CSEDU (1)
Ivan Madjarov, Omar Boucelma
2011 conf
ADBIS (2)
Yingmin Li, Omar Boucelma
2011 J jnl
Int. J. Knowl. Based Intell. Eng. Syst.
Yacine Sam, Omar Boucelma, François-Marie Colonna
2011 ch.
Social Media Tools and Platforms in Learning Environments
Ivan Madjarov, Omar Boucelma
2011 A conf
ICWS
Sana Sellami, Omar Boucelma
2010 C conf
MEDES
Doan Khanh Han, Omar Boucelma, Stéphane Bressan, Putu Wuri Handayani
2010 conf
GIS
Yassine Lassoued, Mohamed Reda Bouadjenek, Omar Boucelma, Fernando Lemos, Mokrane Bouzeghoub
2010 conf
RED
Mohamed Quafafou, Omar Boucelma, Yacine Sam, Zahi Jarir
2010 conf
ICWL
Ivan Madjarov, Omar Boucelma
2010 conf
DASFAA (2)
Ghasem Heyrani-Nobari, Omar Boucelma, Stéphane Bressan
2008 conf
SERVICES II
Yacine Sam, Omar Boucelma
2008 C conf
iiWAS
Yacine Sam, Omar Boucelma
2008 C conf
iiWAS
François-Marie Colonna, Omar Boucelma
2008 conf
ICSOFT (ISDM/ABF)
Yassine Lassoued, Dawn J. Wright, Luis Bermudez, Omar Boucelma
2008 J jnl
Ingénierie des Systèmes d Inf.
Omar Boucelma, Mohand-Said Hacid, Thérèse Libourel, Jean-Marc Petit
2007 ed.
BDA
Omar Boucelma, Mohand-Said Hacid, Thérèse Libourel, Jean-Marc Petit
2007 conf
ICEIS (3)
Jacky Akoka, Laure Berti-Équille, Omar Boucelma, Mokrane Bouzeghoub, Isabelle Comyn-Wattiau, Mireille Cosquer, Virginie Goasdoué-Thion, Zoubida Kedad, Sylvaine Nugier, Verónika Peralta, Samira Si-Said Cherfi
2007 ch.
Spatial Data on the Web
Omar Boucelma, Mehdi Essid, Yassine Lassoued
2007 C conf
IDEAS
Yacine Sam, Omar Boucelma
2007 J jnl
Ingénierie des Systèmes d Inf.
Yacine Lassoued, Mehdi Essid, Omar Boucelma
2007 conf
Web Intelligence
Yacine Sam, Omar Boucelma
2007 conf
INFORSID
Yacine Sam, François-Marie Colonna, Omar Boucelma
2007 conf
AGILE Conf.
Mehdi Essid, Yassine Lassoued, Omar Boucelma
2007 conf
QDB
Yassine Lassoued, Mehdi Essid, Omar Boucelma, Mohamed Quafafou
2007 A conf
ICWS
Yacine Sam, Omar Boucelma
2006 conf
DEXA Workshops
Mehdi Essid, Omar Boucelma, Stéphane Bressan
2006 conf
OTM Conferences (1)
Yacine Sam, François-Marie Colonna, Omar Boucelma
2006 B conf
EC-TEL
Ivan Madjarov, Omar Boucelma
2006 conf
HealthGrid
François-Marie Colonna, Yacine Sam, Omar Boucelma
2006 conf
CEC/EEE
Yacine Sam, Omar Boucelma, Mohand-Said Hacid
2006 conf
INFORSID
Yassine Lassoued, Omar Boucelma
2006 conf
CORIA
Yacine Sam, Omar Boucelma
2006 B conf
EDBT
Mehdi Essid, François-Marie Colonna, Omar Boucelma, Abdelkader Bétari
2006 conf
Technologies for Collaborative Business Process Management
Yacine Sam, Omar Boucelma, Mohand-Said Hacid
2006 C conf
MoMM
Omar Boucelma
2006 conf
EDBT Workshops
Alberto Belussi, Omar Boucelma, Barbara Catania, Yassine Lassoued, Paola Podestà
2006 B conf
ICWE
Yacine Sam, Omar Boucelma, Mohand-Said Hacid
2005 ed.
GIS
Cyrus Shahabi, Omar Boucelma
2005 conf
WISE Workshops
Yassine Lassoued, Omar Boucelma
2005 conf
DEXA Workshops
François-Marie Colonna, Omar Boucelma
2004 conf
ICWL
Ivan Madjarov, Omar Boucelma, Abdelkader Bétari
2004 conf
GEOINFO
Mehdi Essid, Omar Boucelma
2004 C conf
W2GIS
Omar Boucelma, François-Marie Colonna
2004 conf
GIS
Mehdi Essid, Omar Boucelma, François-Marie Colonna, Yassine Lassoued
2004 Misc conf
AIMSA
Snezhana Manoah, Omar Boucelma, Yassine Lassoued
2004 conf
BDA
Omar Boucelma, François-Marie Colonna, Mehdi Essid
2004 A* conf
ICDE
Omar Boucelma, Mehdi Essid, Zoé Lacroix, Julien Vinel, Jean-Yves Garinet, Abdelkader Bétari
2003 conf
INFORSID
Mehdi Essid, Abdelkader Bétari, Omar Boucelma, Zoé Lacroix
2003 J jnl
SIGMOD Rec.
Zoé Lacroix, Omar Boucelma
2003 conf
WIDM
Zoé Lacroix, Omar Boucelma, Mehdi Essid
2003 A conf
CIKM
Omar Boucelma, Jean-Yves Garinet, Zoé Lacroix
2002 conf
ACM-GIS
Omar Boucelma, Mehdi Essid, Zoé Lacroix
2002 conf
OOIS Workshops
Omar Boucelma, Zoé Lacroix
2002 conf
EEXTT
Omar Boucelma, Mehdi Essid, Zoé Lacroix, Abdelkader Bétari
2002 J jnl
SIGMOD Rec.
Omar Boucelma, Silvana Castano, Carole A. Goble, Vanja Josifovski, Zoé Lacroix, Bertram Ludäscher
2002 conf
DIWeb
Omar Boucelma, Mehdi Essid
2001 J jnl
Ingénierie des Systèmes d Inf.
Omar Boucelma, Zoé Lacroix
1999 conf
Proc. 15èmes Journées Bases de Données Avancées, BDA
Issam Abbas, Omar Boucelma
1997 C conf
DEXA
Issam Abbas, Omar Boucelma
1994 conf
POS
Jean-Claude Franchitti, Roger King, Omar Boucelma
1991 conf
DOOD
Omar Boucelma, Jacques Le Maitre
1989 conf
BDA
Jacques Le Maitre, Omar Boucelma
redb/extractors/decompiler/bninja/analysis/cfg_features.py
← Index redb/extractors/decompiler/bninja/analysis/cfg_features.py python
import struct
from collections import deque
from typing import Optional

import blake3
import mmh3


# ---------------------------------------------------------------------------
# Task 1.1: Core Graph Utilities
# ---------------------------------------------------------------------------

def bfs_order(successors: list[list[int]], n: int) -> list[int]:
    """
    BFS traversal from node 0 (entry block), returns node indices in visit order.
    Unreachable nodes appended at the end.
    """
    if n == 0:
        return []

    visited = set()
    order = []
    queue = deque([0])
    visited.add(0)

    while queue:
        idx = queue.popleft()
        order.append(idx)
        for target in successors[idx]:
            if target not in visited:
                visited.add(target)
                queue.append(target)

    # Append unreachable blocks (dead code)
    for i in range(n):
        if i not in visited:
            order.append(i)

    return order


def bfs_max_depth(successors: list[list[int]], n: int) -> int:
    """
    Maximum BFS depth from entry block (node 0).
    Replaces the per-block depth column with a single scalar.
    """
    if n == 0:
        return 0

    depth = {0: 0}
    max_d = 0
    queue = deque([0])

    while queue:
        node = queue.popleft()
        for s in successors[node]:
            if s not in depth:
                depth[s] = depth[node] + 1
                if depth[s] > max_d:
                    max_d = depth[s]
                queue.append(s)

    return max_d


# ---------------------------------------------------------------------------
# Task 1.2: Back-Edge Detection (Iterative DFS)
# ---------------------------------------------------------------------------

def count_back_edges(successors: list[list[int]], n: int) -> int:
    """
    Count natural loops via iterative DFS back-edge detection.
    A back edge is an edge to a GRAY (in-stack) node.

    Iterative to avoid stack overflow on functions with 1000+ blocks
    (common in obfuscated malware, VM dispatchers, unrolled loops).
    """
    if n == 0:
        return 0

    WHITE, GRAY, BLACK = 0, 1, 2
    color = [WHITE] * n
    back_edges = 0

    stack = [(0, iter(successors[0]))]
    color[0] = GRAY

    while stack:
        u, children = stack[-1]
        try:
            v = next(children)
            if color[v] == GRAY:
                back_edges += 1
            elif color[v] == WHITE:
                color[v] = GRAY
                stack.append((v, iter(successors[v])))
        except StopIteration:
            color[u] = BLACK
            stack.pop()

    return back_edges


# ---------------------------------------------------------------------------
# Task 1.3: Topology Hash
# ---------------------------------------------------------------------------

def compute_topology_hash(
    successors: list[list[int]],
    bfs: list[int],
    n: int,
) -> bytes:
    """
    BLAKE3 hash of BFS-ordered canonical adjacency.
    Pure graph shape — ignores all block content.
    Two functions with identical control flow structure produce identical hashes.

    Returns 16 bytes (128-bit).
    """
    if n == 0:
        return b'\x00' * 16

    # Remap: original index -> BFS position
    remap = {original: position for position, original in enumerate(bfs)}

    canonical = bytearray()
    for position in range(n):
        original_idx = bfs[position]
        remapped_succs = sorted(
            remap[s] for s in successors[original_idx] if s in remap
        )
        # Pack: node_index (2 bytes) + num_successors (1 byte) + successor indices (2 bytes each)
        canonical.extend(struct.pack('<HB', position, len(remapped_succs)))
        for s in remapped_succs:
            canonical.extend(struct.pack('<H', s))

    return blake3.blake3(bytes(canonical)).digest(length=16)


# ---------------------------------------------------------------------------
# Task 1.4: MD-Index (Top-Down and Bottom-Up)
# ---------------------------------------------------------------------------

def compute_md_index_topdown(
    successors: list[list[int]],
    predecessors: list[list[int]],
    bfs: list[int],
) -> int:
    """
    BinDiff-style top-down MD-index.
    Hash of (in_degree, out_degree) sequence in BFS order from entry.
    Returns UInt64.
    """
    if not bfs:
        return 0

    degree_bytes = bytearray()
    for idx in bfs:
        in_deg = min(len(predecessors[idx]), 255)
        out_deg = min(len(successors[idx]), 255)
        degree_bytes.extend(struct.pack('<BB', in_deg, out_deg))

    h = blake3.blake3(bytes(degree_bytes)).digest(length=8)
    return struct.unpack('<Q', h)[0]


def compute_md_index_bottomup(
    successors: list[list[int]],
    predecessors: list[list[int]],
    n: int,
) -> int:
    """
    Bottom-up MD-index: BFS from exit blocks (no successors),
    traversing edges in reverse.
    Returns UInt64.
    """
    if n == 0:
        return 0

    exits = [i for i in range(n) if len(successors[i]) == 0]
    if not exits:
        exits = [n - 1]  # Fallback: use last block

    visited = set(exits)
    order = []
    queue = deque(exits)

    while queue:
        idx = queue.popleft()
        order.append(idx)
        for pred in predecessors[idx]:
            if pred not in visited:
                visited.add(pred)
                queue.append(pred)

    # Append unreachable blocks
    for i in range(n):
        if i not in visited:
            order.append(i)

    degree_bytes = bytearray()
    for idx in order:
        in_deg = min(len(predecessors[idx]), 255)
        out_deg = min(len(successors[idx]), 255)
        degree_bytes.extend(struct.pack('<BB', in_deg, out_deg))

    h = blake3.blake3(bytes(degree_bytes)).digest(length=8)
    return struct.unpack('<Q', h)[0]


# ---------------------------------------------------------------------------
# Task 1.5: Prime Product
# ---------------------------------------------------------------------------

# Small primes assigned to LLIL opcode categories.
# Keys are the integer values of binaryninja.LowLevelILOperation enum members.
# We use integer keys so this module doesn't import binaryninja.
#
# Mapping rationale: same operation class -> same prime.
# Using LLIL (not native asm) makes this architecture-independent.
#
# Populated at import time by cfg.py using the real LowLevelILOperation enum values.
# Unknown ops map to prime 1 (identity element) in compute_prime_product().
LLIL_OP_PRIMES: dict[int, int] = {}


def compute_prime_product(llil_operations: list[int]) -> int:
    """
    Product of small primes assigned to each LLIL opcode.
    Position-independent: block reordering doesn't change the result.
    Mod 2^64 for fixed-size storage.

    Args:
        llil_operations: flat list of LLIL operation enum integer values
                         for all instructions in the function.
    Returns:
        UInt64 prime product, or 0 if no instructions.
    """
    if not llil_operations:
        return 0

    product = 1
    for op in llil_operations:
        prime = LLIL_OP_PRIMES.get(op, 1)
        product = (product * prime) % (2**64)

    return product


# ---------------------------------------------------------------------------
# Task 1.6: ACFG Block Features
# ---------------------------------------------------------------------------

# Instruction category indices for ACFG feature vectors
CAT_ARITHMETIC = 0
CAT_LOGIC = 1
CAT_TRANSFER = 2
CAT_CALL = 3
CAT_COMPARISON = 4
CAT_MEMORY = 5
CAT_OTHER = 6

# Maps LLIL operation integer values to category indices.
# Populated at import time by cfg.py using the real LowLevelILOperation enum.
LLIL_OP_CATEGORIES: dict[int, int] = {}


def build_block_features(
    block_llil_ops: list[list[int]],
    successors: list[list[int]],
    n: int,
) -> list[list[int]]:
    """
    Extract Gemini-style ACFG features per block.

    Args:
        block_llil_ops: per-block list of LLIL operation integer values.
                        block_llil_ops[i] is the list of ops for block i.
                        Empty list if LLIL unavailable for that block.
        successors: index-based adjacency list.
        n: number of blocks.

    Returns:
        List of [instr_count, arithmetic, logic, transfer, call, comparison,
                 memory, successor_count] per block. All values capped at 65535.
    """
    features = []
    for i in range(n):
        cats = [0, 0, 0, 0, 0, 0, 0]
        ops = block_llil_ops[i] if i < len(block_llil_ops) else []
        for op in ops:
            cat = LLIL_OP_CATEGORIES.get(op, CAT_OTHER)
            cats[cat] += 1

        instr_count = len(ops)
        features.append([
            min(instr_count, 65535),
            min(cats[CAT_ARITHMETIC], 65535),
            min(cats[CAT_LOGIC], 65535),
            min(cats[CAT_TRANSFER], 65535),
            min(cats[CAT_CALL], 65535),
            min(cats[CAT_COMPARISON], 65535),
            min(cats[CAT_MEMORY], 65535),
            min(len(successors[i]), 65535),
        ])

    return features


# ---------------------------------------------------------------------------
# Task 1.7: CFG Feature TLSH
# ---------------------------------------------------------------------------

def compute_cfg_feature_tlsh(
    bb_features: list[list[int]],
    bfs: list[int],
) -> Optional[str]:
    """
    TLSH hash of BFS-ordered per-block feature vectors.
    Captures both structure (BFS ordering) and instruction distribution.

    Returns TLSH hex string or None if too few bytes for TLSH (< 50).
    """
    import tlsh as _tlsh

    feature_bytes = bytearray()
    for idx in bfs:
        feats = bb_features[idx]
        feature_bytes.extend(struct.pack(
            '<HBBBBBBB',
            min(feats[0], 65535),
            min(feats[1], 255),
            min(feats[2], 255),
            min(feats[3], 255),
            min(feats[4], 255),
            min(feats[5], 255),
            min(feats[6], 255),
            min(feats[7], 255),
        ))

    if len(feature_bytes) < 50:
        return None

    try:
        h = _tlsh.hash(bytes(feature_bytes))
        return h if h and h != 'TNULL' else None
    except Exception:
        return None


# ---------------------------------------------------------------------------
# Task 1.8: WL-MinHash
# ---------------------------------------------------------------------------

# Pre-computed seeds for MinHash permutations.
NUM_WL_MINHASH_PERMS = 128
_WL_MINHASH_SEEDS = list(range(NUM_WL_MINHASH_PERMS))  # Seeds 0..127


def compute_wl_minhash(
    successors: list[list[int]],
    predecessors: list[list[int]],
    bb_features: list[list[int]],
    n: int,
    iterations: int = 3,
) -> list[int]:
    """
    Weisfeiler-Leman MinHash for fuzzy topology similarity.

    Initial labels: mmh3 hash of per-block ACFG feature tuple (content-aware).
    WL refinement: incorporate sorted neighbor labels at each iteration.
    MinHash: 128-permutation signature over shingle set.

    Returns list of 128 uint8 values, or [255]*128 sentinel for empty functions.
    """
    if n == 0:
        return [255] * NUM_WL_MINHASH_PERMS

    # Initial labels: hash of instruction category tuple per block
    labels = []
    for i in range(n):
        feats = bb_features[i] if i < len(bb_features) else [0] * 8
        # mmh3 with seed=0 for initial labels
        label = mmh3.hash(str(tuple(feats)), 0) & 0xFFFFFFFF
        labels.append(label)

    # Collect shingles: (iteration, label) pairs as strings for mmh3
    shingles: set[str] = set()

    # Iteration 0: individual block labels
    for label in labels:
        shingles.add(f"0:{label}")

    # WL iterations: refine labels by neighborhood aggregation
    for iteration in range(1, iterations + 1):
        new_labels = []
        for i in range(n):
            succ_labels = tuple(sorted(labels[s] for s in successors[i]))
            pred_labels = tuple(sorted(labels[p] for p in predecessors[i]))
            composite = f"{labels[i]}|{succ_labels}|{pred_labels}"
            new_label = mmh3.hash(composite, 0) & 0xFFFFFFFF
            new_labels.append(new_label)
            shingles.add(f"{iteration}:{new_label}")
        labels = new_labels

    if not shingles:
        return [255] * NUM_WL_MINHASH_PERMS

    # Compute MinHash signature using mmh3 with different seeds
    shingle_list = list(shingles)
    signature = []
    for seed in _WL_MINHASH_SEEDS:
        min_val = 0xFFFFFFFF
        for s in shingle_list:
            h = mmh3.hash(s, seed) & 0xFFFFFFFF
            if h < min_val:
                min_val = h
        # Compress to uint8 for storage
        signature.append(min_val & 0xFF)

    return signature


# ---------------------------------------------------------------------------
# Task 1.9: Packed Adjacency
# ---------------------------------------------------------------------------

def pack_adjacency(successors: list[list[int]]) -> list[int]:
    """
    Pack CFG edges as Array(UInt32).
    Each UInt32 = (source_index << 16) | target_index.
    Supports up to 65,535 blocks per function.
    """
    edges = []
    for src, targets in enumerate(successors):
        for tgt in targets:
            if src < 65536 and tgt < 65536:
                edges.append((src << 16) | tgt)
    return edges