Chadi Abou-Rjeily

93 papers B 14Misc 1Journal 68Unranked 10
YearRankTypeTitle / Venue / Authors
2025 J jnl
IEEE Open J. Commun. Soc.
Rania Minkara, Chadi Abou-Rjeily
2025 conf
MENACOMM
Chadi Abou-Rjeily, Rania Minkara
2025 J jnl
IEEE Access
Chadi Abou-Rjeily
2024 J jnl
IEEE Wirel. Commun. Lett.
Chadi Abou-Rjeily
2024 J jnl
IEEE Access
Chadi Abou-Rjeily
2024 J jnl
IEEE Wirel. Commun. Lett.
Chadi Abou-Rjeily
2023 J jnl
Phys. Commun.
Chadi Abou-Rjeily, Sawsan El-Zahr
2022 J jnl
IEEE Trans. Commun.
Sawsan El-Zahr, Chadi Abou-Rjeily
2022 J jnl
IEEE Trans. Wirel. Commun.
Chadi Abou-Rjeily
2022 J jnl
Comput. Networks
Nadine Abbas, Sanaa Sharafeddine, Azzam Mourad, Chadi Abou-Rjeily, Wissam Fawaz
2022 J jnl
Ann. des Télécommunications
Haidar Taki, Chadi Abou-Rjeily
2022 J jnl
IEEE Commun. Lett.
Sawsan El-Zahr, Chadi Abou-Rjeily
2022 J jnl
IEEE Trans. Netw. Serv. Manag.
Nadine Abbas, Wissam Fawaz, Sanaa Sharafeddine, Azzam Mourad, Chadi Abou-Rjeily
2022 J jnl
Telecommun. Syst.
Haidar Taki, Chadi Abou-Rjeily
2021 J jnl
IEEE Wirel. Commun. Lett.
Thanh-Dat Le, Georges Kaddoum, Ha-Vu Tran, Chadi Abou-Rjeily
2021 J jnl
Phys. Commun.
Mirna El Rajab, Chadi Abou-Rjeily
2021 J jnl
IEEE Trans. Wirel. Commun.
Chadi Abou-Rjeily
2021 J jnl
IEEE Trans. Wirel. Commun.
Chadi Abou-Rjeily, Wissam Fawaz
2021 J jnl
IEEE Trans. Wirel. Commun.
Sawsan El-Zahr, Chadi Abou-Rjeily
2020 J jnl
IET Commun.
Mirna El Rajab, Chadi Abou-Rjeily, Ronald Kfouri
2020 J jnl
IEEE Commun. Mag.
Ha-Vu Tran, Georges Kaddoum, Chadi Abou-Rjeily
2020 J jnl
CoRR
Ha-Vu Tran, Georges Kaddoum, Chadi Abou-Rjeily
2020 J jnl
IEEE Trans. Wirel. Commun.
Chadi Abou-Rjeily, Georges Kaddoum
2020 J jnl
IEEE Commun. Lett.
Ha-Vu Tran, Georges Kaddoum, Hany Elgala, Chadi Abou-Rjeily, Hemani Kaushal
2020 J jnl
CoRR
Ha-Vu Tran, Georges Kaddoum, Hany Elgala, Chadi Abou-Rjeily, Hemani Kaushal
2020 B conf
IWCMC
Chadi Abou-Rjeily, Azzam Mourad
2020 J jnl
IEEE Wirel. Commun. Lett.
Chadi Abou-Rjeily
2020 J jnl
IEEE Commun. Lett.
Chadi Abou-Rjeily
2020 J jnl
IEEE Trans. Educ.
Mohammad Al-Abbas, Wissam Fawaz, Raymond Ghajar, Chadi Abou-Rjeily, Iyad Ouaiss, Zahi Nakad, George E. Nasr, Samer S. Saab
2020 B conf
IWCMC
Rania Islambouli, Zahraa Sweidan, Azzam Mourad, Chadi Abou-Rjeily
2019 conf
MENACOMM
Mirna El Rajab, Chadi Abou-Rjeily
2019 B conf
IWCMC
Chadi Abou-Rjeily, Wissam Fawaz
2019 J jnl
IEEE J. Sel. Areas Commun.
Chadi Abou-Rjeily, Georges Kaddoum
2019 J jnl
IEEE Trans. Commun.
Ha-Vu Tran, Georges Kaddoum, Panagiotis D. Diamantoulakis, Chadi Abou-Rjeily, George K. Karagiannidis
2019 J jnl
CoRR
Ha-Vu Tran, Georges Kaddoum, Panagiotis D. Diamantoulakis, Chadi Abou-Rjeily, George K. Karagiannidis
2018 J jnl
IEEE Trans. Wirel. Commun.
Chadi Abou-Rjeily, Wissam Fawaz
2018 B conf
IWCMC
Chadi Abou-Rjeily, Rami Mawla
2018 conf
MENACOMM
Mustapha Hamad, Chadi Abou-Rjeily
2018 J jnl
IET Commun.
Chadi Abou-Rjeily
2018 J jnl
IEEE Trans. Wirel. Commun.
Chadi Abou-Rjeily
2018 J jnl
IEEE Commun. Mag.
Wissam Fawaz, Chadi Abou-Rjeily, Chadi Assi
2017 B conf
IWCMC
Chadi Abou-Rjeily, Mohamad Chami
2017 J jnl
IEEE Trans. Wirel. Commun.
Chadi Abou-Rjeily, Wissam Fawaz
2017 J jnl
IEEE Trans. Wirel. Commun.
Chadi Abou-Rjeily
2017 J jnl
IET Commun.
Chadi Abou-Rjeily
2017 Misc conf
SoftCOM
Chadi Abou-Rjeily
2017 J jnl
IEEE Trans. Wirel. Commun.
Chadi Abou-Rjeily
2016 conf
CSNDSP
Chadi Abou-Rjeily
2016 J jnl
IEEE Trans. Wirel. Commun.
Chadi Abou-Rjeily, Zeina Noun
2016 J jnl
IEEE Trans. Wirel. Commun.
Chadi Abou-Rjeily
2015 B conf
IWCMC
Chadi Abou-Rjeily, Karl Fayad
2015 J jnl
IEEE Trans. Wirel. Commun.
Chadi Abou-Rjeily
2015 J jnl
IEEE J. Sel. Areas Commun.
Chadi Abou-Rjeily
2015 J jnl
IEEE Commun. Lett.
Chadi Abou-Rjeily, Alfred Abdo
2015 J jnl
IEEE Trans. Wirel. Commun.
Chadi Abou-Rjeily
2014 conf
ISWCS
Chadi Abou-Rjeily
2014 J jnl
IEEE Trans. Commun.
Chadi Abou-Rjeily, Serj Haddad
2013 J jnl
IEEE J. Sel. Areas Commun.
Chadi Abou-Rjeily
2013 J jnl
IEEE Trans. Commun.
Chadi Abou-Rjeily
2013 B conf
PIMRC
Chadi Abou-Rjeily
2012 B conf
IWCMC
Chadi Abou-Rjeily
2012 J jnl
IEEE Commun. Lett.
Chadi Abou-Rjeily
2011 J jnl
IEEE Trans. Wirel. Commun.
Chadi Abou-Rjeily
2011 J jnl
IEEE Trans. Commun.
Chadi Abou-Rjeily, Ahmad Slim
2011 conf
DICTAP (2)
Chadi Abou-Rjeily, Serj Haddad
2011 J jnl
IEEE Commun. Lett.
Chadi Abou-Rjeily
2011 J jnl
IEEE Trans. Commun.
Chadi Abou-Rjeily
2010 J jnl
IEEE Commun. Lett.
Chadi Abou-Rjeily, Mario Bkassiny
2010 conf
VTC Fall
Chadi Abou-Rjeily, Mario Bkassiny
2009 J jnl
IEEE Trans. Commun.
Chadi Abou-Rjeily, Zeina Baba
2009 J jnl
IEEE Trans. Commun.
Chadi Abou-Rjeily
2009 J jnl
Comput. Commun.
Wissam Fawaz, Timothy Sawah, Chadi Abou-Rjeily
2009 J jnl
IEEE J. Sel. Areas Commun.
Chadi Abou-Rjeily
2009 J jnl
IEEE Trans. Wirel. Commun.
Chadi Abou-Rjeily, Mario Bkassiny
2008 conf
ICC
Wissam Fawaz, Ken Chen, Zahi Nakad, Chadi Abou-Rjeily
2008 B conf
PIMRC
Chadi Abou-Rjeily, Georges El-Howayeck
2008 B conf
PIMRC
Chadi Abou-Rjeily, Mario Bkassiny
2008 J jnl
IEEE Commun. Lett.
Chadi Abou-Rjeily, Wissam Fawaz
2008 J jnl
IEEE Trans. Commun.
Chadi Abou-Rjeily, Norbert Daniele, Jean-Claude Belfiore
2008 J jnl
IEEE J. Sel. Areas Commun.
Chadi Abou-Rjeily, Wissam Fawaz
2007 B conf
PIMRC
Chadi Abou-Rjeily
2007 conf
VTC Spring
Chadi Abou-Rjeily, Jean-Claude Belfiore
2007 J jnl
IEEE Commun. Lett.
Chadi Abou-Rjeily, Jean-Claude Belfiore
2007 J jnl
IEEE Commun. Lett.
Wissam Fawaz, Ken Chen, Chadi Abou-Rjeily
2007 J jnl
Wirel. Pers. Commun.
Chadi Abou-Rjeily, Norbert Daniele, Jean-Claude Belfiore
2007 J jnl
IEEE Trans. Inf. Theory
Chadi Abou-Rjeily, Jean-Claude Belfiore
2006 J jnl
IEEE Commun. Lett.
Chadi Abou-Rjeily, Norbert Daniele, Jean-Claude Belfiore
2006 B conf
ISIT
Chadi Abou-Rjeily, Norbert Daniele, Jean-Claude Belfiore
2006 conf
ISWCS
Chadi Abou-Rjeily, Norbert Daniele, Jean-Claude Belfiore
2006 B conf
PIMRC
Chadi Abou-Rjeily, Norbert Daniele, Jean-Claude Belfiore
2006 B conf
PIMRC
Chadi Abou-Rjeily, Norbert Daniele, Jean-Claude Belfiore
2006 J jnl
IEEE Trans. Commun.
Chadi Abou-Rjeily, Norbert Daniele, Jean-Claude Belfiore
2006 J jnl
IEEE Trans. Commun.
Chadi Abou-Rjeily, Norbert Daniele, Jean-Claude Belfiore
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)