Xi Liao

32 papers A* 1B 3Journal 15Unranked 13
YearRankTypeTitle / Venue / Authors
2026 J jnl
IEEE Internet Things J.
Yi Hu, Xi Liao, Junhui Hu, Hao Wen, Huan Xu, Kai Peng, Menglan Hu
2025 conf
ICCBN
Shangling Li, Kai Wen, Xi Liao, Tao Hu
2025 J jnl
IEEE Trans. Veh. Technol.
Yang Wang, Xue Zhou, Xi Liao, Jiliang Zhang, Jie Zhang
2025 J jnl
IEEE Trans. Netw. Sci. Eng.
Kai Peng, Tongxin Liao, Xi Liao, Jiangshan Xie, Bo Xu, Tianping Deng, Menglan Hu
2025 conf
VTC2025-Fall
Wu Wen, Zeyu Li, Xi Liao, Yang Wang, Panpan Shi
2025 conf
VTC2025-Fall
Wu Wen, Kai Zhou, Xi Liao, Panpan Shi
2025 conf
CVPR Workshops
Xin Li, Kun Yuan, Bingchen Li, Fengbin Guan, Yizhen Shao, Zihao Yu, Xijun Wang, Yiting Lu, Wei Luo, Suhang Yao, Ming Sun, Chao Zhou, Zhibo Chen, Radu Timofte, Yabin Zhang, Ao-Xiang Zhang, Tianwu Zhi, Jianzhao Liu, Yang Li, Jingwen Xu, Yiting Liao, Yushen Zuo, Mingyang Wu, Renjie Li, Shengyun Zhong, Zhengzhong Tu, Yufan Liu, Xiangguang Chen, Zuowei Cao, Minhao Tang, Shan Liu, Kexin Zhang, Jingfen Xie, Yan Wang, Kai Chen, Shijie Zhao, Yunchen Zhang, Xiangkai Xu, Hong Gao, Ji Shi, Yiming Bao, Xiugang Dong, Xiangsheng Zhou, Yaofeng Tu, Ying Liang, Yiwen Wang, Xinning Chai, Yuxuan Zhang, Zhengxue Cheng, Yingsheng Qin, Yucai Yang, Rong Xie, Li Song, Wei Sun, Kang Fu, Linhan Cao, Dandan Zhu, Kaiwei Zhang, Yucheng Zhu, Zicheng Zhang, Menghan Hu, Xiongkuo Min, Guangtao Zhai, Zhi Jin, Jiawei Wu, Wei Wang, Wenjian Zhang, Yuhai Lan, Gaoxiong Yi, Hengyuan Na, Wang Luo, Di Wu, Mingyin Bai, Jiawang Du, Zilong Lu, Zhenyu Jiang, Hui Zeng, Ziguan Cui, Zongliang Gan, Guijin Tang, Xinglin Xie, Kehuan Song, Xiaoqiang Lu, Licheng Jiao, Fang Liu, Xu Liu, Puhua Chen, Ha Thu Nguyen, Katrien De Moor, Seyed Ali Amirshahi, Mohamed-Chaker Larabi, Qi Tang, Linfeng He, Zhiyong Gao, Zixuan Gao, Guohua Zhang, Zhiye Huang, Yi Deng, Qingmiao Jiang, Lu Chen, Yi Yang, Xi Liao, Nourine Mohammed Nadir, Yuxuan Jiang, Qiang Zhu, Siyue Teng, Fan Zhang, Shuyuan Zhu, Bing Zeng, David Bull, Meiqin Liu, Chao Yao, Yao Zhao
2024 B conf
WCNC
Xi Liao, Linjie Fan, Yang Wang, Ziming Yu, Guangjian Wang, Yi Chen, Jie Zhang
2024 conf
VTC Spring
Yang Wang, Xianrong Zhou, Xi Liao, Ziming Yu, Guangjian Wang
2024 B conf
WCNC
Yang Wang, Weijia Xiao, Xi Liao, Xiangquan Zheng, Jiliang Zhang, Tao Hu
2024 conf
VTC Spring
Yang Wang, Tianxiang Wang, Xiangquan Zheng, Xi Liao, Jie Zhang
2024 conf
VTC Spring
Yang Wang, Chenxu Wang, Xi Liao, Yi Chen, Ziming Yu, Guangjian Wang
2024 J jnl
IEEE Internet Things J.
Yang Wang, Chenxu Wang, Xiangquan Zheng, Xinyu Hao, Xi Liao
2024 A* conf
CHI
Lili Zhang, Xi Liao, Zaijia Yang, Baihang Gao, Chunjie Wang, Qiuling Yang, Deshun Li
2024 J jnl
IEEE Wirel. Commun. Lett.
Yang Wang, Chuan Li, Xi Liao, Ziming Yu, Guangjian Wang, Xianjin Li, Jie Zhang
2024 conf
VTC Spring
Xi Liao, Hao Tang, Yang Wang, Yi Chen, Ziming Yu, Guangjian Wang
2023 B conf
GLOBECOM
Xinrui Chen, Xi Liao, Yang Wang, Ziming Yu, Guangjian Wang, Yi Chen, Jie Zhang
2023 conf
GLOBECOM (Workshops)
Yang Wang, Yueyang Liu, Xi Liao, Ziming Yu, Guangjian Wang, Jie Zhang
2022 J jnl
IET Signal Process.
Luoyan Zhu, Yinsheng Liu, Danping He, Ke Guan, Bo Ai, Zhangdui Zhong, Xi Liao
2022 J jnl
CoRR
Yinsheng Liu, Hongtao Duan, Xi Liao
2021 conf
ICC Workshops
Changwen He, Xi Liao, Yang Wang, Jihua Zhou, Jie Zhang
2021 J jnl
IEEE Access
Yuyan Shen, Yu Shao, Xi Liao, Heng Zhang, Jie Zhang
2021 J jnl
IEEE Commun. Lett.
Tao Hu, Yang Wang, Xi Liao, Jie Zhang
2020 J jnl
IEEE Access
Chenhong Zhou, Xi Liao, Yang Wang, Shasha Liao, Jihua Zhou, Jie Zhang
2020 J jnl
IEEE Access
Mingzhe Qu, Yang Wang, Xi Liao, Shasha Liao, Jihua Zhou
2019 J jnl
IEEE Access
Haikuo Tian, Xi Liao, Yang Wang, Yu Shao, Jihua Zhou, Tao Hu, Jie Zhang
2019 J jnl
IEEE Access
Tao Hu, Yang Wang, Xi Liao, Jie Zhang, Qilong Song
2018 conf
ChinaCom
Kai Liu, Yang Wang, Qilong Song, Xi Liao
2015 J jnl
Wirel. Pers. Commun.
Danfeng Zhao, Xi Liao, Yang Wang
2015 J jnl
Int. J. Distributed Sens. Networks
Xi Liao, Rui Xue, Danfeng Zhao, Yang Wang
2014 conf
CSO
Xi Liao, Lihong He, Mengmeng Liu
2014 conf
ChinaSIP
Yang Wang, Danfeng Zhao, Xi Liao
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"