Ilias Dimitriadis

25 papers A 1B 2C 2Journal 14Unranked 6
YearRankTypeTitle / Venue / Authors
2026 J jnl
J. Comput. Soc. Sci.
Pavlos Sermpezis, Stelios Karamanidis, Eva Paraschou, Ilias Dimitriadis, Sofia Yfantidou, Filitsa-Ioanna Kouskouveli, Thanasis Troboukis, Kelly Kiki, Antonis Galanopoulos, Athena Vakali
2025 J jnl
CoRR
Pavlos Sermpezis, Stelios Karamanidis, Eva Paraschou, Ilias Dimitriadis, Sofia Yfantidou, Filitsa-Ioanna Kouskouveli, Thanasis Troboukis, Kelly Kiki, Antonis Galanopoulos, Athena Vakali
2025 J jnl
CoRR
Athena Vakali, Ilias Dimitriadis
2025 A conf
IMC
Vasilis Andritsoudis, Pavlos Sermpezis, Ilias Dimitriadis, Athena Vakali
2025 J jnl
CoRR
Vasilis Andritsoudis, Pavlos Sermpezis, Ilias Dimitriadis, Athena Vakali
2024 J jnl
Data Knowl. Eng.
Ilias Dimitriadis, George Dialektakis, Athena Vakali
2024 J jnl
CoRR
Thanasis Troboukis, Kelly Kiki, Antonis Galanopoulos, Pavlos Sermpezis, Stelios Karamanidis, Ilias Dimitriadis, Athena Vakali
2023 J jnl
CoRR
Ilias Dimitriadis, Dimitrios Panteleimon Giakatos, Stelios Karamanidis, Pavlos Sermpezis, Kelly Kiki, Athena Vakali
2023 conf
ICIMTH
Paraskevas Lagakis, Evangelos Logaras, Antonis Billis, Evangelos T. Stamkopoulos, Ilias Dimitriadis, Athena Vakali, Panagiotis D. Bamidis
2023 conf
IISA
Efstratios Voulgaris, Ilias Dimitriadis, Dimitrios Panteleimon Giakatos, Athena Vakali, Athanasios Papakonstantinou, Dimitris Chatgigiannis
2023 J jnl
CoRR
Efstratios Voulgaris, Ilias Dimitriadis, Dimitrios Panteleimon Giakatos, Athena Vakali, Athanasios Papakonstantinou, Dimitris Chatzigiannis
2023 C conf
BSN
Antonios Billis, Paraskevas Lagakis, George Petridis, Ilias Dimitriadis, Anastasios Gounaris, Athena Vakali, Zoe Valero-Ramon, Farhad Abtahi, Fernando Seoane, Panagiotis D. Bamidis
2023 conf
MIE
Evangelos Logaras, Antonis Billis, Evangelos T. Stamkopoulos, Paraskevas Lagakis, Ilias Dimitriadis, Athena Vakali, Panagiotis D. Bamidis
2022 J jnl
CoRR
George Dialektakis, Ilias Dimitriadis, Athena Vakali
2022 J jnl
ACM Trans. Web
Dimitra Karanatsiou, Pavlos Sermpezis, Dritjon Gruda, Konstantinos Kafetsios, Ilias Dimitriadis, Athena Vakali
2022 J jnl
Soc. Netw. Anal. Min.
Ilias Dimitriadis, Ioannis Mavroudopoulos, Styliani Kyrama, Theodoros Toliopoulos, Anastasios Gounaris, Athena Vakali, Antonis Billis, Panagiotis D. Bamidis
2022 J jnl
World Wide Web
Ilias Dimitriadis, Marinos Poiitis, Christos Faloutsos, Athena Vakali
2021 conf
MedInfo
Zoe Valero-Ramon, Pedro Louro, Luis Irio, Ilias Dimitriadis, Marinos Poiitis, Theodoros Toliopoulos, Paraskevas Lagakis, Georgios Petridis, Nikolaos Papachristou, Francisco J. Núñez-Benjumea, Santiago Hors-Fraile, Athena Vakali, Anastasios Gounaris, Dany Shapiro, Juan-Carlos Naranjo, Sofia Levva, Antonis Billis, Vicente Traver, Panagiotis D. Bamidis
2021 J jnl
J. Vis.
Konstantinos Kagkelidis, Ilias Dimitriadis, Athena Vakali
2020 C conf
MEDES
Maria Kouvela, Ilias Dimitriadis, Athena Vakali
2020 J jnl
CoRR
Dimitra Karanatsiou, Pavlos Sermpezis, Jon Gruda, Konstantinos Kafetsios, Ilias Dimitriadis, Athena Vakali
2020 conf
WIMS
Ilias Dimitriadis, Marinos Poiitis, Christos Faloutsos, Athena Vakali
2019 conf
WI (Companion)
Ilias Dimitriadis, Vasileios G. Psomiadis, Athena Vakali
2018 B conf
SMARTCOMP
Alexandros Tsilingiris, Ilias Dimitriadis, Athena Vakali, Georgios Andreadis
2018 B conf
WI
Konstantinos Platis, Ilias Dimitriadis, Athena Vakali
redb/extractors/js_extractors/js_deobfuscator.py
← Index redb/extractors/js_extractors/js_deobfuscator.py python
"""Subprocess-driven JavaScript deobfuscator with jsbeautifier fallback.

Owns the heavy lifting that was previously embedded inside
`JSDeobfuscationExtractor` (`_run_deobfuscator` + `_try_jsbeautifier`). Exposed
as a single module-level entry point `deobfuscate(source, log)` so it can be
called from `JSContext.deobfuscated` (cached per sample) without dragging
extractor state through the call.

Configuration (env vars):
    JS_DEOBFUSCATOR_PATH    Path or name of the external tool (default: webcrack).
    JS_DEOBFUSCATE_TIMEOUT  Seconds before the external tool is killed
                            (process-group SIGTERM, then SIGKILL). Default: 60.

If the external tool produces non-empty output and exits 0, that wins. Otherwise
the source is run through jsbeautifier (which only normalises formatting, but
already exposes strings hidden by minification). If neither path produces
output, returns (None, None).

`FileNotFoundError` for the external tool is treated as routine — the analysis
server is either provisioned with the tool or it isn't — and demoted to a
debug-level log.
"""

