Han Cao

45 papers A* 1A 1B 1C 5Journal 23Unranked 14
YearRankTypeTitle / Venue / Authors
2026 conf
CNML
Yuqiang Li, Han Cao, Lin Li
2026 J jnl
IEEE Trans. Serv. Comput.
Yalan Wu, Jiale Huang, Han Cao, Jigang Wu, Longkun Guo, Siew-Kei Lam
2025 J jnl
IEEE Access
Yan Su, Han Cao, Yuxiang Zhou
2025 J jnl
Signal Process.
Tiantian Zhong, Haihong Tao, Haiyun Liao, Han Cao, Huihui Ma, Dawei Song
2025 A* conf
AAAI
Han Cao, Lingwei Wei, Wei Zhou, Songlin Hu
2025 J jnl
CoRR
Han Cao, Lingwei Wei, Wei Zhou, Songlin Hu
2025 J jnl
CoRR
Zengyi Qin, Jinyuan Chen, Yunze Man, Shengcao Cao, Ziqi Pang, Zhuoyuan Wang, Xin Sun, Gen Lin, Han Fang, Ling Zhu, Zixin Xie, Zibu Wei, Tianshu Ran, Haoran Geng, Xander Wu, Zachary Bright, Qizhen Sun, Rui Wang, Yuyang Cai, Song Wang, Jiace Zhao, Han Cao, Yeyang Zhou, Tianrui Liu, Ray Pan, Chongye Yang, Xiang Ren, Bo Zhang, Yutong Ban, Jitendra Malik, Pieter Abbeel
2025 J jnl
Future Gener. Comput. Syst.
Han Cao, Jinquan Zhang, Long Chen, Siyuan Li, Guang Shi
2024 J jnl
Swarm Evol. Comput.
Yu Sun, Han Cao
2024 J jnl
CoRR
Xiangtian Li, Han Cao, Zhaoyang Zhang, Jiacheng Hu, Yuhui Jin, Zihao Zhao
2024 J jnl
CoRR
Xiangtian Li, Xiaobo Wang, Zhen Qi, Han Cao, Zhaoyang Zhang, Ao Xiang
2024 J jnl
CoRR
Han Cao, Zhaoyang Zhang, Xiangtian Li, Chufan Wu, Hansong Zhang, Wenqing Zhang
2024 A conf
ICME
Han Cao, Lingwei Wei, Wei Zhou, Songlin Hu
2024 J jnl
CoRR
Han Cao, Lingwei Wei, Wei Zhou, Songlin Hu
2024 conf
ECML/PKDD (7)
Mengyang Chen, Lingwei Wei, Han Cao, Wei Zhou, Zhou Yan, Songlin Hu
2024 J jnl
CoRR
Han Cao, Augusto Anguita, Charline Warembourg, Xavier Escriba-Montagut, Martine Vrijheid, Juan R. González, Tim Cadman, Verena Schneider-Lindner, Daniel Durstewitz, Xavier Basagaña, Emanuel Schwarz
2023 J jnl
CoRR
Han Cao, Lingwei Wei, Mengyang Chen, Wei Zhou, Songlin Hu
2023 J jnl
CoRR
Mengyang Chen, Lingwei Wei, Han Cao, Wei Zhou, Songlin Hu
2022 J jnl
Data Sci. Eng.
Yuemei Xu, Han Cao, Wanze Du, Wenqing Wang
2022 conf
KSEM (2)
Zongguo Wang, Ziyi Chen, Xinfu He, Han Cao, Yuedong Cui, Meng Wan, Jue Wang, Yangang Wang
2021 J jnl
Sensors
Xiaobiao Shan, Henan Song, Han Cao, Lanshuang Zhang, Xuhang Zhao, Jizhuang Fan
2021 conf
CNCERT
Yuemei Xu, Zuwei Fan, Han Cao
2021 J jnl
CoRR
Arjun Balasubramanian, Adarsh Kumar, Yuhan Liu, Han Cao, Shivaram Venkataraman, Aditya Akella
2020 C conf
IWDW
Yuting Hu, Han Cao, Zhongliang Yang, Yongfeng Huang
2020 C conf
IWDW
Yuting Hu, Zhongliang Yang, Han Cao, Yongfeng Huang
2020 B conf
SOFSEM
Thuy Pham, Nhu Nguyen, Quang Pham, Han Cao, Binh T. Nguyen
2019 conf
SmartWorld/SCALCOM/UIC/ATC/CBDCom/IOP/SCI
Leyi Xue, Han Cao, Fan Ye, Yuehua Qin
2019 J jnl
Int. J. Wirel. Mob. Comput.
Chang Chen, Han Cao, Shaohui Su, Huipeng Chen, Youping Gong, Guojin Chen
2019 conf
OFC
Wei Zhou, Han Cao, Lulu Wang, Jian Wang
2019 conf
MultiTemp
Hong Zhang, Han Cao, Chao Wang, Yinbo Dong, Bo Zhang, Lu Li
2019 C conf
SoMeT
Han Cao, Binh T. Nguyen, Huy Nguyen, Thanh Pham, Lam Do
2019 C conf
IGARSS
Han Cao, Hong Zhang, Chao Wang, Qinghua Ye, Yixian Tang
2019 J jnl
IET Comput. Vis.
Yali Peng, Lingjun Li, Shigang Liu, Jun Li, Han Cao
2018 conf
PCM (2)
Yuhong Wang, Shigang Liu, Yali Peng, Han Cao
2018 J jnl
Bioinform.
Ping Chen, Xinyun Jing, Jian Ren, Han Cao, Pei Hao, Xuan Li
2018 J jnl
Remote. Sens.
Han Cao, Hong Zhang, Chao Wang, Bo Zhang
2018 J jnl
计算机科学
Yao Li, Han Cao, Jing Ma
2017 conf
HCI (30)
Han Cao
2017 J jnl
J. Comput. Aided Mol. Des.
Han Cao, Marcus C. K. Ng, Siti Azma Jusoh, Hio Kuan Tai, Shirley W. I. Siu
2016 C conf
IGARSS
Han Cao, Hong Zhang, Chao Wang, Meng Liu
2013 conf
GreenCom/iThings/CPScom
Fang You, Jianmin Wang, Han Cao, Ting Xie, Ze-Long Tang
2009 conf
FSKD (2)
Xin Fang, Han Cao, Zhao Lu
2008 conf
ICNC (6)
Han Cao, Jun Shi, Junling Lu
2006 conf
APWeb Workshops
Han Cao, Daxin Liu, Rui Fu
2006 conf
ISDA (2)
Xili Wang, Xiyuan Wang, Han Cao
redb/extractors/pe_extractors/pe_inconsistency_tests.py
← Index redb/extractors/pe_extractors/pe_inconsistency_tests.py python
import inspect
from redb.ext.spoof_check import (
    Result,
    checksum_test,
    duplicate_test,
    import_count_test,
    linker_test,
)
from redb.extractors.enum import Tag
from redb.extractors.pe_extractor import PEExtractor
from redb.models.dataclasses import (
    DotNetInconsistencyTests,
    PEInconsistencyTests,
)
from datetime import datetime, timezone
from typing import Any


