Manuel Davy

50 papers A 2B 4C 3Misc 7Journal 18Unranked 16
YearRankTypeTitle / Venue / Authors
2025 conf
EvoApplications (2)
Agathe Métaireau, Clarisse Dhaenens, Nadarajen Veerapen, Manuel Davy
2022 C conf
ICORES
Agathe Métaireau, Rabin Kumar Sahu, Simon Delecourt, Alexandre Gerussi, Manuel Davy
2020 C conf
ICORES
Rabin Kumar Sahu, Clarisse Dhaenens, Nadarajen Veerapen, Manuel Davy
2017 J jnl
J. Mach. Learn. Res.
François Caron, Willie Neiswanger, Frank D. Wood, Arnaud Doucet, Manuel Davy
2013 J jnl
IEEE Trans. Signal Process.
Richard Geoffrey Everitt, Christophe Andrieu, Manuel Davy
2012 Misc conf
ICASSP
Asma Rabaoui, Hachem Kadri, Manuel Davy
2010 J jnl
IEEE Trans. Pattern Anal. Mach. Intell.
Manuel Davy, Jean-Yves Tourneret
2010 A conf
AISTATS
Hachem Kadri, Emmanuel Duflos, Philippe Preux, Stéphane Canu, Manuel Davy
2008 J jnl
IEEE Trans. Signal Process.
Francois Caron, Manuel Davy, Arnaud Doucet, Emmanuel Duflos, Philippe Vanheeghe
2008 J jnl
Stat. Comput.
Adam M. Johansen, Arnaud Doucet, Manuel Davy
2008 conf
EUSIPCO
Hachem Kadri, Manuel Davy, Asma Rabaoui, Zied Lachiri, Noureddine Ellouze
2008 J jnl
Speech Commun.
Belkacem Fergani, Manuel Davy, Amrane Houacine
2008 J jnl
IEEE Trans. Inf. Forensics Secur.
Asma Rabaoui, Manuel Davy, Stéphane Rossignol, Zied Ellouze
2007 B conf
ESANN
Manuel Loth, Philippe Preux, Manuel Davy
2007 conf
ICASSP (3)
Edmund S. Jackson, Manuel Davy, Arnaud Doucet, William J. Fitzgerald
2007 conf
ICASSP (2)
Frédéric Desobry, Manuel Davy, William J. Fitzgerald
2007 A conf
UAI
Francois Caron, Manuel Davy, Arnaud Doucet
2007 B conf
AVSS
Asma Rabaoui, Manuel Davy, Stéphane Rossignol, Zied Lachiri, Noureddine Ellouze
2007 J jnl
IEEE Trans. Speech Audio Process.
Corentin Dubois, Manuel Davy
2007 J jnl
IEEE Trans. Signal Process.
Nicolas Dobigeon, Jean-Yves Tourneret, Manuel Davy
2007 B conf
ESANN
Alain Rakotomamonjy, Manuel Davy
2007 J jnl
IEEE Trans. Signal Process.
Francois Caron, Manuel Davy, Emmanuel Duflos, Philippe Vanheeghe
2006 J jnl
IEEE Trans. Geosci. Remote. Sens.
Delphine Potin, Philippe Vanheeghe, Emmanuel Duflos, Manuel Davy
2006 J jnl
Signal Process.
Manuel Davy, Frédéric Desobry, Arthur Gretton, Christian Doncarli
2006 C conf
FUSION
Francois Caron, Manuel Davy, Arnaud Doucet, Emmanuel Duflos, Philippe Vanheeghe
2006 conf
ICASSP (3)
Manuel Davy, Frédéric Desobry, Stéphane Canu
2006 conf
ICASSP (3)
Nicolas Dobigeon, Jean-Yves Tourneret, Manuel Davy
2006 conf
ICASSP (3)
Adam M. Johansen, Arnaud Doucet, Manuel Davy
2006 conf
EUSIPCO
Belkacem Fergani, Manuel Davy, Amrane Houacine
2005 B conf
ESANN
Frédéric Desobry, Manuel Davy, William J. Fitzgerald
2005 J jnl
IEEE Trans. Signal Process.
Frédéric Desobry, Manuel Davy, Christian Doncarli
2005 conf
ICASSP (4)
Corentin Dubois, Manuel Davy, Jérôme Idier
2004 conf
ICASSP (5)
Frédéric Desobry, Manuel Davy
2004 conf
ICASSP (2)
Manuel Davy, Jérôme Idier
2003 J jnl
IEEE Signal Process. Lett.
Manuel Davy, Arnaud Doucet
2003 J jnl
IEEE Trans. Signal Process.
Christophe Andrieu, Manuel Davy, Arnaud Doucet
2003 conf
ICASSP (4)
Frédéric Desobry, Manuel Davy
2003 conf
ICASSP (6)
Hélène Cottereau, Jean-Marie Piasco, Christian Doncarli, Manuel Davy
2002 conf
EUSIPCO
Christophe Andrieu, Manuel Davy, Arnaud Doucet
2002 Misc conf
ICASSP
Simon J. Godsill, Manuel Davy
2002 J jnl
IEEE Trans. Signal Process.
Manuel Davy, Christian Doncarli, Jean-Yves Tourneret
2002 Misc conf
ICASSP
Manuel Davy, Simon J. Godsill
2002 Misc conf
ICASSP
Christophe Andrieu, Manuel Davy, Arnaud Doucet
2002 Misc conf
ICASSP
Christian Doncarli, Manuel Davy, Jean-Yves Tourneret
2002 J jnl
IEEE Signal Process. Lett.
Manuel Davy, Arthur Gretton, Arnaud Doucet, Peter J. W. Rayner
2001 J jnl
IEEE Signal Process. Lett.
Manuel Davy, Christian Doncarli, Gloria Faye Boudreaux-Bartels
2001 Misc conf
ICASSP
Manuel Davy, Hélène Cottereau, Christian Doncarli
2000 Misc conf
ICASSP
Manuel Davy, Christian Doncarli, Jean-Yves Tourneret
2000 conf
EUSIPCO
Hélène Cottereau, Manuel Davy, Christian Doncarli, Nadine Martin
1998 conf
EUSIPCO
Manuel Davy, Benoit Leprettre, Christian Doncarli, Nadine Martin
redb/extractors/js_extractors/js_deobfuscation.py
← Index redb/extractors/js_extractors/js_deobfuscation.py python
import hashlib
import inspect
import re
from datetime import datetime, timezone
from typing import Any

