Nan An

49 papers A* 2B 1Journal 40Unranked 6
YearRankTypeTitle / Venue / Authors
2026 J jnl
Concurr. Comput. Pract. Exp.
Nan An, Linglin Wang, Le Han, Hui Zhang
2026 J jnl
CoRR
Hanbing Liu, Chunhao Tian, Nan An, Ziyuan Wang, Pinyan Lu, Changyuan Yu, Qi Qi
2026 J jnl
Pattern Recognit.
Tengyu Ma, Xiaoke Shang, Jiafa Ruan, Yuetong Wang, Benzhuang Zhang, Nan An
2026 J jnl
IEEE Trans. Wirel. Commun.
Nan An, Hongyi He, Fang Yang, Chang Liu, Jian Song, Zhu Han, Binbin Zhu
2026 J jnl
IEEE Trans. Wirel. Commun.
Qi Zhang, Fang Yang, Nan An, Zehao Liu, Jian Song, Zhu Han
2025 J jnl
CoRR
Nan An, Mingtong Chen, Zhengbao Yang
2025 J jnl
CoRR
Nan An, Weian Li, Qi Qi, Changyuan Yu, Liang Zhang
2025 J jnl
Int. J. Comput. Vis.
Long Ma, Dian Jin, Nan An, Jinyuan Liu, Xin Fan, Zhongxuan Luo, Risheng Liu
2025 J jnl
NeuroImage
Fulong Wang, Fuzhi Cao, Yujie Ma, Ruochen Zhao, Ruonan Wang, Nan An, Min Xiang, Dawei Wang, Xiaolin Ning
2025 J jnl
NeuroImage
Fulong Wang, Fuzhi Cao, Yujie Ma, Ruochen Zhao, Ruonan Wang, Nan An, Min Xiang, Dawei Wang, Xiaolin Ning
2025 J jnl
IEEE Internet Things J.
Nan An, Hongyi He, Fang Yang, Chang Liu, Ling Cheng, Jian Song, Zhu Han, Binbin Zhu
2025 A* conf
ACM Multimedia
Nan An, Siqi Xu, Long Ma, Zhu Liu, Guangchao Han, Tengyu Ma, Risheng Liu
2025 conf
ICC Workshops
Jiaji Liu, Fang Yang, Nan An, Jian Song, Zhu Han
2025 B conf
GLOBECOM
Nan An, Biling Zhang, Caili Guo, Yang Yang
2025 conf
ICBRA
Chunhui Wang, Wen Li, Zhenfeng Gao, Min Xiang, Fuzhi Cao, Nan An, Xiaolin Ning
2025 A* conf
AAAI
Nan An, Weian Li, Qi Qi, Liang Zhang
2025 J jnl
CoRR
Nan An, Weian Li, Qi Qi, Liang Zhang
2025 J jnl
IEEE Trans. Instrum. Meas.
Chunhui Wang, Fuzhi Cao, Wen Li, Wenli Wang, Yong Li, Weinan Xu, Jianzhi Yang, Nan An
2025 conf
ICC
Qi Zhang, Fang Yang, Nan An, Jian Song, Zhu Han
2025 J jnl
Comput. Electron. Agric.
Yanqiang Zhang, Na Li, Lijie Zhang, Nan An, Xiao Gao, Guangyi Chen
2025 J jnl
IEEE Internet Things J.
Nan An, Fang Yang, Chang Liu, Ling Cheng, Jian Song, Zhu Han
2025 J jnl
IEEE Trans. Medical Imaging
Wen Li, Fuzhi Cao, Nan An, Wenli Wang, Chunhui Wang, Weinan Xu, Yang Gao, Xiaolin Ning
2025 J jnl
IEEE Trans. Medical Imaging
Wen Li, Nan An, Fuzhi Cao, Wenli Wang, Chunhui Wang, Weinan Xu, Yang Gao, Xiaolin Ning
2025 J jnl
NeuroImage
Wen Li, Nan An, Zhenfeng Gao, Junjian Tang, Jianzhi Yang, Xin Ma, Min Xiang, Fuzhi Cao
2025 J jnl
IEEE Trans. Instrum. Meas.
Zhenfeng Gao, Fuzhi Cao, Nan An, Wen Li, Wenli Wang, Jianzhi Yang, Dawei Wang, Xiaolin Ning
2025 conf
ICBRA
Zhenfeng Gao, Zhipeng Zhang, Mingxiao Shao, Chenxi Wu, Jiawei Gao, Min Xiang, Nan An, Fuzhi Cao
2025 J jnl
IEEE Trans. Circuits Syst. Video Technol.
Nan An, Long Ma, Guangchao Han, Xin Fan, Risheng Liu
2025 J jnl
CoRR
Nan An, Long Ma, Guangchao Han, Xin Fan, Risheng Liu
2025 J jnl
IEEE Internet Things J.
Jiaji Liu, Fang Yang, Nan An, Jian Song, Zhu Han
2024 J jnl
IEEE Internet Things J.
Shiyuan Sun, Nan An, Fang Yang, Jian Song, Zhu Han
2024 J jnl
IEEE Wirel. Commun. Lett.
Nan An, Fang Yang, Ling Cheng, Jian Song, Zhu Han
2024 J jnl
IEEE Trans. Wirel. Commun.
Nan An, Fang Yang, Ling Cheng, Jian Song, Zhu Han
2024 J jnl
IEEE Trans. Wirel. Commun.
Shiyuan Sun, Weidong Mei, Fang Yang, Nan An, Jian Song, Rui Zhang
2024 conf
ICC
Nan An, Fang Yang, Ling Cheng, Jian Song, Zhu Han
2024 J jnl
NeuroImage
Wen Li, Fuzhi Cao, Nan An, Wenli Wang, Chunhui Wang, Weinan Xu, Dexin Yu, Min Xiang, Xiaolin Ning
2024 J jnl
Comput. Methods Programs Biomed.
Nan An, Zhenfeng Gao, Wen Li, Fuzhi Cao, Wenli Wang, Weinan Xu, Chunhui Wang, Min Xiang, Yang Gao, Dawei Wang, Dexin Yu, Xiaolin Ning
2023 J jnl
CoRR
Long Ma, Dian Jin, Nan An, Jinyuan Liu, Xin Fan, Risheng Liu
2023 J jnl
CoRR
Gongning Luo, Kuanquan Wang, Jun Liu, Shuo Li, Xinjie Liang, Xiangyu Li, Shaowei Gan, Wei Wang, Suyu Dong, Wenyi Wang, Pengxin Yu, Enyou Liu, Hongrong Wei, Na Wang, Jia Guo, Huiqi Li, Zhao Zhang, Ziwei Zhao, Na Gao, Nan An, Ashkan Pakzad, Bojidar Rangelov, Jiaqi Dou, Song Tian, Zeyu Liu, Yi Wang, Ampatishan Sivalingam, Kumaradevan Punithakumar, Zhaowen Qiu, Xin Gao
2023 J jnl
IEEE Veh. Technol. Mag.
Nan An, Fang Yang, Ling Cheng, Jian Song, Zhu Han
2023 J jnl
IEEE Trans. Medical Imaging
Fuzhi Cao, Nan An, Weinan Xu, Wenli Wang, Wen Li, Chunhui Wang, Min Xiang, Yang Gao, Xiaolin Ning
2023 J jnl
CoRR
Shiyuan Sun, Weidong Mei, Fang Yang, Nan An, Jian Song, Rui Zhang
2023 J jnl
Comput. Biol. Medicine
Fuzhi Cao, Zhenfeng Gao, Shengjie Qi, Kaihua Chen, Min Xiang, Nan An, Xiaolin Ning
2022 J jnl
IEEE Trans. Instrum. Meas.
Fuzhi Cao, Nan An, Wenli Wang, Weinan Xu, Wen Li, Chunhui Wang, Min Xiang, Yang Gao, Xiaolin Ning
2022 J jnl
IEEE Trans. Biomed. Eng.
Nan An, Fuzhi Cao, Wen Li, Wenli Wang, Weinan Xu, Chunhui Wang, Yang Gao, Min Xiang, Xiaolin Ning
2022 J jnl
Comput. Phys. Commun.
Qingquan Pan, Nan An, Tengfei Zhang, Xiaojing Liu, Yun Cai, Lianjie Wang, Kan Wang
2022 J jnl
IEEE Trans. Broadcast.
Nan An, Cong Zou, Chao Zhang, Changyong Pan, Fang Yang, Jian Song
2019 conf
HICSS
Ilsang Ko, Xiaolong Wei, Nan An
2017 J jnl
Comput. Electron. Agric.
Nan An, Stephen M. Welch, R. J. Cody Markelz, Robert L. Baker, Christine M. Palmer, James Ta, Julin N. Maloof, Cynthia Weinig
2016 J jnl
Comput. Electron. Agric.
Nan An, Christine M. Palmer, Robert L. Baker, R. J. Cody Markelz, James Ta, Michael F. Covington, Julin N. Maloof, Stephen M. Welch, Cynthia Weinig
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"