Chang-Yong Pan

83 papers B 20Journal 43Unranked 20
YearRankTypeTitle / Venue / Authors
2019 J jnl
IEEE Trans. Broadcast.
Jian Song, Chao Zhang, Kewu Peng, Jintao Wang, Chang-Yong Pan, Fang Yang, Jun Wang, Hui Yang, Yonglin Xue, Yu Zhang, Zhixing Yang
2018 J jnl
IEEE Trans. Broadcast.
Jingjing Liu, Chao Zhang, Chang-Yong Pan
2017 B conf
IWCMC
Yue Sun, Jintao Wang, Chang-Yong Pan
2017 J jnl
IEICE Trans. Commun.
Jingjing Liu, Chao Zhang, Chang-Yong Pan
2016 conf
BMSB
Jingbo Tan, Wenbo Ding, Fang Yang, Chang-Yong Pan, Jian Song
2016 J jnl
IEEE Trans. Broadcast.
Jin-Xing Hao, Jintao Wang, Chang-Yong Pan
2016 conf
SmartGridComm
Jingbo Tan, Fang Yang, Chang-Yong Pan, Jian Song, Zhu Han
2016 B conf
IWCMC
Xuesi Wang, Jintao Wang, Xu Ma, Chang-Yong Pan
2016 conf
BMSB
Chao Zhang, Jinwen Li, Peng Gao, Chang-Yong Pan, Xunchun Li, Wu Qi, Fang Yang
2015 J jnl
IEEE Trans. Broadcast.
Jian Song, Wenbo Ding, Fang Yang, Chang-Yong Pan, Linglong Dai
2015 conf
BMSB
Shuai Zhang, Chao Zhang, Chang-Yong Pan
2015 conf
BMSB
Ziwei Luo, Jun Wang, Chang-Yong Pan, Jinghui Zhu, Xunchun Li
2015 conf
BMSB
Ziwei Luo, Jun Wang, Chang-Yong Pan, Jinghui Zhu, Xunchun Li
2015 conf
VTC Spring
Shuai Zhang, Chao Zhang, Chang-Yong Pan
2015 B conf
IWCMC
Yue Liu, Kewu Peng, Chang-Yong Pan, LiWen Fan
2015 conf
BMSB
Chang Liu, Jintao Wang, Hui Yang, Chang-Yong Pan
2015 B conf
IWCMC
Huangping Jin, Kewu Peng, Jiachen Huang, Chang-Yong Pan
2014 B conf
IWCMC
Jiachen Huang, Kewu Peng, Chang-Yong Pan, Jian Song, Huangping Jin, Zhisheng Niu
2014 J jnl
IEEE Trans. Broadcast.
Wenbo Ding, Fang Yang, Chang-Yong Pan, Linglong Dai, Jian Song
2014 conf
CCNC
Jian Song, Jun Liu, Yu Zhang, Sheng Zhou, Chang-Yong Pan
2014 J jnl
IEEE Trans. Broadcast.
Jiachen Huang, Kewu Peng, Chang-Yong Pan, Fang Yang, Huangping Jin
2014 conf
BMSB
Hai Lin, Chao Zhang, Chang-Yong Pan
2013 B conf
IWCMC
Tao Cheng, Kewu Peng, Chang-Yong Pan, Zaishuang Liu, Zhixing Yang
2013 conf
BMSB
Jun Wang, Su Huang, Jian Song, Chang-Yong Pan
2013 B conf
IWCMC
LiWen Fan, Chang-Yong Pan, Kewu Peng, Jiachen Huang
2013 conf
BMSB
Chang-Yong Pan, Jintao Wang, Haidong Fang, Jian Song
2013 B conf
IWCMC
Keqian Yan, Fang Yang, Chang-Yong Pan, Jian Song, Fei Ren, Jia Li
2013 conf
BMSB
LiWen Fan, Kewu Peng, Chang-Yong Pan, Jian Song
2013 J jnl
IEICE Trans. Fundam. Electron. Commun. Comput. Sci.
Fang Yang, Keqian Yan, Chang-Yong Pan, Jian Song
2013 J jnl
IEICE Trans. Commun.
Jiachen Huang, Chang-Yong Pan, Kewu Peng, LiWen Fan, Jian Song
2013 J jnl
IEEE Trans. Consumer Electron.
Chang-Yong Pan, Linglong Dai, Zhixing Yang
2013 J jnl
IEICE Trans. Fundam. Electron. Commun. Comput. Sci.
Chang-Yong Pan, Linglong Dai, Zhixing Yang
2012 B conf
IWCMC
Wenting Chang, Jintao Wang, Chang-Yong Pan
2012 J jnl
IEEE Trans. Broadcast.
Keqian Yan, Fang Yang, Chang-Yong Pan, Jian Song
2012 B conf
GLOBECOM
Chang-Yong Pan, Linglong Dai
2012 J jnl
IEEE Trans. Broadcast.
Linglong Dai, Zhaocheng Wang, Chang-Yong Pan, Sheng Chen
2011 J jnl
IEICE Trans. Commun.
Wenting Chang, Jintao Wang, Chang-Yong Pan, Zhixing Yang
2011 J jnl
IEEE Trans. Veh. Technol.
Chao Zhang, Zhaocheng Wang, Chang-Yong Pan, Sheng Chen, Lajos Hanzo
2011 B conf
IWCMC
Keqian Yan, Wenbo Ding, Liwei Zhang, Yanbin Yin, Fang Yang, Chang-Yong Pan
2011 conf
ICC
Linglong Dai, Zhaocheng Wang, Chang-Yong Pan, Sheng Chen
2010 J jnl
Wirel. Pers. Commun.
Jintao Wang, Jian Song, Chang-Yong Pan, Jun Wang, Zhixing Yang
2010 conf
VTC Fall
Chao Zhang, Chang-Yong Pan
2010 J jnl
Wirel. Pers. Commun.
Jian Song, Jun Wang, Kewu Peng, Chang-Yong Pan, Zhixing Yang
2010 J jnl
IEEE Commun. Mag.
Chung-yen Ong, Jian Song, Chang-Yong Pan, Yangang Li
2010 B conf
IWCMC
Wenting Chang, Jintao Wang, Jian Song, Chang-Yong Pan
2009 J jnl
IEEE Trans. Broadcast.
Nan Jiang, Kewu Peng, Jian Song, Chang-Yong Pan, Zhixing Yang
2008 J jnl
IEEE Commun. Mag.
Zhisheng Niu, Long Long, Jian Song, Chang-Yong Pan
2008 J jnl
IEEE Trans. Broadcast.
Jian Fu, Jun Wang, Jian Song, Chang-Yong Pan, Zhixing Yang
2008 J jnl
IEICE Trans. Commun.
Feng Yang, Yu Zhang, Jian Song, Chang-Yong Pan, Zhixing Yang
2008 conf
ICC
Shigang Tang, Kewu Peng, Ke Gong, Jian Song, Chang-Yong Pan, Zhixing Yang
2008 J jnl
IEICE Trans. Commun.
Changqing Liu, Yu Zhang, Jian Song, Chang-Yong Pan, Zhixing Yang
2008 J jnl
IEEE Trans. Broadcast.
Shigang Tang, Kewu Peng, Ke Gong, Jian Song, Chang-Yong Pan, Zhixing Yang
2008 J jnl
Signal Process.
Feng Yang, Jian Song, Yu Zhang, Chang-Yong Pan, Zhixing Yang
2007 J jnl
IEEE Trans. Broadcast.
Shigang Tang, Ke Gong, Jian Song, Chang-Yong Pan, Zhixing Yang
2007 B conf
GLOBECOM
Shigang Tang, Fang Yang, Kewu Peng, Chang-Yong Pan, Ke Gong, Zhixing Yang
2007 B conf
WCNC
Shigang Tang, Ke Gong, Jun Wang, Kewu Peng, Chang-Yong Pan, Zhixing Yang
2007 J jnl
IEEE Trans. Broadcast.
Jian Song, Zhixing Yang, Lin Yang, Ke Gong, Chang-Yong Pan, Jun Wang, Youshou Wu
2006 J jnl
IEEE Trans. Broadcast.
Jian-Tao Wang, Jian Song, Jun Wang, Chang-Yong Pan, Zhixing Yang, Lin Yang
2006 conf
VTC Fall
Qijia Liu, Zhixing Yang, Jian Song, Chang-Yong Pan
2006 J jnl
IEEE Trans. Broadcast.
Jian-Tao Wang, Jian Song, Jun Wang, Chang-Yong Pan, Zhixing Yang, Lin Yang
2006 conf
ICWN
Jintao Wang, Jian Song, Chang-Yong Pan, Jun Wang, Zhixing Yang
2006 conf
VTC Spring
Shigang Tang, Chang-Yong Pan, Ke Gong, Zhixing Yang
2006 B conf
PIMRC
Shigang Tang, Ke Gong, Chang-Yong Pan, Jun Wang, Zhixing Yang
2006 conf
VTC Fall
Changqing Liu, Xingbo Guo, Jian Song, Chang-Yong Pan, Zhixing Yang
2005 J jnl
IEEE Trans. Broadcast.
Zhixing Yang, Haidong Fang, Chang-Yong Pan
2005 B conf
PIMRC
Jintao Wang, Zhixing Yang, Chang-Yong Pan
2005 J jnl
IEEE Trans. Consumer Electron.
Jintao Wang, Zhixing Yang, Chang-Yong Pan, Jian Song, Lin Yang
2005 J jnl
IEEE Trans. Broadcast.
Zi-Wei Zheng, Zhixing Yang, Chang-Yong Pan, Yi-Sheng Zhu
2005 J jnl
IEEE Trans. Consumer Electron.
Jun Wang, Zhixing Yang, Chang-Yong Pan, Jian Song, Lin Yang
2005 J jnl
IEEE Trans. Broadcast.
Jian Fu, Chang-Yong Pan, Zhixing Yang, Lin Yang
2004 J jnl
IEEE Trans. Broadcast.
Zhixing Yang, Meng Han, Chang-Yong Pan, Jun Wang, Lin Yang, Aidong Men
2004 J jnl
Wirel. Commun. Mob. Comput.
Zi-Wei Zheng, Zhixing Yang, Yi-Sheng Zhu, Chang-Yong Pan
2004 J jnl
IEEE Trans. Broadcast.
Zi-Wei Zheng, Zhixing Yang, Chang-Yong Pan, Yi-Sheng Zhu
2004 J jnl
IEEE Trans. Consumer Electron.
Zi-Wei Zheng, Zhixing Yang, Chang-Yong Pan, Yi-Sheng Zhu
2004 J jnl
IEEE Trans. Consumer Electron.
Zi-Wei Zheng, Zhixing Yang, Chang-Yong Pan, Yi-Sheng Zhu
2004 J jnl
IEEE Trans. Consumer Electron.
Zi-Wei Zheng, Zhixing Yang, Chang-Yong Pan, Yi-Sheng Zhu
2003 J jnl
IEEE Trans. Broadcast.
Jun Wang, Zhixing Yang, Chang-Yong Pan, Meng Han, Lin Yang
2003 B conf
PIMRC
Zhixing Yang, Meng Han, Chang-Yong Pan, Aidong Men, Lin Yang
2003 B conf
PIMRC
Zhi-Zhing Yang, Jun Wang, Chang-Yong Pan, Meng Han, Lin Yang
2003 B conf
PIMRC
Zi-Wei Zheng, Zhixing Yang, Chang-Yong Pan, Yi-Sheng Zhu
2003 J jnl
IEEE Trans. Broadcast.
Zi-Wei Zheng, Zhixing Yang, Chang-Yong Pan, Yi-Sheng Zhu
2003 B conf
PIMRC
Zi-Wei Zheng, Zhixing Yang, Chang-Yong Pan, Yi-Sheng Zhu
2002 J jnl
IEEE Trans. Broadcast.
Zhixing Yang, Yupeng Hu, Chang-Yong Pan, Lin Yang
redb/extractors/ioc_extractor/ioc_extractor.py
← Index redb/extractors/ioc_extractor/ioc_extractor.py python
"""
IOC Extractor - Extractor class for extracting IOCs from decompilation results.

This extractor works with in-memory data from DecompileBinja, following the
standard Extractor pattern to support both ClickHouse and PrintExporter (dry-run).

Usage:
    # After DecompileBinja completes:
    ioc_extractor = IOCExtractorFromResults(
        analysis_results=decompiler.analysis_results,
        sha256=sha256,
        log=logger,
        exporters=exporters,
        index_prefix=index_prefix
    )
    ioc_extractor.export_data()
"""