import os
import signal
import subprocess
import tempfile
from typing import Optional, Tuple

DEFAULT_DEOBFUSCATOR = "webcrack"
DEFAULT_TIMEOUT_SECS = 60


def _run_external(
    source: str, deobfuscator_path: str, timeout: int, log
) -> Tuple[Optional[str], int]:
    """Run the configured external deobfuscator over `source` and capture stdout.

    Returns (text, returncode). `text` is `None` and `returncode` is `-1` when
    the binary is missing, the run timed out, or any other unexpected failure
    occurred. Missing-binary is logged at debug; timeouts and unexpected errors
    surface at warning/error.
    """
    try:
        with tempfile.NamedTemporaryFile(
            suffix=".js", mode="w", delete=False, encoding="utf-8"
        ) as tmp:
            tmp.write(source)
            tmp_path = tmp.name

        try:
            process = subprocess.Popen(
                [deobfuscator_path, tmp_path],
                stdout=subprocess.PIPE,
                stderr=subprocess.PIPE,
                preexec_fn=os.setsid,
            )

            try:
                stdout, _ = process.communicate(timeout=timeout)
                return stdout.decode("utf-8", errors="replace"), process.returncode
            except subprocess.TimeoutExpired:
                # Kill the entire process group so spawned helpers (e.g. node
                # subprocesses webcrack itself launches) get cleaned up too.
                try:
                    os.killpg(os.getpgid(process.pid), signal.SIGTERM)
                    process.wait(timeout=5)
                except Exception:
                    try:
                        os.killpg(os.getpgid(process.pid), signal.SIGKILL)
                    except Exception:
                        pass
                log.warning(f"Deobfuscation timed out after {timeout}s")
                return None, -1
        finally:
            try:
                os.unlink(tmp_path)
            except Exception:
                pass
    except FileNotFoundError:
        log.debug(f"Deobfuscator binary not found at {deobfuscator_path}")
        return None, -1
    except Exception as e:
        log.error(f"Error running deobfuscator: {e}")
        return None, -1


def _try_jsbeautifier(source: str, log) -> Tuple[Optional[str], Optional[str]]:
    """Fallback path: format the source with jsbeautifier. Returns
    `(text, "jsbeautifier")` or `(None, None)` if jsbeautifier isn't installed
    or the call raised."""
    try:
        import jsbeautifier
        opts = jsbeautifier.default_options()
        opts.indent_size = 2
        return jsbeautifier.beautify(source, opts), "jsbeautifier"
    except ImportError:
        log.debug("jsbeautifier not available")
        return None, None
    except Exception as e:
        log.warning(f"jsbeautifier failed: {e}")
        return None, None


def deobfuscate(source: str, log) -> Tuple[Optional[str], Optional[str]]:
    """Run the configured external deobfuscator, falling back to jsbeautifier.

    Returns `(text, normalizer_used)` on success, or `(None, None)` when neither
    path produced non-empty output. `normalizer_used` is the basename of the
    external tool (e.g. `"webcrack"`) or the literal `"jsbeautifier"`.
    """
    if not source:
        return None, None

    deobfuscator_path = os.getenv("JS_DEOBFUSCATOR_PATH", DEFAULT_DEOBFUSCATOR)
    timeout = int(os.getenv("JS_DEOBFUSCATE_TIMEOUT", str(DEFAULT_TIMEOUT_SECS)))

    text, returncode = _run_external(source, deobfuscator_path, timeout, log)
    if text and returncode == 0 and text.strip():
        return text, os.path.basename(deobfuscator_path)

    return _try_jsbeautifier(source, log)