Chan Wang

40 papers B 2Journal 20Unranked 18
YearRankTypeTitle / Venue / Authors
2026 J jnl
Bioinform.
Yanan Zhao, Ting-Fang Lee, Boyan Zhou, Chan Wang, Ann Marie Schmidt, Mengling Liu, Huilin Li, Jiyuan Hu
2025 J jnl
IEEE Trans. Commun.
Kechen Meng, Sinuo Zhang, Rongpeng Li, Chan Wang, Ming Lei, Zhifeng Zhao
2025 conf
VTC2025-Spring
Sinuo Zhang, Kechen Meng, Rongpeng Li, Chan Wang, Ming Lei, Min-Jian Zhao, Zhifeng Zhao
2025 J jnl
CoRR
Kechen Meng, Sinuo Zhang, Rongpeng Li, Chan Wang, Ming Lei, Zhifeng Zhao
2025 conf
VTC2025-Spring
Yuxin Wang, An Liu, Chan Wang, Minjian Zhao
2025 J jnl
Comput. Educ.
Chan Wang, Hongbiao Yin
2025 J jnl
EAI Endorsed Trans. Scalable Inf. Syst.
Jianwei Ma, Jing Luo, Zhongqiang Zhou, Yusong Huang, Ling Liang, Chan Wang, Zhencheng Li
2025 J jnl
CoRR
Kechen Meng, Sinuo Zhang, Rongpeng Li, Xiangming Meng, Chan Wang, Ming Lei, Zhifeng Zhao
2025 J jnl
Briefings Bioinform.
Qing Cheng, Wenxin Xu, Chan Wang, Jin Liu, Yanyan Zhao
2025 conf
VTC2025-Fall
Yang Chen, Chan Wang, Rongpeng Li, Minjian Zhao, Mingmin Zhao
2025 J jnl
IEEE Trans. Commun.
Zhilin Lu, Rongpeng Li, Ming Lei, Chan Wang, Zhifeng Zhao, Honggang Zhang
2024 J jnl
Br. J. Educ. Technol.
Weipeng Yang, Chan Wang, Alfredo Bautista
2024 conf
VTC Fall
Qinyu Wang, Chan Wang, Rongpeng Li, Hanyu Wei, Minjian Zhao
2024 J jnl
Comput. Hum. Behav.
Hongbiao Yin, Chan Wang, Zhijun Liu
2023 J jnl
IEEE Trans. Cogn. Commun. Netw.
Jianhang Zhu, Rongpeng Li, Guoru Ding, Chan Wang, Jianjun Wu, Zhifeng Zhao, Honggang Zhang
2023 conf
VTC2023-Spring
Jiaolan Fang, Chan Wang, Rongpeng Li, Hanyu Wei, Minjian Zhao
2023 J jnl
Technol. Anal. Strateg. Manag.
Pu-yan Nie, Chan Wang, Hong-xing Wen
2022 J jnl
CoRR
Jianhang Zhu, Rongpeng Li, Guoru Ding, Chan Wang, Jianjun Wu, Zhifeng Zhao, Honggang Zhang
2022 B conf
ISIT
Yi Wei, Zixin Zhong, Vincent Y. F. Tan, Chan Wang
2022 B conf
GLOBECOM
Hanyu Wei, Chan Wang, Rongpeng Li, Minjian Zhao
2022 J jnl
IEEE Commun. Lett.
Yihao Liu, Ming-Min Zhao, Chan Wang, Ming Lei, Minjian Zhao
2022 J jnl
Technol. Anal. Strateg. Manag.
Pu-yan Nie, Chan Wang, Hong-xing Wen
2022 J jnl
Remote. Sens.
Lijuan Wen, Chan Wang, Zhaoguo Li, Lin Zhao, Shihua Lyu, Matti Leppäranta, Georgiy Kirillin, Shiqiang Chen
2021 conf
VTC Fall
Xiaohao Zhang, Ming Lei, Chan Wang, Minjian Zhao
2020 conf
VTC Fall
Kexin Li, Chan Wang, Ming Lei, Ming-Min Zhao, Min-Jian Zhao
2020 J jnl
IEEE Access
Jianyi Liu, Yu Tian, Ru Zhang, Youqiang Sun, Chan Wang
2020 J jnl
IEEE Access
Huaping Wang, Lei Zhang, Dachuan Liang, Qianghu Liu, Chan Wang, Shahnawaz Shah, Yihao Yang
2020 conf
VTC Spring
Pai Liu, Chan Wang, Ming Lei, Min Li, Min-Jian Zhao
2020 conf
VTC Fall
Jue Cai, Chan Wang, Ming Lei, Min-Jian Zhao
2020 conf
VTC Fall
Chengxia Chen, Ming Lei, Chan Wang, Minjian Zhao
2020 conf
HICSS
Chan Wang, Yushim Kim, Seong Soo Oh
2020 J jnl
Bioinform.
Chan Wang, Jiyuan Hu, Martin J. Blaser, Huilin Li
2020 conf
VTC Fall
Zunli Kou, Chan Wang, Ming Lei
2019 conf
VTC Fall
Xiaolan Bao, Ming-Min Zhao, Ming Lei, Minjian Zhao, Chan Wang
2017 conf
WCSP
Chan Wang, Guan Gui, Fei Li
2011 conf
NLPKE
Chan Wang, Caixia Yuan, Xiaojie Wang, Wenwei Xue
2011 conf
iThings/CPSCom
Chan Wang, Xiaotong Fu
2010 J jnl
Appl. Math. Comput.
Xiaowu Li, Chunlai Mu, Jinwen Ma, Chan Wang
2009 conf
NLPKE
Chan Wang, Lei Li, Yixin Zhong
2008 conf
NLPKE
Chan Wang, Lixia Long, Lei Li
redb/extractors/js_extractors/js_suspicious_apis.py
← Index redb/extractors/js_extractors/js_suspicious_apis.py python
import inspect
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 CATEGORIES, PATTERNS


