Xianta Jiang

60 papers A* 2B 7Journal 40Unranked 11
YearRankTypeTitle / Venue / Authors
2025 J jnl
CoRR
Soroush Baghernezhad, Elaheh Mohammadreza, Vinicius Prado da Fonseca, Ting Zou, Xianta Jiang
2025 J jnl
Neurocomputing
Wanglong Lu, Hanli Zhao, Xianta Jiang, Xiaogang Jin, Yong-Liang Yang, Kaijie Shi
2025 conf
SysCon
Viral Rasik Galaiya, Ruslan Masinjila, Soheil Khatibi, Thiago Eustaquio Alves de Oliveira, Vinicius Prado da Fonseca, Xianta Jiang
2025 J jnl
IEEE Trans. Vis. Comput. Graph.
Wanglong Lu, Jikai Wang, Xiaogang Jin, Xianta Jiang, Hanli Zhao
2025 J jnl
Comput. Vis. Media
Wanglong Lu, Xianta Jiang, Xiaogang Jin, Yong-Liang Yang, Minglun Gong, Kaijie Shi, Tao Wang, Hanli Zhao
2025 J jnl
CoRR
Sadman Saumik Islam, Bruna Dalcin Baldasso, Davide Cattaneo, Xianta Jiang, Michelle Ploughman
2025 J jnl
CoRR
Wanglong Lu, Lingming Su, Jingjing Zheng, Vinícius Veloso de Melo, Farzaneh Shoeleh, John Hawkin, Terrence S. Tricco, Hanli Zhao, Xianta Jiang
2025 J jnl
CoRR
Kaijie Shi, Wanglong Lu, Hanli Zhao, Vinicius Prado da Fonseca, Ting Zou, Xianta Jiang
2025 J jnl
Pattern Recognit.
Wanglong Lu, Jikai Wang, Tao Wang, Kaihao Zhang, Xianta Jiang, Hanli Zhao
2024 J jnl
Sci. China Inf. Sci.
Xiaoqin Zhang, Ziwei Huang, Jingjing Zheng, Shuo Wang, Xianta Jiang
2024 J jnl
CoRR
Wanglong Lu, Jikai Wang, Xiaogang Jin, Xianta Jiang, Hanli Zhao
2024 conf
CCECE
Viral Rasik Galaiya, Thiago Eustaquio Alves de Oliveira, Xianta Jiang, Vinicius Prado da Fonseca
2024 conf
ECCV (14)
Jingjing Zheng, Wanglong Lu, Wenzhe Wang, Yankai Cao, Xiaoqin Zhang, Xianta Jiang
2024 B conf
ETRA
Ziang Wu, Xianta Jiang, Jingjing Zheng, Bin Zheng, M. Stella Atkins
2024 J jnl
J. Electronic Imaging
Jikai Wang, Wanglong Lu, Yu Wang, Kaijie Shi, Xianta Jiang, Hanli Zhao
2024 J jnl
CoRR
Wanglong Lu, Jikai Wang, Tao Wang, Kaihao Zhang, Xianta Jiang, Hanli Zhao
2023 J jnl
CoRR
Jingjing Zheng, Wenzhe Wang, Xiaoqin Zhang, Xianta Jiang
2023 J jnl
IEEE Access
Ziwei Huang, Jingjing Zheng, Li Zhao, Huiling Chen, Xianta Jiang, Xiaoqin Zhang
2023 B conf
ETRA
Yu Wang, Wanglong Lu, Hanli Zhao, Xianta Jiang, Bin Zheng, M. Stella Atkins
2023 J jnl
Frontiers Comput. Sci.
Xin Zhang, Yuxuan Zhou, Xianta Jiang
2023 J jnl
Sensors
Viral Rasik Galaiya, Mohammed Asfour, Thiago Eustaquio Alves de Oliveira, Xianta Jiang, Vinicius Prado da Fonseca
2023 J jnl
CoRR
Wanglong Lu, Xianta Jiang, Xiaogang Jin, Yong-Liang Yang, Minglun Gong, Tao Wang, Kaijie Shi, Hanli Zhao
2023 J jnl
CoRR
Jingjing Zheng, Wenzhe Wang, Xiaoqin Zhang, Yankai Cao, Xianta Jiang
2023 J jnl
Int. J. Hum. Comput. Interact.
Xin Liu, Yao Zhang, Xianta Jiang, Bin Zheng
2023 B conf
ETRA
Xianta Jiang, Ziang Wu, Jingjing Zheng, Bin Zheng, M. Stella Atkins
2023 J jnl
CoRR
Shuo Wang, Terrence S. Tricco, Xianta Jiang, Charles Robertson, John Hawkin
2023 conf
Canadian AI
Jingjing Zheng, John Hawkin, Charles Robertson, Alexander J. M. Howse, Yuanzhu Chen, Xianta Jiang
2022 J jnl
Sensors
Jiaoyang Lu, Ting Zou, Xianta Jiang
2022 J jnl
Frontiers Neurorobotics
Oliver Heeb, Arnab Barua, Carlo Menon, Xianta Jiang
2022 J jnl
CoRR
Xiaoqin Zhang, Ziwei Huang, Jingjing Zheng, Shuo Wang, Xianta Jiang
2022 J jnl
CoRR
Wanglong Lu, Hanli Zhao, Xianta Jiang, Xiaogang Jin, Min Wang, Jiankai Lyu, Kaijie Shi
2022 A* conf
AAAI
Jingjing Zheng, Xiaoqin Zhang, Wenzhe Wang, Xianta Jiang
2022 J jnl
Frontiers Robotics AI
Shuo Wang, Jingjing Zheng, Ziwei Huang, Xiaoqin Zhang, Vinicius Prado da Fonseca, Bin Zheng, Xianta Jiang
2022 J jnl
Frontiers Artif. Intell.
Wenting Hu, Owen Combden, Xianta Jiang, Syamala Buragadda, Caitlin J. Newell, Maria C. Williams, Andrew Critch, Michelle Ploughman
2022 J jnl
Intell. Serv. Robotics
Vinicius Prado da Fonseca, Xianta Jiang, Emil M. Petriu, Thiago Eustaquio Alves de Oliveira
2022 J jnl
IEEE Access
Umme Zakia, Arnab Barua, Xianta Jiang, Carlo Menon
2021 J jnl
Sensors
Mohammed Asfour, Carlo Menon, Xianta Jiang
2021 J jnl
IEEE Access
Arnab Barua, Umme Zakia, Carlo Menon, Xianta Jiang
2020 J jnl
Sensors
Xianta Jiang, Christopher Napier, Brett C. Hannigan, Janice J. Eng, Carlo Menon
2020 J jnl
J. Medical Syst.
Shang Lu, Yerly Paola Sanchez Perdomo, Xianta Jiang, Bin Zheng
2019 J jnl
Sensors
Xianta Jiang, Mohsen Gholami, Mahta Khoshnam, Janice J. Eng, Carlo Menon
2019 J jnl
Frontiers Robotics AI
Maram Sakr, Xianta Jiang, Carlo Menon
2018 J jnl
Sensors
Xianta Jiang, Kelvin H. T. Chu, Mahta Khoshnam, Carlo Menon
2018 J jnl
IEEE Trans. Hum. Mach. Syst.
Xianta Jiang, Lukas-Karim Merhi, Carlo Menon
2018 J jnl
Virtual Real.
Xianta Jiang, Zhen-Gang Xiao, Carlo Menon
2017 B conf
SMC
Xianta Jiang, Kelvin H. T. Chu, Carlo Menon
2017 conf
CYBCONF
Julius Schöning, Xianta Jiang, Carlo Menon, Gunther Heidemann
2017 conf
IWBBIO (1)
Him Wai Ng, Xianta Jiang, Lukas-Karim Merhi, Carlo Menon
2017 J jnl
Int. J. Hum. Comput. Interact.
Miaomiao Dong, Ling Chen, Liwen Wang, Xianta Jiang, Gencai Chen
2016 conf
ETVIS
Bin Zheng, Xianta Jiang, Roman Bednarik, M. Stella Atkins
2016 conf
CCECE
Ahmed M. Elnady, Sajad Mohamadzadeh, Xianta Jiang, Carlo Menon
2015 J jnl
Int. J. Hum. Comput. Stud.
Xianta Jiang, Bin Zheng, Roman Bednarik, M. Stella Atkins
2014 B conf
ETRA
Xianta Jiang, M. Stella Atkins, Geoffrey Tien, Bin Zheng, Roman Bednarik
2014 A* conf
CHI
Xianta Jiang, M. Stella Atkins, Geoffrey Tien, Roman Bednarik, Bin Zheng
2014 B conf
ETRA
Geoffrey Tien, M. Stella Atkins, Xianta Jiang, Bin Zheng, Roman Bednarik
2013 conf
MMVR
Geoffrey Tien, M. Stella Atkins, Xianta Jiang, Rana S. A. Khan, Bin Zheng
2013 conf
MMVR
Xianta Jiang, Bin Zheng, Geoffrey Tien, M. Stella Atkins
2012 B conf
ETRA
M. Stella Atkins, Xianta Jiang, Geoffrey Tien, Bin Zheng
2007 J jnl
J. Comput. Sci. Technol.
Yunjun Gao, Chun Li, Gencai Chen, Ling Chen, Xianta Jiang, Chun Chen
2006 conf
ADVIS
Yunjun Gao, Chun Li, Gencai Chen, Ling Chen, Xianta Jiang, Chun Chen
redb/extractors/macho_extractors/macho_similarity_hashes.py
← Index redb/extractors/macho_extractors/macho_similarity_hashes.py python
import inspect
from datetime import datetime, timezone
from typing import Any

