Vasilis Vassalos

79 papers A* 11A 1B 7C 2Journal 21Unranked 29
YearRankTypeTitle / Venue / Authors
2024 J jnl
Mach. Learn.
Petros Boulieris, John Pavlopoulos, Alexandros Xenos, Vasilis Vassalos
2021 J jnl
IEEE Trans. Knowl. Data Eng.
Nantia Makrynioti, Vasilis Vassalos
2021 conf
DEEM@SIGMOD
Nantia Makrynioti, Ruy Ley-Wild, Vasilis Vassalos
2020 J jnl
Theory Comput. Syst.
Dimitris Fotakis, Ioannis Milis, Orestis Papadigenopoulos, Vasilis Vassalos, Georgios Zois
2019 J jnl
CoRR
Nantia Makrynioti, Vasilis Vassalos
2019 C conf
IDEAS
Admir Demiraj, Kostis Karozos, Iosif Spartalis, Vasilis Vassalos
2019 B conf
RuleML+RR
Despoina Trivela, Giorgos Stoilos, Vasilis Vassalos
2019 J jnl
CoRR
Nantia Makrynioti, Ruy Ley-Wild, Vasilis Vassalos
2018 A* conf
AAAI
Despoina Trivela, Giorgos Stoilos, Vasilis Vassalos
2018 ch.
Encyclopedia of Database Systems (2nd ed.)
Vasilis Vassalos
2018 conf
SWH@ISWC
Kostis Karozos, Iosif Spartalis, Artem Tsikiridis, Despoina Trivela, Vasilis Vassalos
2018 conf
DEEM@SIGMOD
Nantia Makrynioti, Nikolaos Vasiloglou, Emir Pasalic, Vasilis Vassalos
2018 conf
Description Logics
Despoina Trivela, Giorgos Stoilos, Vasilis Vassalos
2018 ch.
Encyclopedia of Database Systems (2nd ed.)
Denilson Barbosa, Philip Bohannon, Juliana Freire, Carl-Christian Kanne, Ioana Manolescu, Vasilis Vassalos, Masatoshi Yoshikawa
2018 ch.
Encyclopedia of Database Systems (2nd ed.)
Ioana Manolescu, Yannis Papakonstantinou, Vasilis Vassalos
2017 conf
DILS
Giorgos Stoilos, Despoina Trivela, Vasilis Vassalos, Tassos Venetis, Yannis Xarchakos
2017 J jnl
Int. J. Big Data Intell.
Nantia Makrynioti, Andreas Grivas, Christos Sardianos, Nikos Tsirakis, Iraklis Varlamis, Vasilis Vassalos, Vassilis Poulopoulos, Panagiotis Tsantilas
2017 J jnl
Int. J. Artif. Intell. Tools
Tassos Venetis, Giorgos Stoilos, Vasilis Vassalos
2016 conf
OTM Conferences
Xristos Mallios, Vasilis Vassalos, Tassos Venetis, Akrivi Vlachou
2016 conf
WONS
Georgios Zois, Antonios Michaloliakos, Konstantinos Psounis, Vasilis Vassalos, Ioannis Mourtos
2016 B conf
ICTAI
Tassos Venetis, Giorgos Stoilos, Vasilis Vassalos
2016 conf
Euro-Par
Dimitris Fotakis, Ioannis Milis, Orestis Papadigenopoulos, Vasilis Vassalos, Georgios Zois
2016 J jnl
CoRR
Dimitris Fotakis, Ioannis Milis, Orestis Papadigenopoulos, Vasilis Vassalos, Georgios Zois
2016 conf
EDBT/ICDT Workshops
Nantia Makrynioti, Vasilis Vassalos
2015 conf
DILS
Tassos Venetis, Vasilis Vassalos
2015 B conf
TPDL
Katerina Gkirtzou, Kostis Karozos, Vasilis Vassalos, Theodore Dalamagas
2015 B conf
DaWaK
Nantia Makrynioti, Vasilis Vassalos
2015 conf
BIH
Tassos Venetis, Anastasia Ailamaki, Thomas Heinis, Manos Karpathiotakis, Ferath Kherif, Alexis Mitelpunkt, Vasilis Vassalos
2015 C conf
ADBIS
Nikolaos Bozovic, Vasilis Vassalos
2013 J jnl
Inf. Syst.
Nikos Giatrakos, Yannis Kotidis, Antonios Deligiannakis, Vasilis Vassalos, Yannis Theodoridis
2012 conf
SIGMOD Conference
Asterios Katsifodimos, Ioana Manolescu, Vasilis Vassalos
2011 B conf
EDBT
Haris Georgiadis, Minas Charalambides, Vasilis Vassalos
2011 A* conf
ICDE
Ioana Manolescu, Konstantinos Karanasos, Vasilis Vassalos, Spyros Zoupanos
2011 conf
DEXA (2)
Pantelis Aravogliadis, Vasilis Vassalos
2011 ed.
WebDB
Amélie Marian, Vasilis Vassalos
2011 J jnl
ACM Trans. Database Syst.
Bogdan Cautis, Alin Deutsch, Nicola Onose, Vasilis Vassalos
2011 conf
SIGMOD Conference
Nathan Bales, Alin Deutsch, Vasilis Vassalos
2011 A* conf
ICDE
Mihaela A. Bornea, Antonios Deligiannakis, Yannis Kotidis, Vasilis Vassalos
2010 J jnl
IEEE Trans. Knowl. Data Eng.
Mihaela A. Bornea, Vasilis Vassalos, Yannis Kotidis, Antonios Deligiannakis
2010 B conf
EDBT
Haris Georgiadis, Minas Charalambides, Vasilis Vassalos
2010 A* conf
ICDE
Yannis Katsis, Alin Deutsch, Yannis Papakonstantinou, Vasilis Vassalos
2010 conf
SIGMOD Conference
Nikos Giatrakos, Yannis Kotidis, Antonios Deligiannakis, Vasilis Vassalos, Yannis Theodoridis
2009 J jnl
Peer-to-Peer Netw. Appl.
Dimitrios K. Vassilakis, Vasilis Vassalos
2009 A* conf
ICDE
Antonios Deligiannakis, Yannis Kotidis, Vasilis Vassalos, Vassilis Stoumpos, Alex Delis
2009 ch.
Encyclopedia of Database Systems
Vasilis Vassalos
2009 conf
SIGMOD Conference
Haris Georgiadis, Minas Charalambides, Vasilis Vassalos
2009 A* conf
ICDE
Mihaela A. Bornea, Vasilis Vassalos, Yannis Kotidis, Antonios Deligiannakis
2009 J jnl
Proc. VLDB Endow.
Bogdan Cautis, Alin Deutsch, Nicola Onose, Vasilis Vassalos
2009 ch.
Encyclopedia of Database Systems
Denilson Barbosa, Philip Bohannon, Juliana Freire, Carl-Christian Kanne, Ioana Manolescu, Vasilis Vassalos, Masatoshi Yoshikawa
2009 ch.
Encyclopedia of Database Systems
Ioana Manolescu, Yannis Papakonstantinou, Vasilis Vassalos
2008 conf
Uncertainty Management in Information Systems
Anish Das Sarma, Ander de Keijzer, Amol Deshpande, Peter J. Haas, Ihab F. Ilyas, Christoph Koch, Thomas Neumann, Dan Olteanu, Martin Theobald, Vasilis Vassalos
2008 conf
ICDE Workshops
Iraklis Varlamis, Vasilis Vassalos, Antonis Palaios
2008 A* conf
ICDE
Antonios Deligiannakis, Vassilis Stoumpos, Yannis Kotidis, Vasilis Vassalos, Alex Delis
2008 conf
ICDE Workshops
Nikolaos Bozovic, Vasilis Vassalos
2007 conf
Peer-to-Peer Computing
Dimitrios K. Vassilakis, Vasilis Vassalos
2007 conf
MobiDE
Yannis Kotidis, Vasilis Vassalos, Antonios Deligiannakis, Vassilis Stoumpos, Alex Delis
2007 conf
SIGMOD Conference
Haris Georgiadis, Vasilis Vassalos
2006 B conf
EDBT
Haris Georgiadis, Vasilis Vassalos
2006 A* conf
ICDE
Václav Lín, Vasilis Vassalos, Prodromos Malakasiotis
2005 J jnl
ACM Trans. Internet Techn.
Vasilis Vassalos
2005 conf
MobiDE
Constantinos V. Katsaros, Ioannis L. Niarhos, Vasilis Vassalos
2005 J jnl
ACM Trans. Internet Techn.
Michalis Petropoulos, Yannis Papakonstantinou, Vasilis Vassalos
2005 conf
Semantic Interoperability and Integration
Vasilis Vassalos
2004 J jnl
SIGMOD Rec.
Kenneth A. Ross, Peter Boncz, Ihab F. Ilyas, Volker Markl, Vasilis Vassalos
2004 conf
EDBT Workshops
Minos N. Garofalakis, Ioana Manolescu, Marco Mesiti, George A. Mihaila, Ralf Schenkel, Bhavani Thuraisingham, Vasilis Vassalos
2003 J jnl
Data Knowl. Eng.
Yannis Papakonstantinou, Vinayak R. Borkar, Maxim Orgiyan, Konstantinos Stathatos, Lucian Suta, Vasilis Vassalos, Pavel E. Velikhov
2002 J jnl
IEEE Data Eng. Bull.
Yannis Papakonstantinou, Vasilis Vassalos
2002 J jnl
Comput. Networks
Michalis Petropoulos, Yannis Papakonstantinou, Vasilis Vassalos
2002 conf
SIGMOD Conference
Yannis Papakonstantinou, Michalis Petropoulos, Vasilis Vassalos
2001 A conf
CIKM
Yannis Papakonstantinou, Vasilis Vassalos
2001 A* conf
WWW
Michalis Petropoulos, Vasilis Vassalos, Yannis Papakonstantinou
2000 J jnl
J. Log. Program.
Vasilis Vassalos, Yannis Papakonstantinou
2000
Vasilis Vassalos
1999 conf
SIGMOD Conference
Yannis Papakonstantinou, Vasilis Vassalos
1998 conf
SIGMOD Conference
Chen Li, Ramana Yerneni, Vasilis Vassalos, Hector Garcia-Molina, Yannis Papakonstantinou, Jeffrey D. Ullman, Murty Valiveti
1998 A* conf
VLDB
Serge Abiteboul, Jason McHugh, Michael Rys, Vasilis Vassalos, Janet L. Wiener
1997 A* conf
VLDB
Vasilis Vassalos, Yannis Papakonstantinou
1997 conf
SIGMOD Conference
Joachim Hammer, Hector Garcia-Molina, Svetlozar Nestorov, Ramana Yerneni, Markus M. Breunig, Vasilis Vassalos
1997 J jnl
J. Intell. Inf. Syst.
Hector Garcia-Molina, Yannis Papakonstantinou, Dallan Quass, Anand Rajaraman, Yehoshua Sagiv, Jeffrey D. Ullman, Vasilis Vassalos, Jennifer Widom
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