# Backwards-compatible export: `{category: [(raw_pattern_string, api_name), ...]}`
# in canonical PATTERNS insertion order (code_execution, network, filesystem,
# process, registry, crypto_encoding, dom_manipulation). Kept so external
# callers (notably JSDeobfuscationExtractor pre-cleanup) keep working until
# they are migrated to PATTERNS directly.
SUSPICIOUS_APIS: "dict[str, list[tuple[str, str]]]" = {}
for _name, _compiled in PATTERNS.items():
    SUSPICIOUS_APIS.setdefault(CATEGORIES[_name], []).append((_compiled.pattern, _name))


class JSSuspiciousAPIsExtractor(JSExtractor):

    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.api_findings = None
        self.log.debug(inspect.currentframe().f_code.co_name)

    def tag(self):
        return Tag.JS_SUSPICIOUS_APIS.value

    def _get_context_snippet(self, line, max_len=200):
        """Get a truncated context snippet around a match."""
        line = line.strip()
        if len(line) > max_len:
            return line[:max_len] + "..."
        return line

    def extract(self):
        src = self.js_source
        if not src:
            return None

        # Pass 1: shared per-sample scan over the raw source. The dict contains
        # entries for both PATTERNS and FEATURE_PATTERNS; the loop below only
        # consults PATTERNS keys, so feature-only entries are ignored.
        raw_scan = self._context.scan or {}
        raw_lines = self.lines

        # Pass 2: same patterns over the deobfuscated text, when the
        # deobfuscator produced something meaningfully different. APIs hidden
        # behind one obfuscation layer (Vjw0rm-style array.join + eval,
        # Dean-Edwards packers, jjencode, ...) only surface here. The scan is
        # cached on JSContext so JSDeobfuscationExtractor (which computes the
        # new_apis_found diff) reuses the same result.
        deobf_scan = self._context.scan_deobfuscated
        if deobf_scan:
            deobf_text, _ = self._context.deobfuscated
            deobf_lines = deobf_text.splitlines()
        else:
            deobf_lines = []

        findings = []
        # Iterate PATTERNS in canonical order so output is deterministic and
        # matches the historical category/pattern ordering. For each api_name,
        # raw findings take precedence; if an API is found only in the
        # deobfuscated text, we surface it as a row tagged revealed_by_deobf=1
        # with line numbers / snippets pulled from the deobfuscated source.
        for api_name in PATTERNS:
            raw_info = raw_scan.get(api_name)
            if raw_info:
                line_numbers = raw_info["lines"]
                lines_for_snippets = raw_lines
                revealed_by_deobf = 0
            else:
                deobf_info = deobf_scan.get(api_name)
                if not deobf_info:
                    continue
                line_numbers = deobf_info["lines"]
                lines_for_snippets = deobf_lines
                revealed_by_deobf = 1

            snippets = [
                self._get_context_snippet(lines_for_snippets[ln - 1])
                for ln in line_numbers[:3]
                if 0 < ln <= len(lines_for_snippets)
            ]
            findings.append({
                "api_name": api_name,
                "api_category": CATEGORIES[api_name],
                # Historical semantics: count = number of unique lines with a
                # match, not total in-source match count.
                "call_count": len(line_numbers),
                "line_numbers": line_numbers,
                "context_snippet": " | ".join(snippets),
                "revealed_by_deobf": revealed_by_deobf,
            })

        if not findings:
            return None

        self.api_findings = findings
        return findings

    def prepare_export_data(self, exporter_type: str) -> Any:
        if exporter_type == "ClickHouseExporter":
            if not self.api_findings:
                return None

            current_time = datetime.now(timezone.utc)
            data = []
            for f in self.api_findings:
                data.append([
                    self.sha256,
                    f['api_name'],
                    f['api_category'],
                    f['call_count'],
                    f['line_numbers'],
                    f['context_snippet'],
                    f['revealed_by_deobf'],
                    current_time,
                ])

            column_names = [
                "sha256", "api_name", "api_category",
                "call_count", "line_numbers", "context_snippet",
                "revealed_by_deobf",
                "analysis_date",
            ]

            column_type_names = [
                "FixedString(64)", "String", "LowCardinality(String)",
                "UInt32", "Array(UInt32)", "String",
                "UInt8",
                "DateTime64(3, 'UTC')",
            ]

            return (data, column_names, column_type_names)

    def get_clickhouse_table(self) -> str:
        return "redb_js_suspicious_apis"