Hai-Jun Rong

57 papers B 7Journal 39Unranked 11
YearRankTypeTitle / Venue / Authors
2025 J jnl
Appl. Soft Comput.
Tao Zhang, Hai-Jun Rong, Zhao-Xu Yang, Chi-Man Vong
2025 J jnl
CoRR
Zhongwei Chen, Hai-Jun Rong, Zhao-Xu Yang, Guoqi Li
2025 J jnl
CoRR
Zhongwei Chen, Zhao-Xu Yang, Hai-Jun Rong, Jiawei Lang
2025 J jnl
IEEE Trans. Geosci. Remote. Sens.
Zhongwei Chen, Zhao-Xu Yang, Hai-Jun Rong
2025 J jnl
CoRR
Zhongwei Chen, Zhao-Xu Yang, Hai-Jun Rong
2024 J jnl
Appl. Soft Comput.
Zhao-Xu Yang, Hai-Jun Rong
2024 J jnl
CoRR
Zhongwei Chen, Zhao-Xu Yang, Hai-Jun Rong
2024 J jnl
IEEE Trans. Fuzzy Syst.
Hui Huang, Hai-Jun Rong, Zhao-Xu Yang, Chi-Man Vong
2022 J jnl
Cogn. Comput.
Zhao-Xu Yang, Hai-Jun Rong, Pak Kin Wong, Plamen Angelov, Chi-Man Vong, Chi-Chong Chiu, Zhi-Xin Yang
2022 conf
ASSE
Hui Huang, Hai-Jun Rong, Zhao-Xu Yang
2022 J jnl
Evol. Syst.
Zhao-Xu Yang, Zhi-Xin Yang, Hai-Jun Rong
2022 J jnl
Inf. Sci.
Hui Huang, Hai-Jun Rong, Zhao-Xu Yang, Chi-Man Vong
2022 J jnl
IEEE Trans. Fuzzy Syst.
Zhao-Xu Yang, Hai-Jun Rong, Plamen Angelov, Zhi-Xin Yang
2021 J jnl
Neurocomputing
Hui Huang, Jing Yang, Hai-Jun Rong, Shaoyi Du
2021 J jnl
Inf. Sci.
Hui Huang, Hai-Jun Rong, Zhao-Xu Yang, Chi-Man Vong
2021 J jnl
IEEE Trans. Ind. Electron.
Zhao-Xu Yang, Hai-Jun Rong, Pak-Kin Wong, Plamen Angelov, Zhi-Xin Yang, Hang Wang
2020 J jnl
IEEE Access
Jing Yang, Yi Xu, Hai-Jun Rong, Shaoyi Du, Hongmei Zhang
2020 J jnl
Neural Comput. Appl.
Jian-Ming Bai, Guang-She Zhao, Hai-Jun Rong
2020 J jnl
IEEE Trans. Fuzzy Syst.
Hai-Jun Rong, Zhi-Xin Yang, Pak-Kin Wong
2019 J jnl
IEEE Trans. Ind. Informatics
Rong-Jing Bao, Hai-Jun Rong, Zhi-Xin Yang, Badong Chen
2019 conf
IEEM
Zhao-Xu Yang, Hai-Jun Rong, Zhi-Xin Yang
2019 J jnl
Inf. Sci.
Xiaowei Gu, Plamen Angelov, Hai-Jun Rong
2019 conf
IEEM
Zehua Liu, Hai-Jun Rong, Zhao-Xu Yang, Zhi-Xin Yang
2018 conf
HPCC/SmartCity/DSS
Rong-Jing Bao, Hai-Jun Rong, Jing Yang, Badong Chen
2018 J jnl
IEEE Trans. Fuzzy Syst.
Rong-Jing Bao, Hai-Jun Rong, Plamen P. Angelov, Badong Chen, Pak-Kin Wong
2018 conf
HPCC/SmartCity/DSS
Jian-Ming Bai, Guang-She Zhao, Hai-Jun Rong
2018 B conf
IJCNN
Hai-Jun Rong, Changjun Li, Rong-Jing Bao, Badong Chen
2018 J jnl
CoRR
Rong-Jing Bao, Hai-Jun Rong, Zhi-Xin Yang, Badong Chen
2018 J jnl
Sensors
Jian-Ming Bai, Guangshe Zhao, Hai-Jun Rong, Xianhua Wang
2018 J jnl
IEEE Access
Jing Yang, Yi Xu, Hai-Jun Rong, Shaoyi Du, Badong Chen
2018 J jnl
IEEE Trans. Fuzzy Syst.
Hai-Jun Rong, Plamen P. Angelov, Xiaowei Gu, Jian-Ming Bai
2017 J jnl
Neurocomputing
Hai-Jun Rong, Zhao-Xu Yang, Pak-Kin Wong, Chi-Man Vong, Guang-She Zhao
2017 J jnl
Ann. des Télécommunications
Zhao-Xu Yang, Guang-She Zhao, Guoqi Li, Hai-Jun Rong
2017 J jnl
Neural Networks
Jing Yang, Feng Ye, Hai-Jun Rong, Badong Chen
2017 conf
EAIS
Zhao-Xu Yang, Hai-Jun Rong, Guang-She Zhao, Jing Yang
2016 J jnl
Neurocomputing
Zhao-Xu Yang, Guang-She Zhao, Hai-Jun Rong, Jing Yang
2016 B conf
IJCNN
Yicong He, Fei Wang, Jing Yang, Hai-Jun Rong, Badong Chen
2016 B conf
IJCNN
Jing Yang, Pengpeng Chen, Hai-Jun Rong, Badong Chen
2015 J jnl
Neurocomputing
Hai-Jun Rong, Jin-Tao Wei, Jian-Ming Bai, Guang-She Zhao, Yong-Qi Liang
2015 B conf
FUZZ-IEEE
Hai-Jun Rong, Jian-Ming Bai, Jing Yang
2015 J jnl
Memetic Comput.
Qin-ying Lin, Xiaoping Wang, Hai-Jun Rong
2014 J jnl
Appl. Soft Comput.
Hai-Jun Rong, Sai Han, Guang-She Zhao
2014 J jnl
Neurocomputing
Hai-Jun Rong, Ya-Xin Jia, Guang-She Zhao
2014 conf
ISSNIP
Hai-Jun Rong, Rong-Jing Bao, Guang-She Zhao
2013 J jnl
Neural Comput. Appl.
Hai-Jun Rong, Guang-She Zhao
2012 conf
HPCC-ICESS
Hai-Jun Rong
2011 J jnl
Evol. Syst.
Hai-Jun Rong, N. Sundararajan, Guang-Bin Huang, Guang-She Zhao
2011 J jnl
Neurocomputing
Hai-Jun Rong, Suresh Sundaram, Guang-She Zhao
2010 B conf
FUZZ-IEEE
Hai-Jun Rong, Guang-She Zhao
2009 conf
CISDA
Suresh Sundaram, Hai-Jun Rong, Narasimhan Sundararajan
2009 conf
CISDA
Hai-Jun Rong, Narasimhan Sundararajan
2009 J jnl
IEEE Trans. Syst. Man Cybern. Part B
Hai-Jun Rong, Guang-Bin Huang, Narasimhan Sundararajan, Paramasivan Saratchandran
2008 J jnl
Neurocomputing
Hai-Jun Rong, Yew-Soon Ong, Ah-Hwee Tan, Zexuan Zhu
2008 B conf
IJCNN
Hai-Jun Rong, Guang-Bin Huang, Yew-Soon Ong
2006 B conf
FUZZ-IEEE
Hai-Jun Rong, Guang-Bin Huang, Narasimhan Sundararajan, Paramasivan Saratchandran
2006 J jnl
Fuzzy Sets Syst.
Hai-Jun Rong, N. Sundararajan, Guang-Bin Huang, P. Saratchandran
2005 conf
Computational Intelligence
Guang-Bin Huang, Nanying Liang, Hai-Jun Rong, Paramasivan Saratchandran, Narasimhan Sundararajan
redb/extractors/js_extractor.py
← Index redb/extractors/js_extractor.py python
import logging
import re
from abc import ABCMeta, abstractmethod

