Nanlin Jin

44 papers A 1B 11C 1Misc 1Journal 14Unranked 16
YearRankTypeTitle / Venue / Authors
2026 J jnl
Expert Syst. Appl.
Borong Lin, Nanlin Jin, John R. Woodward
2025 J jnl
IEEE Access
Muyi Bao, Nanlin Jin, Ming Xu
2024 Misc conf
ICISS
Zelong Liu, Pingfan Wang, Nanlin Jin
2024 J jnl
Expert Syst. Appl.
Pingfan Wang, Hang Yu, Nanlin Jin, Duncan Davies, Wai Lok Woo
2024 B conf
SMC
Borong Lin, Chao Huang, Xiaohui Zhu, Nanlin Jin
2024 conf
ISOCC
Ningfei Song, Nanlin Jin, Jingchen Wang, Jie Zhang, Ka Lok Man, Jeremy S. Smith, Yutao Yue
2023 conf
EWDTS
Ningfei Song, Nanlin Jin, Jingchen Wang, Jie Zhang, Jeremy S. Smith, Yutao Yue, Young-Ae Jung, Ka Lok Man
2023 conf
PRIS
Borong Lin, Nanlin Jin
2023 J jnl
Wirel. Networks
Jeremy Ellman, Nathan Lee, Nanlin Jin
2023 conf
CyberC
Jeongyeong Park, Nanlin Jin, Jianjun Chen, Jun Qi
2023 J jnl
Knowl. Based Syst.
Pingfan Wang, Nanlin Jin, Duncan Davies, Wai Lok Woo
2023 conf
PRIS
Jianing Xu, Bei Zhou, Nanlin Jin
2023 conf
CyberC
Muyi Bao, Songhao Li, Nanlin Jin, Quan Zhang
2023 conf
iThings/GreenCom/CPSCom/SmartData/Cybermatics
Yifei Hu, Xinyao Zhuang, Yuxin Wan, Nanlin Jin, Xiaohui Zhu
2022 conf
IVSP
Pingfan Wang, Wai Lok Woo, Nanlin Jin, Duncan Davies
2022 conf
CyberC
Haoyu Wu, Zhibin Lin, Borong Lin, Zhenhao Li, Nanlin Jin, Xiaohui Zhu
2022 J jnl
Inf. Sci.
Pingfan Wang, Nanlin Jin, Wai Lok Woo, John R. Woodward, Duncan Davies
2021 J jnl
Remote. Sens.
Muhammad Waqas Khan, Stuart Dunning, Rupert Bainbridge, James Martin, Alejandro Diaz-Moreno, Hamdi Torun, Nanlin Jin, John Woodward, Michael Lim
2020 conf
UCET
Pingfan Wang, Nanlin Jin, Gerhard Fehringer
2020 conf
ISIE
Reihane Rahimilarki, Zhiwei Gao, Nanlin Jin, Richard Binns, Aihua Zhang
2020 J jnl
Sensors
Giorgos Tsapparellas, Nanlin Jin, Xuewu Dai, Gerhard Fehringer
2019 J jnl
Comput. Ind.
Tom Wilcox, Nanlin Jin, Peter A. Flach, Joshua Thumim
2019 conf
SmartWorld/SCALCOM/UIC/ATC/CBDCom/IOP/SCI
Ranti Endeley, Tom Fleming, Nanlin Jin, Gerhard Fehringer, Steve Cammish
2019 J jnl
CoRR
Tiancheng Xia, Richard Jiang, YongQing Fu, Nanlin Jin
2019 C conf
INDIN
Reihane Rahimilarki, David Zhiwei Gao, Nanlin Jin, Aihua Zhang
2018 conf
iConference
Elaine Vella, Longzhi Yang, Naveed Naveed Anwar, Nanlin Jin
2017 conf
ICC
A. Bagley, Gerhard Fehringer, Nanlin Jin, Steve Cammish
2016 J jnl
IEEE Trans. Ind. Informatics
Reem Al-Otaibi, Nanlin Jin, Tom Wilcox, Peter A. Flach
2014 B conf
FUZZ-IEEE
Longzhi Yang, Chengyuan Chen, Nanlin Jin, Xin Fu, Qiang Shen
2014 B conf
IEEE Congress on Evolutionary Computation
Nanlin Jin, Xin Yao
2014 J jnl
IEEE Trans. Ind. Informatics
Nanlin Jin, Peter A. Flach, Tom Wilcox, Royston Sellman, Joshua Thumim, Arno J. Knobbe
2011 J jnl
Appl. Soft Comput.
Nanlin Jin, Edward P. K. Tsang
2009 J jnl
Appl. Soft Comput.
Nanlin Jin, Edward P. K. Tsang, Jin Li
2009 conf
EvoWorkshops
Nanlin Jin, Daniel S. Chapman, Klaus Hubacek
2008 B conf
IEEE Congress on Evolutionary Computation
Nanlin Jin
2008 B conf
IEEE Congress on Evolutionary Computation
Nanlin Jin, Mette Termansen, Klaus Hubacek
2007 B conf
IEEE Congress on Evolutionary Computation
Nanlin Jin, Mette Termansen, Klaus Hubacek, Joseph Holden, Mike Kirkby
2006 B conf
IEEE Congress on Evolutionary Computation
Nanlin Jin, Edward P. K. Tsang
2006 B conf
EuroGP
Edward P. K. Tsang, Nanlin Jin
2006 A conf
GECCO
Nanlin Jin
2005 conf
CIG
Nanlin Jin, Edward P. K. Tsang
2005 B conf
Congress on Evolutionary Computation
Nanlin Jin
2005 B conf
Congress on Evolutionary Computation
Timothy Gosling, Nanlin Jin, Edward P. K. Tsang
2005 B conf
EuroGP
Nanlin Jin, Edward P. K. Tsang
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"