from redb.extractors.enum import Tag
from redb.extractors.js_extractor import JSExtractor
from redb.extractors.js_extractors.js_patterns import PATTERNS

# String literals of 4+ characters; only used by the deobfuscation diff to count
# strings revealed after deobfuscation. Compiled once at module load.
_STRING_LITERAL_4PLUS_RE = re.compile(r"[\"\']([^\"\']{4,})[\"\']")


class JSDeobfuscationExtractor(JSExtractor):
    """Compute pre/post-deobfuscation metrics for a JS sample.

    The actual deobfuscation pass (external tool with jsbeautifier fallback)
    lives on `JSContext.deobfuscated` and is cached per sample, so any other
    extractor that needs the deobfuscated text reads the same value without
    re-running the subprocess. Configure the external tool via env vars:
        JS_DEOBFUSCATOR_PATH    Path or name (default: webcrack)
        JS_DEOBFUSCATE_TIMEOUT  Seconds (default: 60)
    """

    def __init__(
        self, filepath, log, exporters=None, index_prefix=None,
        known_benign=False, known_malicious=False, source=None, context=None,
    ):
        super().__init__(
            filepath, log, exporters, index_prefix,
            known_benign, known_malicious, source, context=context,
        )
        self.deobfuscation_result = None
        self.log.debug(inspect.currentframe().f_code.co_name)

    def tag(self):
        return Tag.JS_DEOBFUSCATION.value

    def extract(self):
        src = self.js_source
        if not src:
            return None

        deobfuscated, deobfuscator_used = self._context.deobfuscated
        if deobfuscated is None:
            return None

        original_size = len(src)
        original_entropy = self._context.text_entropy
        deobfuscated_size = len(deobfuscated)
        deobfuscated_entropy = self._calculate_text_entropy(deobfuscated)
        size_change_ratio = round(deobfuscated_size / original_size, 4) if original_size else 0.0

        # Strings revealed by deobfuscation: matched literals are extracted from
        # both versions and the set difference is the count of "new" strings.
        original_strings = set(_STRING_LITERAL_4PLUS_RE.findall(src))
        deobfuscated_strings = set(_STRING_LITERAL_4PLUS_RE.findall(deobfuscated))
        new_strings = deobfuscated_strings - original_strings

        # Suspicious APIs revealed by deobfuscation. Both sides of the diff
        # come from JSContext caches: the raw scan is computed once for the
        # whole pipeline; the deobfuscated scan is computed once and reused
        # by JSSuspiciousAPIsExtractor's revealed_by_deobf rows.
        original_apis = {n for n in self._context.scan if n in PATTERNS}
        deobfuscated_apis = set(self._context.scan_deobfuscated)
        new_apis = deobfuscated_apis - original_apis

        deobfuscated_sha256 = hashlib.sha256(deobfuscated.encode('utf-8')).hexdigest()

        self.deobfuscation_result = {
            'deobfuscator_used': deobfuscator_used,
            'deobfuscation_successful': True,
            'original_size': original_size,
            'deobfuscated_size': deobfuscated_size,
            'size_change_ratio': size_change_ratio,
            'original_entropy': original_entropy,
            'deobfuscated_entropy': deobfuscated_entropy,
            'new_strings_found': len(new_strings),
            'new_apis_found': len(new_apis),
            'deobfuscated_sha256': deobfuscated_sha256,
        }
        return self.deobfuscation_result

    def prepare_export_data(self, exporter_type: str) -> Any:
        if exporter_type == "ClickHouseExporter":
            if not self.deobfuscation_result:
                return None

            r = self.deobfuscation_result
            current_time = datetime.now(timezone.utc)
            data = [[
                self.sha256,
                r['deobfuscator_used'],
                int(r['deobfuscation_successful']),
                r['original_size'],
                r['deobfuscated_size'],
                r['size_change_ratio'],
                r['original_entropy'],
                r['deobfuscated_entropy'],
                r['new_strings_found'],
                r['new_apis_found'],
                r['deobfuscated_sha256'],
                current_time,
            ]]

            column_names = [
                "sha256", "deobfuscator_used", "deobfuscation_successful",
                "original_size", "deobfuscated_size", "size_change_ratio",
                "original_entropy", "deobfuscated_entropy",
                "new_strings_found", "new_apis_found",
                "deobfuscated_sha256", "analysis_date",
            ]

            column_type_names = [
                "FixedString(64)", "LowCardinality(String)", "UInt8",
                "UInt64", "UInt64", "Float64",
                "Float64", "Float64",
                "UInt32", "UInt32",
                "FixedString(64)", "DateTime64(3, 'UTC')",
            ]

            return (data, column_names, column_type_names)

    def get_clickhouse_table(self) -> str:
        return "redb_js_deobfuscation"