Wei Wang

45 papers A* 10A 9B 1Journal 19Unranked 6
YearRankTypeTitle / Venue / Authors
2025 A* conf
ICRA
Peter Yichen Chen, Pingchuan Ma, Niklas Hagemann, John Romanishin, Wei Wang, Daniela Rus, Wojciech Matusik
2025 J jnl
CoRR
Peter Yichen Chen, Pingchuan Ma, Niklas Hagemann, John Romanishin, Wei Wang, Daniela Rus, Wojciech Matusik
2025 J jnl
Sci. Robotics
Liang Li, Nagy Máté, Guy Amichay, Ruiheng Wu, Wei Wang, Oliver Deussen, Daniela Rus, Iain D. Couzin
2025 A conf
IROS
Alejandro Gonzalez-Garcia, Wei Xiao, Wei Wang, Alejandro Astudillo, Wilm Decré, Jan Swevers, Carlo Ratti, Daniela Rus
2025 J jnl
CoRR
Alejandro Gonzalez-Garcia, Wei Xiao, Wei Wang, Alejandro Astudillo, Wilm Decré, Jan Swevers, Carlo Ratti, Daniela Rus
2024 J jnl
IEEE Robotics Autom. Lett.
Keng-Yu Lin, Jack A. Stonecipher, Zach Rusch, Wei Wang, Michael Wehner
2024 J jnl
Discret. Math.
Wei Wang, Jie Yang, Hao Zhang
2024 A* conf
ICRA
Wei Wang, Wei Xiao, Alejandro Gonzalez-Garcia, Jan Swevers, Carlo Ratti, Daniela Rus
2023 J jnl
J. Field Robotics
Wei Wang, David Fernández-Gutiérrez, Rens M. Doornbusch, Joshua Jordan, Tixiao Shan, Pietro Leoni, Niklas Hagemann, Jonathan Klein Schiphorst, Fabio Duarte, Carlo Ratti, Daniela Rus
2023 A* conf
ICRA
Wei Wang, Xiaojing Cao, Alejandro Gonzalez-Garcia, Lianhao Yin, Niklas Hagemann, Yuanyuan Qiao, Carlo Ratti, Daniela Rus
2023 J jnl
CoRR
Wei Wang, Xiaojing Cao, Alejandro Gonzalez-Garcia, Lianhao Yin, Niklas Hagemann, Yuanyuan Qiao, Carlo Ratti, Daniela Rus
2023 J jnl
J. Field Robotics
Wei Wang, David Fernández-Gutiérrez, Rens M. Doornbusch, Joshua Jordan, Tixiao Shan, Pietro Leoni, Niklas Hagemann, Jonathan Klein Schiphorst, Fabio Duarte, Carlo Ratti, Daniela Rus
2023 J jnl
IEEE Trans. Intell. Transp. Syst.
Yuanyuan Qiao, Jiaxin Yin, Wei Wang, Fábio Duarte, Jie Yang, Carlo Ratti
2022 A conf
IROS
Allan Zhao, Tao Du, Jie Xu, Josie Hughes, Juan Salazar, Pingchuan Ma, Wei Wang, Daniela Rus, Wojciech Matusik
2022 A* conf
ICRA
David Fernández-Gutiérrez, Niklas Hagemann, Wei Wang, Rens M. Doornbusch, Joshua Jordan, Jonathan Klein Schiphorst, Pietro Leoni, Fabio Duarte, Carlo Ratti, Daniela Rus
2022 A* conf
ICRA
Allan Zhao, Jie Xu, Juan Salazar, Wei Wang, Pingchuan Ma, Daniela Rus, Wojciech Matusik
2022 J jnl
CoRR
Yuanyuan Qiao, Jiaxin Yin, Wei Wang, Fábio Duarte, Jie Yang, Carlo Ratti
2021 A* conf
ICRA
Wei Wang, Niklas Hagemann, Carlo Ratti, Daniela Rus
2020 conf
CDC
Tixiao Shan, Wei Wang, Brendan J. Englot, Carlo Ratti, Daniela Rus
2020 J jnl
CoRR
Tixiao Shan, Wei Wang, Brendan J. Englot, Carlo Ratti, Daniela Rus
2020 A conf
IROS
Qinghao Wang, Ruijun Liu, Wei Wang, Guangming Xie
2020 J jnl
CoRR
Qinghao Wang, Ruijun Liu, Wei Wang, Guangming Xie
2020 J jnl
CoRR
Xingwen Zheng, Wei Wang, Liang Li, Guangming Xie
2020 A conf
IROS
Wei Wang, Zijian Wang, Luis A. Mateos, Kuan Wei Huang, Mac Schwager, Carlo Ratti, Daniela Rus
2020 J jnl
CoRR
Wei Wang, Zijian Wang, Luis A. Mateos, Kuan Wei Huang, Mac Schwager, Carlo Ratti, Daniela Rus
2020 A conf
IROS
Tixiao Shan, Brendan J. Englot, Drew Meyers, Wei Wang, Carlo Ratti, Daniela Rus
2020 J jnl
CoRR
Tixiao Shan, Brendan J. Englot, Drew Meyers, Wei Wang, Carlo Ratti, Daniela Rus
2020 J jnl
IEEE Trans. Robotics
Xingwen Zheng, Wei Wang, Minglei Xiong, Guangming Xie
2020 A conf
IROS
Wei Wang, Tixiao Shan, Pietro Leoni, David Fernández-Gutiérrez, Drew Meyers, Carlo Ratti, Daniela Rus
2020 J jnl
CoRR
Wei Wang, Tixiao Shan, Pietro Leoni, David Fernández-Gutiérrez, Drew Meyers, Carlo Ratti, Daniela Rus
2019 A* conf
ICRA
Luis A. Mateos, Wei Wang, Banti Gheneti, Fabio Duarte, Carlo Ratti, Daniela Rus
2019 J jnl
IEEE Trans. Syst. Man Cybern. Syst.
Wei Wang, Dongbing Gu, Guangming Xie
2019 conf
MRS
Wei Wang, Luis A. Mateos, Zijian Wang, Kuan Wei Huang, Mac Schwager, Carlo Ratti, Daniela Rus
2019 A conf
IROS
Wei Wang, Banti Gheneti, Luis A. Mateos, Fabio Duarte, Carlo Ratti, Daniela Rus
2018 conf
ROBIO
Yang Zhou, Wei Wang, Han Zhang, Chen Wang, Gang Xu, Guangming Xie
2018 A* conf
ICRA
Wei Wang, Luis A. Mateos, Shinkyu Park, Pietro Leoni, Banti Gheneti, Fabio Duarte, Carlo Ratti, Daniela Rus
2017 A conf
IROS
Han Zhang, Wei Wang, Yang Zhou, Chen Wang, Ruifeng Fan, Guangming Xie
2016 conf
ROBIO
Han Zhang, Wei Wang, Yingzheng Qu, Chen Wang, Ruifeng Fan, Guangming Xie
2016 A* conf
ICRA
Wei Wang, Yuan Li, Xingxing Zhang, Chen Wang, Shiming Chen, Guangming Xie
2015 J jnl
IEEE Trans. Ind. Electron.
Wei Wang, Guangming Xie
2015 A conf
IROS
Wei Wang, Xingxing Zhang, Jianwei Zhao, Guangming Xie
2015 conf
ROBIO
Chengcai Wang, Wei Wang, Guangming Xie
2015 A* conf
ICRA
Wei Wang, Jianwei Zhao, Wei Xiong, Fayang Cao, Guangming Xie
2014 B conf
IJCNN
Wei Wang, Guangming Xie, Hong Shi
2013 conf
AIM
Wei Wang, Jiajie Guo, Zijian Wang, Guangming Xie
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"