import inspect
from datetime import datetime, timezone
from pathlib import Path
from typing import Any, List, Dict, Optional

from redb.extractors.enum import Tag
from redb.extractors.database_exporters import DatabaseExporter

# Import the IOCScraper and related classes from standalone module
from redb.extractors.ioc_extractor.standalone_ioc_extractor import (
    IOCScraper,
    IOCType,
    SourceType,
    ExtractedIOC,
)
from typing import Set


class IOCExtractorFromResults:
    """
    Extracts IOCs from in-memory decompilation results.

    This follows a simplified Extractor pattern but doesn't inherit from Extractor
    since it doesn't read from a binary file - instead it takes already-processed
    analysis results from DecompileBinja.
    """

    def __init__(
        self,
        analysis_results: Dict[str, Any],
        sha256: str,
        log: Any,
        exporters: Optional[List[DatabaseExporter]] = None,
        index_prefix: Optional[str] = None,
        tld_file: Optional[Path] = None,
        suppress_types: Optional[Set[IOCType]] = None,
        js_context: bool = False,
    ):
        """
        Initialize IOC Extractor with analysis results.

        Args:
            analysis_results: Dict containing 'strings' and 'decompiled' lists from DecompileBinja
            sha256: Sample SHA256 hash
            log: Logger instance
            exporters: List of database exporters (ClickHouse, Print, etc.)
            index_prefix: Index prefix for database
            tld_file: Optional path to TLD list file
            js_context: When True, the underlying IOCScraper rejects FQDN
                candidates that match JS object-access syntax (see
                JS_FP_TLDS / JS_FP_SLDS). Set this for the JS pipeline only;
                APK suppresses FQDN entirely via suppress_types and binary
                callers leave it disabled.
        """
        self.log = log
        self.log.debug(f"Creating {self.__class__.__name__}")
        self.analysis_results = analysis_results
        self.sha256 = sha256
        self.exporters = exporters or []
        self.index_prefix = index_prefix
        self.scraper = IOCScraper(
            tld_file, suppress_types=suppress_types, js_context=js_context,
        )
        self.extracted_iocs: List[ExtractedIOC] = []

    def extract(self) -> List[ExtractedIOC]:
        """
        Extract IOCs from strings and decompiled functions in analysis_results.

        Returns:
            List of ExtractedIOC objects
        """
        self.log.debug(inspect.currentframe().f_code.co_name)
        self.extracted_iocs = []

        # Extract from strings
        strings_count = self._extract_from_strings()

        # Extract from decompiled functions
        functions_count = self._extract_from_decompiled()

        # Extract from text-based artefact surfaces (JS, PowerShell, etc.)
        text_count = self._extract_from_text()

        self.log.info(
            f"Extracted {len(self.extracted_iocs)} IOCs for {self.sha256[:16]}... "
            f"(strings: {strings_count}, functions: {functions_count}, "
            f"text: {text_count})"
        )

        return self.extracted_iocs

    def _extract_from_strings(self) -> int:
        """Extract IOCs from sample's strings."""
        count = 0
        strings = self.analysis_results.get("strings", [])

        for s in strings:
            string_value = s.get("string", "")
            string_offset = s.get("string_offset", 0)

            if isinstance(string_value, bytes):
                string_value = string_value.decode('utf-8', errors='replace')

            for ioc in self.scraper.scrape(string_value, SourceType.STRING, str(string_offset)):
                self.extracted_iocs.append(ioc)
                count += 1

        return count

    def _extract_from_decompiled(self) -> int:
        """Extract IOCs from sample's decompiled functions.

        Supports both Binja format (key: "decompiled", fields: "decompiled_function",
        "decompiled_function_hash", "function_type") and APK format (key:
        "decompiled_content", fields: "decompiled_method", "decompiled_method_hash",
        "method_type").
        """
        count = 0

        # Binja format
        decompiled = self.analysis_results.get("decompiled", [])
        for func in decompiled:
            func_type = func.get("function_type", "UNKNOWN")
            if func_type in ("LIBRARY", "THUNK"):
                continue

            func_content = func.get("decompiled_function", "")
            func_hash = func.get("decompiled_function_hash", "unknown")

            if isinstance(func_content, bytes):
                func_content = func_content.decode('utf-8', errors='replace')

            for ioc in self.scraper.scrape(func_content, SourceType.DECOMPILED_FUNCTION, func_hash):
                self.extracted_iocs.append(ioc)
                count += 1

        # APK format (decompiled_content with method-level fields)
        decompiled_content = self.analysis_results.get("decompiled_content", [])
        for func in decompiled_content:
            func_type = func.get("method_type", "UNKNOWN")
            if func_type in ("LIBRARY", "THUNK"):
                continue

            func_content = func.get("decompiled_method", "")
            func_hash = func.get("decompiled_method_hash", "unknown")

            if isinstance(func_content, bytes):
                func_content = func_content.decode('utf-8', errors='replace')

            for ioc in self.scraper.scrape(func_content, SourceType.DECOMPILED_FUNCTION, func_hash):
                self.extracted_iocs.append(ioc)
                count += 1

        return count

    def _extract_from_text(self) -> int:
        """Extract IOCs from text-based artefact surfaces.

        Walks `analysis_results["text_raw"]` and `analysis_results["text_normalized"]`,
        each a list of `{"content": str, "content_hash": str}` dicts. Each
        list is routed through its own SourceType (`TEXT_RAW` /
        `TEXT_NORMALIZED`) so analysts can distinguish IOCs that were already
        present in the raw source from those exposed only after normalisation
        (deobfuscation/beautification). Generic across text-based formats —
        used by JS today, intended for PowerShell, Python, email body,
        extracted PDF/Office text in the future.
        """
        count = 0

        for key, source_type in (
            ("text_raw", SourceType.TEXT_RAW),
            ("text_normalized", SourceType.TEXT_NORMALIZED),
        ):
            for entry in self.analysis_results.get(key, []):
                content = entry.get("content", "")
                content_hash = entry.get("content_hash", "unknown")

                if isinstance(content, bytes):
                    content = content.decode('utf-8', errors='replace')

                for ioc in self.scraper.scrape(content, source_type, content_hash):
                    self.extracted_iocs.append(ioc)
                    count += 1

        return count

    def prepare_export_data(self, exporter_type: str) -> Any:
        """
        Prepare data for specific export type.

        Returns tuple for ClickHouse or list of dicts for Print/Elasticsearch.
        """
        self.log.debug(inspect.currentframe().f_code.co_name)

        if not self.extracted_iocs:
            return None

        now = datetime.now(timezone.utc)

        if exporter_type == "ClickHouseExporter":
            data = [
                [
                    self.sha256,
                    ioc.ioc_type.value,
                    ioc.ioc_value,
                    ioc.source_type.value,
                    ioc.source_identifier,
                    now,
                ]
                for ioc in self.extracted_iocs
            ]

            column_names = [
                "sha256",
                "ioc_type",
                "ioc_value",
                "source_type",
                "source_identifier",
                "extracted_at",
            ]

            column_type_names = [
                "FixedString(64)",
                "Enum8('ipv4'=1, 'ipv6'=2, 'fqdn'=3, 'url'=4, 'email'=5, 'server'=6, "
                "'hash_md5'=10, 'hash_sha1'=11, 'hash_sha256'=12, 'cve'=20, 'cwe'=21, 'cpe'=22, "
                "'crypto_btc'=30, 'crypto_eth'=31, 'crypto_xrp'=32, 'crypto_bch'=33, "
                "'crypto_ada'=34, 'crypto_substrate'=35, 'path_linux'=40, 'path_windows'=41, "
                "'registry_key'=42, 'onion'=50)",
                "String",
                "Enum8('decompiled_function'=1, 'disassembled_function'=2, 'string'=3, "
                "'text_raw'=4, 'text_normalized'=5)",
                "String",
                "DateTime64(3, 'UTC')",
            ]

            return (data, column_names, column_type_names)

        else:
            # For PrintExporter and others - return list of dicts
            return [
                {
                    "sha256": self.sha256,
                    "ioc_type": ioc.ioc_type.value,
                    "ioc_value": ioc.ioc_value,
                    "source_type": ioc.source_type.value,
                    "source_identifier": ioc.source_identifier,
                    "extracted_at": now.isoformat(),
                }
                for ioc in self.extracted_iocs
            ]

    def get_clickhouse_table(self) -> str:
        """Return the ClickHouse table name for IOCs."""
        return "redb_iocs"

    def tag(self) -> str:
        """Return the tag for this extractor."""
        return Tag.IOC.value if hasattr(Tag, 'IOC') else "ioc"

    def export_data(self) -> bool:
        """
        Export extracted IOCs to all configured exporters.

        Returns:
            True if export succeeded, False if failed, None if no data
        """
        self.log.debug(inspect.currentframe().f_code.co_name)

        # First extract the IOCs
        extracted = self.extract()

        if not extracted:
            self.log.debug("No IOCs extracted, skipping export")
            return None

        success = True

        from redb.extractors.database_exporters import PrintExporter, ClickHouseExporter

        for exporter in self.exporters:
            try:
                if isinstance(exporter, PrintExporter):
                    # For PrintExporter, pass the list of dicts
                    export_data = self.prepare_export_data("PrintExporter")
                    success &= exporter.export(export_data)

                elif isinstance(exporter, ClickHouseExporter):
                    # For ClickHouse, pass tuple with table info
                    export_data = self.prepare_export_data("ClickHouseExporter")
                    if export_data:
                        success &= exporter.export(
                            export_data,
                            table=self.get_clickhouse_table(),
                            column_names=export_data[1],
                            column_type_names=export_data[2]
                        )

            except Exception as e:
                self.log.error(f"Error exporting IOCs to {exporter.__class__.__name__}: {e}")
                success = False

        return success