Xiaofan Xu

34 papers B 1C 1Journal 19Unranked 13
YearRankTypeTitle / Venue / Authors
2026 J jnl
IEEE Trans. Cogn. Commun. Netw.
Kun Li, Jian Jiao, Jianhao Huang, Zhou Xu, Qunying Sun, Xiaofan Xu, Ye Wang, Qinyu Zhang
2026 J jnl
IEEE J. Sel. Areas Commun.
Qi Zhang, Kun Qiu, Zhe Chen, Wenjun Zhu, Xiaofan Xu, Ping Du, Yue Gao
2026 J jnl
Neurocomputing
Yu Liang, Mingji Dong, Xiaofan Xu, Ping Du, Maozhen Li, Zuqing Zhu
2025 J jnl
IEEE Trans. Veh. Technol.
Siyuan Wang, Xingjian Zhang, Chen Liao, Yang Zhang, Xiaofan Xu, Quansheng Xu, Ye Wang, Qinyu Zhang, Zhuoming Li
2025 J jnl
CoRR
Qi Zhang, Kun Qiu, Zhe Chen, Wenjun Zhu, Xiaofan Xu, Ping Du, Yue Gao
2025 conf
ISSTA Companion
Xiaofan Xu, Wei Song, Jeff Huang
2025 J jnl
Proc. ACM Softw. Eng.
Wei Song, Xiaofan Xu, Jeff Huang
2025 J jnl
CoRR
Zhixin Guo, Qi Shi, Xiaofan Xu, Sixiang Shan, Limin Qin, Linqiang Ge, Rui Zhang, Ya Dai, Hua Zhu, Guowei Jiang
2025 J jnl
IEEE Trans. Netw. Sci. Eng.
Tao Yang, Jian Jiao, Qunying Sun, Jianhao Huang, Ke Zhang, Xiaofan Xu, Ye Wang, Qinyu Zhang
2025 J jnl
IEEE Access
Peng Wang, Aonan Zhang, Haozhe Lang, Xiaofan Xu, Shichen Zhang, Lijuan Diao
2024 J jnl
IEEE Trans. Instrum. Meas.
Shuiqing Xu, Xiaofan Xu, Jian Wang, Hai Wang, Yi Chai, Hongtian Chen, Mahesh Krishnamurthy
2024 J jnl
IEEE Trans. Circuits Syst. I Regul. Pap.
Shuiqing Xu, Xiaofan Xu, Haibo Du, Hai Wang, Yi Chai, Wei Xing Zheng, Hongtian Chen
2024 B conf
WCNC
Ting Xiong, Xiaofan Xu, Ping Du, Yueyue Zhang, Ran Zhang, Jiang Liu
2024 J jnl
Qual. Reliab. Eng. Int.
Qian He, Weian Yan, Weidong Liu, David Bigaud, Xiaofan Xu, Zitong Lei
2023 conf
WCSP
Yunyao Dong, Xiaofan Xu, Yueyue Zhang, Siming Wang, Ping Du, Du Xu, Xiaoning Zhang
2023 conf
WCSP
Xiaofan Xu, Yueyue Zhang, Xi Chen, Xinyue Cao, Qunying Sun, Feng Yan, Ping Du
2023 J jnl
Reliab. Eng. Syst. Saf.
Weian Yan, Xiaofan Xu, David Bigaud, Wenqin Cao
2023 J jnl
Remote. Sens.
Xiaofan Xu, Minghong Tan, Xiaoyu Liu, Xue Wang, Liangjie Xin
2021 conf
ICCT
Niwei Wang, Tengwei Wang, Xuekun Han, Xiaofan Xu, Guo Li
2020 J jnl
Neurocomputing
Xiaofan Xu, Sam Caulfield, Joao Amaro, Gabriel Falcão, David Moloney
2019 C conf
ISCAS
Hao Zhang, Xiaojing Huang, Jian A. Zhang, Y. Jay Guo, Ruiliang Song, Chun-Ting Wang, Wei Wu, Xiaofan Xu, Zhou Lu
2019 conf
CSPS
Xiaofan Xu, Ni-Wei Wang, Zhou Lu
2019 conf
VTC Fall
Xiaojing Huang, Hao Zhang, Jian A. Zhang, Y. Jay Guo, Ruiliang Song, Xiaofan Xu, Chun-Ting Wang, Zhou Lu, Wei Wu
2019 conf
INNSBDDL
Tomaso Cetto, Jonathan Byrne, Xiaofan Xu, David Moloney
2018 J jnl
CoRR
Xiaofan Xu, Mi Sun Park, Cormac Brick
2018 J jnl
Int. J. Imaging Syst. Technol.
Weisheng Li, Xiaofan Xu, Jiao Du
2018 J jnl
CoRR
Mi Sun Park, Xiaofan Xu, Cormac Brick
2017 conf
ICNC-FSKD
Jonathan Byrne, Sam Caulfield, Léonie Buckley, Xiaofan Xu, Dexmont Peña, Gary Baugh, David Moloney
2017 conf
ICNC-FSKD
Xiaofan Xu, Joao Amaro, Sam Caulfield, Gabriel Falcão, David Moloney
2017 conf
CISP-BMEI
Xiaofan Xu, Joao Amaro, Sam Caulfield, Andrew Forembski, Gabriel Falcão, David Moloney
2017 conf
IWSSIP
Alireza Dehghani, David Moloney, Xiaofan Xu
2017 J jnl
CoRR
Xiaofan Xu, Shaofang Hong, Yongchao Xu
2016 conf
AMDO
Xiaofan Xu, David Corrigan, Alireza Dehghani, Sam Caulfield, David Moloney
2016 conf
SPLINE
Xiaofan Xu, Alireza Dehghani, David Corrigan, Sam Caulfield, David Moloney
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"