from redb.extractors.enum import Tag
from redb.extractors.macho_extractor import MachOExtractor


class MachOSimilarityHashExtractor(MachOExtractor):
    """Extract Mach-O similarity hashes using machofile API.

    Similarity hashes are MD5 fingerprints of sorted, deduplicated binary components:
    - dylib_hash: MD5 of dynamic library names
    - import_hash: MD5 of imported function names
    - export_hash: MD5 of exported symbol names
    - entitlement_hash: MD5 of entitlement names and array values
    - symhash: MD5 of external undefined symbols

    For FAT binaries:
    - Inserts one row per architecture slice with per-slice hashes
    - Inserts one row for the FAT container with combined hashes

    For single-arch binaries:
    - Inserts one row with that architecture's hashes

    Note: parent_sha256 and architecture relationships are tracked in redb_basic_properties,
    not duplicated here. Use JOIN with redb_basic_properties when needed.
    """

    def __init__(
        self,
        filepath,
        log,
        exporters=None,
        index_prefix=None,
        elastic_index=None,
        known_benign=False,
        known_malicious=False,
        macho=None,
    ):
        super().__init__(
            filepath,
            log,
            exporters,
            index_prefix,
            elastic_index,
            known_benign,
            known_malicious,
            macho,
        )
        self.elastic_index = self.index_prefix + "-macho_hashes"
        self.log.debug(inspect.currentframe().f_code.co_name)

    def tag(self):
        return Tag.MACHO_HASHES.value

    def _extract_similarity_hashes(self, arch_name=None):
        """Extract similarity hashes for a specific architecture."""
        self.log.debug(inspect.currentframe().f_code.co_name)

        if not self.macho:
            return None

        try:
            similarity_hashes = self.macho.get_similarity_hashes(arch=arch_name)
            return similarity_hashes if similarity_hashes else None
        except Exception as e:
            self.log.error(f"Error extracting similarity hashes for arch {arch_name}: {e}")
            return None

    def extract(self):
        self.log.debug(inspect.currentframe().f_code.co_name)
        try:
            if not self.macho:
                return None

            architectures = self.macho.get_architectures()
            if not architectures:
                return None

            if len(architectures) > 1:
                # FAT binary - return combined hashes + per-arch hashes
                results = []

                # First add combined hashes for the FAT container
                all_hashes = self.macho.get_similarity_hashes()
                combined_hashes = all_hashes.get('combined', {}) if all_hashes else {}
                if combined_hashes:
                    combined_hashes['arch_identifier'] = 'fat'
                    results.append(combined_hashes)

                # Then add per-arch hashes
                for arch_name in architectures:
                    hashes = self._extract_similarity_hashes(arch_name)
                    if hashes:
                        hashes['arch_identifier'] = arch_name
                        results.append(hashes)
                return results
            else:
                # Single architecture - return single result
                return self._extract_similarity_hashes(architectures[0])
        except Exception as e:
            self.log.error(f"Error extracting similarity hashes: {e}")
            return None

    def prepare_export_data(self, exporter_type: str) -> Any:
        if exporter_type == "ElasticsearchExporter":
            return self.extract()
        elif exporter_type == "ClickHouseExporter":
            if not self.macho:
                return None

            try:
                architectures = self.macho.get_architectures()
                is_fat = len(architectures) > 1
            except Exception as e:
                self.log.error(f"Could not get architectures: {e}")
                return None

            data = []
            current_time = datetime.now(timezone.utc)

            # For FAT binaries, first insert a row for the container with combined hashes
            if is_fat:
                all_hashes = self.macho.get_similarity_hashes()  # Without arch returns all including 'combined'
                combined_hashes = all_hashes.get('combined', {}) if all_hashes else {}
                if combined_hashes:
                    data.append([
                        self.sha256,                                    # sha256 (FAT container)
                        combined_hashes.get('dylib_hash'),              # dylib_hash
                        combined_hashes.get('import_hash'),             # import_hash
                        combined_hashes.get('export_hash'),             # export_hash
                        combined_hashes.get('entitlement_hash'),        # entitlement_hash
                        combined_hashes.get('symhash'),                 # symhash
                        current_time,                                   # analysis_date
                    ])

            # Insert rows for each architecture slice
            for arch_name in architectures:
                # Get architecture-specific sha256
                try:
                    arch_general_info = self.macho.get_general_info(arch=arch_name)
                    arch_sha256 = arch_general_info.get('SHA256', self.sha256)
                except Exception as e:
                    self.log.warning(f"Could not get arch-specific sha256 for {arch_name}: {e}")
                    arch_sha256 = self.sha256

                # Get similarity hashes for this architecture
                similarity_hashes = self._extract_similarity_hashes(arch_name)
                if not similarity_hashes:
                    continue

                data.append([
                    arch_sha256,                                    # sha256 (arch-specific)
                    similarity_hashes.get('dylib_hash'),            # dylib_hash
                    similarity_hashes.get('import_hash'),           # import_hash
                    similarity_hashes.get('export_hash'),           # export_hash
                    similarity_hashes.get('entitlement_hash'),      # entitlement_hash
                    similarity_hashes.get('symhash'),               # symhash
                    current_time,                                   # analysis_date
                ])

            if not data:
                return None

            column_names = [
                'sha256',
                'macho_dylib_hash', 'macho_import_hash', 'macho_export_hash',
                'macho_entitlement_hash', 'macho_symhash',
                'analysis_date'
            ]

            column_type_names = [
                'FixedString(64)',
                'Nullable(FixedString(32))', 'Nullable(FixedString(32))', 'Nullable(FixedString(32))',
                'Nullable(FixedString(32))', 'Nullable(FixedString(32))',
                'DateTime64(3, \'UTC\')'
            ]

            return (data, column_names, column_type_names)

        return None

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