class PEInconstistencyTestsExtractor(PEExtractor):
    """Collection of functions to perform features inconsistency tests

    A Test where the result is True means that there is an inconsistency.
    At the moments it runs a series of inconsistency tests on PE metadata from
    - spoof_check
    - pescanner
    - dotnetfile
    """

    def __init__(
        self,
        filepath,
        log,
        exporters=None,
        index_prefix=None,
        elastic_index=None,
        known_benign=False,
        known_malicious=False,
        pe=None,
        dotnet=None,
    ):
        super().__init__(
            filepath,
            log,
            exporters,
            index_prefix,
            elastic_index,
            known_benign,
            known_malicious,
            pe,
        )
        self.dotnet = dotnet if dotnet else None
        self.pe_inconsistency_tests = None
        self.dotnet_inconsistency_tests = None
        self.elastic_index = self.index_prefix + "-pe_inconsistency_tests"

    def tag(self):
        return [Tag.PE_INCONSISTENCY_TESTS.value, Tag.DOTNET_INCONSISTENCY_TESTS.value]

    def extract(self):
        self.log.debug(inspect.currentframe().f_code.co_name)
        tests_performed = False

        # Handle PE rich header tests
        try:
            rich_header = self.pe.parse_rich_header()
            if rich_header:
                self.pe_inconsistency_tests = PEInconsistencyTests(
                    test_rich_header_checksum=checksum_test(self.pe, rich_header) == Result.INVALID,
                    test_rich_header_duplicate=duplicate_test(self.pe, rich_header) == Result.INVALID,
                    test_rich_header_linker=linker_test(self.pe, rich_header) == Result.INVALID,
                    test_rich_header_import_count=import_count_test(self.pe, rich_header) == Result.INVALID,
                )
                tests_performed = True
            else:
                self.pe_inconsistency_tests = PEInconsistencyTests(
                    test_rich_header_checksum=None,
                    test_rich_header_duplicate=None,
                    test_rich_header_linker=None,
                    test_rich_header_import_count=None,
                )
        except Exception as e:
            self.log.error(f"Error processing rich header tests for {self.hash.sha256}: {e}")
            self.pe_inconsistency_tests = None

            # self.export_to_elastic([self.pe_inconsistency_tests])

        # Handle .NET tests
        try:
            if self._check_dotnet():
                if not self.dotnet:
                    self.dotnet, self.error = self._generate_dotnetfile_object()
                if self.error:
                    self.log.error(f"Error generating .NET object {self.hash.sha256}: {self.error}")
                self.dotnet_inconsistency_tests = DotNetInconsistencyTests(
                    test_dotnet_data_dir_hidden=self.dotnet.AntiMetadataAnalysis.is_dotnet_data_directory_hidden,
                    test_dotnet_extra_data=self.dotnet.AntiMetadataAnalysis.has_metadata_table_extra_data,
                    test_dotnet_fake_types=self.dotnet.AntiMetadataAnalysis.has_self_referenced_typeref_entries,
                    test_dotnet_invalid_type_ref=self.dotnet.AntiMetadataAnalysis.has_invalid_typeref_entries,
                    test_dotnet_fake_datastreams=self.dotnet.AntiMetadataAnalysis.has_fake_data_streams,
                    test_dotnet_extra_module_table=self.dotnet.AntiMetadataAnalysis.module_table_has_multiple_rows,
                    test_dotnet_extra_assembly_table=self.dotnet.AntiMetadataAnalysis.assembly_table_has_multiple_rows,
                    test_dotnet_invalid_strings_stream=self.dotnet.AntiMetadataAnalysis.has_invalid_strings_stream_entries,
                    test_dotnet_streams_mixed_case=self.dotnet.AntiMetadataAnalysis.has_mixed_case_stream_names,
                    test_dotnet_method_def_invalid_table=self.dotnet.AntiMetadataAnalysis.has_invalid_methoddef_entries,
                    test_dotnet_max_len_exceeding_strings=self.dotnet.AntiMetadataAnalysis.has_max_len_exceeding_strings,
                )
                tests_performed = True
        except Exception as e:
            self.log.error(f"Error processing .NET tests for {self.hash.sha256}: {e}")
            self.dotnet_inconsistency_tests = None

        # self.export_to_elastic([self.dotnet_inconsistency_tests])

        # If no tests were performed, return False to skip database insertion
        if not tests_performed:
            self.log.info("No inconsistency tests were performed.")
            return False

        return True

    def prepare_export_data(self, exporter_type: str) -> Any:
        if exporter_type == "ElasticsearchExporter":
            return [self.pe_inconsistency_tests, self.dotnet_inconsistency_tests]
        elif exporter_type == "ClickHouseExporter":
            current_time = datetime.now(timezone.utc)

            # For PE tests: if no rich header (all True), store NULL instead
            has_rich_header = any([
                hasattr(self.pe_inconsistency_tests, 'test_rich_header_checksum'),
                hasattr(self.pe_inconsistency_tests, 'test_rich_header_duplicate'),
                hasattr(self.pe_inconsistency_tests, 'test_rich_header_linker'),
                hasattr(self.pe_inconsistency_tests, 'test_rich_header_import_count')
            ])
            
            pe_tests = [
                None if not has_rich_header else self.pe_inconsistency_tests.test_rich_header_checksum,
                None if not has_rich_header else self.pe_inconsistency_tests.test_rich_header_duplicate,
                None if not has_rich_header else self.pe_inconsistency_tests.test_rich_header_linker,
                None if not has_rich_header else self.pe_inconsistency_tests.test_rich_header_import_count,
            ]
            
            # For .NET tests: if not a .NET file, store NULL instead of False
            dotnet_tests = [
                self.dotnet_inconsistency_tests.test_dotnet_data_dir_hidden if self.dotnet_inconsistency_tests else None,
                self.dotnet_inconsistency_tests.test_dotnet_extra_data if self.dotnet_inconsistency_tests else None,
                self.dotnet_inconsistency_tests.test_dotnet_fake_types if self.dotnet_inconsistency_tests else None,
                self.dotnet_inconsistency_tests.test_dotnet_invalid_type_ref if self.dotnet_inconsistency_tests else None,
                self.dotnet_inconsistency_tests.test_dotnet_fake_datastreams if self.dotnet_inconsistency_tests else None,
                self.dotnet_inconsistency_tests.test_dotnet_extra_module_table if self.dotnet_inconsistency_tests else None,
                self.dotnet_inconsistency_tests.test_dotnet_extra_assembly_table if self.dotnet_inconsistency_tests else None,
                self.dotnet_inconsistency_tests.test_dotnet_invalid_strings_stream if self.dotnet_inconsistency_tests else None,
                self.dotnet_inconsistency_tests.test_dotnet_streams_mixed_case if self.dotnet_inconsistency_tests else None,
                self.dotnet_inconsistency_tests.test_dotnet_method_def_invalid_table if self.dotnet_inconsistency_tests else None,
                self.dotnet_inconsistency_tests.test_dotnet_max_len_exceeding_strings if self.dotnet_inconsistency_tests else None,
            ]
            
            data = [[
                self.sha256,
                self.md5,
                self.sha1,
                *pe_tests,
                *dotnet_tests,
                current_time
            ]]

            column_names = [
                'sha256', 'md5', 'sha1',
                'test_rich_header_checksum', 'test_rich_header_duplicate', 'test_rich_header_linker', 'test_rich_header_import_count',
                'test_dotnet_data_dir_hidden', 'test_dotnet_extra_data',
                'test_dotnet_fake_types', 'test_dotnet_invalid_type_ref',
                'test_dotnet_fake_datastreams', 'test_dotnet_extra_module_table',
                'test_dotnet_extra_assembly_table', 'test_dotnet_invalid_strings_stream',
                'test_dotnet_streams_mixed_case', 'test_dotnet_method_def_invalid_table',
                'test_dotnet_max_len_exceeding_strings', 'analysis_date'
            ]
            
            column_type_names = [
                'FixedString(64)', 'FixedString(32)', 'FixedString(40)',
                'Nullable(Boolean)', 'Nullable(Boolean)', 'Nullable(Boolean)', 'Nullable(Boolean)',
                'Nullable(Boolean)', 'Nullable(Boolean)', 'Nullable(Boolean)', 'Nullable(Boolean)',
                'Nullable(Boolean)', 'Nullable(Boolean)', 'Nullable(Boolean)', 'Nullable(Boolean)',
                'Nullable(Boolean)', 'Nullable(Boolean)', 'Nullable(Boolean)',
                'DateTime64(3, \'UTC\')'
            ]

            if not data:
                return None

            return (data, column_names, column_type_names)

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