from redb.extractors.extractor import Extractor
from redb.extractors.js_extractors.js_context import JSContext, _text_entropy

logger = logging.getLogger(__name__)

# ESM is recognised by line-anchored `import ... from "..."` / bare side-effect
# `import "..."` / top-level `export ...`. Anchored at line start to avoid
# matching the substring inside string literals or comments.
_ESM_PATTERN = re.compile(
    r'(?m)^\s*(?:'
    r'import\s+[^;\n]*?\bfrom\s+[\'"]'
    r'|import\s+[\'"][^\'"]+[\'"]'
    r'|export\s+(?:default\b|\{|\*|const\b|let\b|var\b|function\b|class\b|async\b)'
    r')'
)


@abstractmethod
class JSExtractor(Extractor, metaclass=ABCMeta):
    """Base class for JavaScript file extractors.

    Every JSExtractor reads its raw materials (bytes / decoded source / line
    list / scan_source results / pyjsparser AST / text entropy) from a shared
    `JSContext`. When workers.py drives the JS pipeline it builds one context
    per sample and threads it into every extractor via `context=`. When tests
    or other callers instantiate an extractor directly, the constructor builds
    a fresh context from `(filepath, source=...)`.

    All historical instance attributes (`self.binary`, `self.js_source`,
    `self.lines`) and helpers (`self._decode_source`, `self._parse_ast`,
    `self._calculate_text_entropy`) are preserved as thin delegators so
    existing extractor code keeps working unchanged.
    """

    def __init__(
        self,
        filepath,
        log,
        exporters=None,
        index_prefix=None,
        known_benign=False,
        known_malicious=False,
        source=None,
        context=None,
    ):
        if context is None:
            context = JSContext.from_path(filepath, log=log, source=source)
        elif source is not None and context.source != source:
            log.warning(
                "JSExtractor received both `source=` and `context=` with "
                "differing source; ignoring source kwarg"
            )
        self._context = context

        super().__init__(
            filepath,
            log,
            exporters,
            index_prefix,
            known_benign=known_benign,
            known_malicious=known_malicious,
        )

    @property
    def binary(self):
        return self._context.raw_bytes

    @property
    def js_source(self):
        return self._context.source

    @property
    def lines(self):
        return self._context.lines

    def _decode_source(self):
        """Back-compat shim — the context already decoded once at construction.

        Kept so any external caller using the historical method name keeps
        working without touching the underlying bytes again.
        """
        return self._context.source

    def _parse_ast(self):
        """Return the shared pyjsparser AST (or None if unavailable)."""
        return self._context.ast

    def _calculate_text_entropy(self, text):
        """Shannon text entropy for `text`.

        When `text` is the context's own source we read the cached value;
        otherwise we compute fresh. JSStringsExtractor calls this on arbitrary
        decoded substrings, so the fresh-compute path must remain available.
        """
        if text is self._context.source:
            return self._context.text_entropy
        return _text_entropy(text)

    def _detect_environment(self):
        """Detect the target JS runtime environment."""
        src = self.js_source
        if not src:
            return "unknown"

        # WScript/WSH indicators
        wscript_patterns = [
            'WScript.', 'WSH.', 'ActiveXObject', 'Scripting.FileSystemObject',
            'WScript.Shell', 'ADODB.Stream',
        ]
        for p in wscript_patterns:
            if p in src:
                return "wscript"

        # Browser-extension APIs — checked before generic browser/worker because
        # `chrome.*` and `browser.runtime` are distinctive of MV2/MV3 extensions
        extension_patterns = [
            'chrome.runtime', 'chrome.tabs', 'chrome.storage',
            'chrome.webRequest', 'browser.runtime', 'browser.tabs',
        ]
        for p in extension_patterns:
            if p in src:
                return "browser_extension"

        # Service / Web Workers — worker-only APIs that don't appear in regular
        # browser pages (a generic browser script would use `window.` or
        # `document.`, never `self.importScripts` or `caches.match`)
        worker_patterns = [
            "self.addEventListener('fetch'", 'self.addEventListener("fetch"',
            'self.importScripts', 'self.skipWaiting',
            'caches.match', 'caches.open',
        ]
        for p in worker_patterns:
            if p in src:
                return "service_worker"

        # Deno runtime
        if 'Deno.' in src:
            return "deno"

        # Node.js indicators
        node_patterns = [
            'require(', 'module.exports', 'process.env', '__dirname',
            '__filename', 'Buffer.', 'child_process',
        ]
        for p in node_patterns:
            if p in src:
                return "node"

        # Browser indicators
        browser_patterns = [
            'document.', 'window.', 'navigator.', 'localStorage',
            'sessionStorage', 'XMLHttpRequest', 'addEventListener',
        ]
        for p in browser_patterns:
            if p in src:
                return "browser"

        return "unknown"

    def _detect_script_type(self):
        """Detect the script type/format."""
        src = self.js_source
        if not src:
            return "unknown"

        stripped = src.lstrip()

        # JScript.Encode payload — must be checked first since the encoded
        # body can't be classified any other way
        if stripped.startswith('#@~^'):
            return "jse"

        # WSF / HTA live in the first few KB of an HTML-ish wrapper
        head_lower = stripped[:4096].lower()

        # Windows Script File — XML wrapper around one or more <script> blocks
        if ('<job' in head_lower or '<package' in head_lower) and '<script' in head_lower:
            return "wsf"

        # HTML Application — distinct from generic embedded_html because HTAs
        # run under mshta.exe with full WSH/ActiveX access
        if '<hta:application' in head_lower or 'application/hta' in head_lower:
            return "hta"

        if stripped.startswith('<!') or stripped.startswith('<html') or '<script' in stripped[:2000]:
            return "embedded_html"

        if 'WScript.' in src or 'WSH.' in src:
            return "wscript"

        if _ESM_PATTERN.search(src):
            return "esm"

        if 'require(' in src or 'module.exports' in src:
            return "node_module"

        return "standalone"