Ik Joon Chang

37 papers A* 1A 4C 4Journal 21Unranked 7
YearRankTypeTitle / Venue / Authors
2025 J jnl
CoRR
Donghoon Kim, Dongyoung Lee, Ik Joon Chang, Sung-Ho Bae
2025 J jnl
CoRR
Dongyoung Lee, Seungkyu Choi, Ik Joon Chang
2025 conf
AICAS
Cheol-Min Kang, Nguyen-Dong Ho, Dongyoung Lee, Yonghwan Kwon, Donghyun Kim, Inhan Kang, Ik Joon Chang
2024 J jnl
CoRR
Donghyeon Yi, Seoyoung Lee, Jongho Kim, Junyoung Kim, Sohmyung Ha, Ik Joon Chang, Minkyu Je
2021 A conf
DATE
Nhut-Minh Ho, Duy Thanh Nguyen, Himeshi De Silva, John L. Gustafson, Weng-Fai Wong, Ik Joon Chang
2020 J jnl
Sensors
Duckhoon Ro, Changhong Min, Myounggon Kang, Ik Joon Chang, Hyung-Min Lee
2020 A conf
DATE
Boyeal Kim, Sang Hyun Lee, Hyun Kim, Duy Thanh Nguyen, Minh-Son Le, Ik Joon Chang, Dohun Kwon, Jin Hyeok Yoo, Jun Won Choi, Hyuk-Jae Lee
2018 C conf
ISCAS
Duy Thanh Nguyen, Hyun Kim, Hyuk-Jae Lee, Ik Joon Chang
2018 J jnl
IEEE J. Emerg. Sel. Topics Circuits Syst.
Hyun Kim, Ik Joon Chang, Hyuk-Jae Lee
2017 J jnl
Circuits Syst. Signal Process.
Ik Joon Chang, Sang Yoon Park, Jun Won Choi
2016 C conf
ICCE
Hyun Kim, Ik Joon Chang, Hyuk-Jae Lee
2016 conf
APCCAS
My-Kieu Nguyen-Thi, Ik Joon Chang, Jinsang Kim
2016 J jnl
IEEE Trans. Consumer Electron.
Minsu Choi, Ik Joon Chang, Jinsang Kim
2016 J jnl
IEICE Electron. Express
Ik Joon Chang, Joon-Sung Yang
2015 conf
MWSCAS
Minsu Choi, Kyung-Rae Kim, Ik Joon Chang, Jinsang Kim
2015 J jnl
IEICE Trans. Electron.
Youngkyu Jang, Ik Joon Chang, Jinsang Kim
2015 J jnl
IEICE Trans. Electron.
Youngkyu Jang, Changnoh Yoon, Ik Joon Chang, Jinsang Kim
2014 J jnl
Sensors
HyungJune Lee, Hyunseok Kim, Ik Joon Chang
2014 A conf
ISLPED
Trang Le Dinh Dang, Ik Joon Chang, Jinsang Kim
2013 J jnl
IEEE Trans. Circuits Syst. I Regul. Pap.
Ngoc Dang Phan, Ik Joon Chang, Jong-Wook Lee
2013 J jnl
IEEE Trans. Circuits Syst. Video Technol.
Minsu Choi, Ik Joon Chang, Jinsang Kim
2013 C conf
ISCAS
Wooseok Kim, Joohan Kim, Minsu Choi, Ik Joon Chang, Jinsang Kim
2013 C conf
ISCAS
Junghyun Ha, Janghyuk Yoon, Ik Joon Chang, Jinsang Kim
2013 J jnl
IEICE Trans. Electron.
Joon-Sung Yang, Ik Joon Chang
2012 conf
ISSCC
Daeyeal Lee, Ik Joon Chang, Sangyong Yoon, Joonsuc Jang, Dong-Su Jang, Wook-Ghee Hahn, Jong-Yeol Park, Doo-Gon Kim, Chiweon Yoon, Bong-Soon Lim, Byungjun Min, Sung-Won Yun, Ji-Sang Lee, Il-Han Park, Kyung-Ryun Kim, Jeong-Yun Yun, Youse Kim, Yong-Sung Cho, Kyung-Min Kang, Sang-Hyun Joo, Jin-Young Chun, Jung-No Im, Seunghyuk Kwon, Seokjun Ham, AnSoo Park, Jae-Duk Yu, Nam-Hee Lee, Tae-Sung Lee, Moosung Kim, HooSung Kim, Ki-Whan Song, Byung-Gil Jeon, Kihwan Choi, Jin-Man Han, Kyehyun Kyung, Youngho Lim, Young-Hyun Jun
2012 J jnl
IEICE Electron. Express
Ik Joon Chang, Joon-Sung Yang
2012 J jnl
IEEE Trans. Circuits Syst. I Regul. Pap.
Jinmo Kwon, Ik Joon Chang, Insoo Lee, Heemin Park, Jongsun Park
2012 conf
ISOCC
Minsu Choi, Jinsang Kim, Ik Joon Chang, Won-Kyung Cho
2011 J jnl
IEEE Trans. Circuits Syst. Video Technol.
Ik Joon Chang, Debabrata Mohapatra, Kaushik Roy
2011 J jnl
IEEE Trans. Very Large Scale Integr. Syst.
Ik Joon Chang, Jae-Joon Kim, Keejong Kim, Kaushik Roy
2010 J jnl
IEEE J. Solid State Circuits
Ik Joon Chang, Sang Phill Park, Kaushik Roy
2010 J jnl
IET Circuits Devices Syst.
Ik Joon Chang, Jongsun Park, Kunhyuk Kang, Kaushik Roy
2009 J jnl
IEEE J. Solid State Circuits
Ik Joon Chang, Jae-Joon Kim, Sang Phill Park, Kaushik Roy
2009 A* conf
DAC
Ik Joon Chang, Debabrata Mohapatra, Kaushik Roy
2008 conf
ISSCC
Ik Joon Chang, Jae-Joon Kim, Sang Phill Park, Kaushik Roy
2006 A conf
ISLPED
Ik Joon Chang, Jae-Joon Kim, Kaushik Roy
2005 conf
CICC
Ik Joon Chang, Kunhyuk Kang, Saibal Mukhopadhyay, Chris H. Kim, Kaushik Roy
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)