Kai Liu

71 papers A 1Journal 63Unranked 7
YearRankTypeTitle / Venue / Authors
2026 J jnl
IEEE CAA J. Autom. Sinica
Xingxing You, Songyi Dian, Bin Guo, Quan Xiao, Yuqi Zhu, Kai Liu
2025 J jnl
IEEE Trans. Geosci. Remote. Sens.
Haoran Yang, Shipeng Fu, Kai Liu, Xiaomin Yang
2025 J jnl
IEEE Trans. Instrum. Meas.
Haoran Yang, Shipeng Fu, Kai Liu, Xiaomin Yang
2025 J jnl
IEEE Trans. Ind. Informatics
Mei Yang, Gao Qiu, Junyong Liu, Yong Wu, Nina Dai, Yue Shui, Kai Liu
2025 J jnl
IEEE Trans. Instrum. Meas.
Geyou Zhang, Kai Liu, Yipeng Liu, Ce Zhu
2024 conf
ECCV (20)
Geyou Zhang, Ce Zhu, Kai Liu
2024 J jnl
CoRR
Geyou Zhang, Ce Zhu, Kai Liu
2024 J jnl
Knowl. Based Syst.
Haoran Yang, Qilei Li, Bin Meng, Gwanggil Jeon, Kai Liu, Xiaomin Yang
2024 J jnl
Vis. Comput.
Bin Xu, Rushi Jin, Jinhua Li, Bo Zhang, Kai Liu
2024 J jnl
IEEE Trans. Ind. Informatics
Mei Yang, Gao Qiu, Junyong Liu, Youbo Liu, Tingjian Liu, Zhiyuan Tang, Lijie Ding, Yue Shui, Kai Liu
2023 J jnl
Sensors
Bin Xu, Yuanhaoji Sun, Jinhua Li, Zhiyong Deng, Hongyu Li, Bo Zhang, Kai Liu
2023 J jnl
IEEE Trans. Fuzzy Syst.
Xingxing You, Songyi Dian, Kai Liu, Bin Guo, Guofei Xiang, Yuqi Zhu
2023 J jnl
Knowl. Based Syst.
Haoran Yang, Gwanggil Jeon, Kai Liu, Yiguang Liu, Xiaomin Yang
2023 J jnl
IEEE Trans. Comput. Soc. Syst.
Sihan Yang, Xiaomin Yang, Rongzhu Zhang, Kai Liu
2023 J jnl
IEEE Signal Process. Lett.
Daoyong Wang, Xiaomin Yang, Qin Pu, Gwanggil Jeon, Kai Liu
2023 J jnl
CoRR
Geyou Zhang, Ce Zhu, Kai Liu, Yipeng Liu
2023 J jnl
Sensors
Bin Xu, Shangcheng Qu, Jinhua Li, Zhiyong Deng, Hongyu Li, Bo Zhang, Geyou Zhang, Kai Liu
2023 J jnl
Expert Syst. Appl.
Haoran Yang, Xiaomin Yang, Kai Liu, Gwanggil Jeon, Ce Zhu
2023 J jnl
Appl. Intell.
Jiayi Qin, Lihui Chen, Kai Liu, Gwanggil Jeon, Xiaomin Yang
2023 J jnl
IEEE Trans. Image Process.
Jianwen Song, Kai Liu, Arcot Sowmya, Changming Sun
2022 J jnl
IEEE Signal Process. Lett.
Xiaomei Yang, Yubo Mei, Xunyong Hu, Ruiseng Luo, Kai Liu
2022 J jnl
Multim. Syst.
Bin Meng, Xiaomin Yang, Rongzhu Zhang, Kai Liu
2022 J jnl
Multim. Tools Appl.
Yang Zhou, Kai Liu, Qingyu Dou, Zitao Liu, Gwanggil Jeon, Xiaomin Yang
2022 J jnl
Neurocomputing
Jiayi Qin, Feiqiang Liu, Kai Liu, Gwanggil Jeon, Xiaomin Yang
2022 J jnl
Entropy
Yang Liu, Binyu Yan, Rongzhu Zhang, Kai Liu, Gwanggil Jeon, Xiaoming Yang
2022 J jnl
Multim. Tools Appl.
Qingyu Mao, Xiaomin Yang, Rongzhu Zhang, Gwanggil Jeon, Farhan Hussain, Kai Liu
2022 J jnl
IEEE Signal Process. Lett.
Kai Liu, Songlin Ying, Daniel L. Lau, Ce Zhu, Bin Xu
2021 J jnl
J. Real Time Image Process.
Zheng He, Kai Liu, Zitao Liu, Qingyu Dou, Xiaomin Yang
2021 conf
CACRE
Xingxing You, Kai Liu, Songyi Dian, Bin Guo
2021 J jnl
J. Real Time Image Process.
Haoran Yang, Qingyu Dou, Kai Liu, Zitao Liu, Rita Francese, Xiaomin Yang
2021 J jnl
Comput. Electr. Eng.
Yang Zhou, Xiaomin Yang, Rongzhu Zhang, Kai Liu, Marco Anisetti, Gwanggil Jeon
2021 J jnl
J. Parallel Distributed Comput.
Mengjie Wang, Xiaomin Yang, Marco Anisetti, Rongzhu Zhang, Marcelo Keese Albertini, Kai Liu
2021 J jnl
Concurr. Comput. Pract. Exp.
Jiahui Zhu, Qingyu Dou, Lihua Jian, Kai Liu, Farhan Hussain, Xiaomin Yang
2021 J jnl
Concurr. Comput. Pract. Exp.
Qilei Li, Xiaomin Yang, Wei Wu, Kai Liu, Gwanggil Jeon
2021 J jnl
IEEE Access
Wen Xu, Xiaomei Yang, Kai Liu, Qiaoyu Tian, Jin Xu
2021 J jnl
Signal Process. Image Commun.
Yingying Zhang, Chao Ren, Honggang Chen, Ce Zhu, Kai Liu
2021 J jnl
J. Real Time Image Process.
Lining Wang, Zheng He, Bin Meng, Kai Liu, Qingyu Dou, Xiaomin Yang
2020 J jnl
Biomed. Signal Process. Control.
Bin Ji, Jianjun Ren, Xiujuan Zheng, Cong Tan, Rong Ji, Yu Zhao, Kai Liu
2020 J jnl
Artif. Intell. Medicine
Lihui Chen, Xiaomin Yang, Gwanggil Jeon, Marco Anisetti, Kai Liu
2020 J jnl
IEEE Trans. Ind. Informatics
Shipeng Fu, Zhen Li, Kai Liu, Sadia Din, Muhammad Imran, Xiaomin Yang
2020 J jnl
Multim. Tools Appl.
Xiaomin Yang, Wei Wu, Lu Lu, Binyu Yan, Lei Zhang, Kai Liu
2019 J jnl
J. Intell. Fuzzy Syst.
Lihui Chen, Xiaomin Yang, Lu Lu, Kai Liu, Gwanggil Jeon, Wei Wu
2019 conf
ISICDM
Miao Li, Xiujuan Zheng, Kai Liu
2019 J jnl
J. Electronic Imaging
Mengyao Jia, Xiaomin Yang, Kai Liu
2019 A conf
BMVC
Qilei Li, Zhen Li, Lu Lu, Gwanggil Jeon, Kai Liu, Xiaomin Yang
2019 J jnl
CoRR
Qilei Li, Zhen Li, Lu Lu, Gwanggil Jeon, Kai Liu, Xiaomin Yang
2019 J jnl
J. Real Time Image Process.
Xiaomin Yang, Lihua Jian, Wei Wu, Kai Liu, Binyu Yan, Zhili Zhou, Jian Peng
2019 J jnl
Soft Comput.
Shaowu Wu, Wei Wu, Xiaomin Yang, Lu Lu, Kai Liu, Gwanggil Jeon
2019 J jnl
Vis. Comput.
Xiaomei Yang, Jiawei Zhang, Yanan Liu, Xiujuan Zheng, Kai Liu
2018 J jnl
Future Gener. Comput. Syst.
Xiaomin Yang, Lihua Jian, Binyu Yan, Kai Liu, Lei Zhang, Yiguang Liu
2018 J jnl
Int. J. Parallel Program.
Xiaomin Yang, Wei Wu, Binyu Yan, Huiqian Wang, Kai Zhou, Kai Liu
2018 J jnl
IEEE Access
Xiaomin Yang, Wei Wu, Kai Liu, Pyoung Won Kim, Arun Kumar Sangaiah, Gwanggil Jeon
2018 J jnl
Comput. Electr. Eng.
Wei Jiang, Xiaomin Yang, Wei Wu, Kai Liu, Awais Ahmad, Arun Kumar Sangaiah, Gwanggil Jeon
2018 J jnl
Sensors
Qilei Li, Xiaomin Yang, Wei Wu, Kai Liu, Gwanggil Jeon
2018 J jnl
IEEE Access
Xiaomin Yang, Wei Wu, Kai Liu, Pyoung Won Kim, Arun Kumar Sangaiah, Gwanggil Jeon
2018 J jnl
Future Gener. Comput. Syst.
Lihua Jian, Xiaomin Yang, Zhili Zhou, Kai Zhou, Kai Liu
2018 J jnl
Soft Comput.
Xiaomin Yang, Wei Wu, Kai Liu, Wei-long Chen, Zhili Zhou
2018 J jnl
Soft Comput.
Fuyu Tao, Xiaomin Yang, Wei Wu, Kai Liu, Zhili Zhou, Yiguang Liu
2017 J jnl
Multim. Tools Appl.
Wei Wu, Xiaomin Yang, Hong Li, Kai Liu, Lihua Jian, Zhili Zhou
2017 J jnl
Multim. Tools Appl.
Xiaomin Yang, Wei Wu, Kai Liu, Wei-long Chen, Ping Zhang, Zhili Zhou
2017 J jnl
CoRR
Daniel L. Lau, Yu Zhang, Kai Liu
2016 J jnl
J. Syst. Archit.
Wei Wu, Xiaomin Yang, Kai Liu, Yiguang Liu, Binyu Yan, Hua Hua
2016 J jnl
IEEE Geosci. Remote. Sens. Lett.
Yadong Song, Wei Wu, Zheng Liu, Xiaomin Yang, Kai Liu, Wei Lu
2016 J jnl
J. Syst. Archit.
Xiaomin Yang, Wei Wu, Kai Liu, Kai Zhou, Binyu Yan
2016 J jnl
J. Sensors
Xiaomin Yang, Kai Liu, Zhongliang Gan, Binyu Yan
2015 conf
SITIS
Hong Li, Xiaomin Yang, Wei Wu, Kai Liu
2015 conf
ChinaSIP
Yunfei Long, Shuaijun Wang, Wei Wu, Xiaomin Yang, Gwanggil Jeon, Kai Liu
2015 conf
ChinaSIP
Yunfei Long, Shuaijun Wang, Wei Wu, Xiaomin Yang, Gwanggil Jeon, Kai Liu
2015 conf
SITIS
Xiaomin Yang, Wei Wu, Hua Hua, Kai Liu
2012 J jnl
IEEE Trans. Pattern Anal. Mach. Intell.
Yongchang Wang, Kai Liu, Qi Hao, Xianwang Wang, Daniel L. Lau, Laurence G. Hassebrook
2011 J jnl
IEEE Trans. Image Process.
Yongchang Wang, Kai Liu, Qi Hao, Daniel L. Lau, Laurence G. Hassebrook
redb/extractors/macho_extractors/macho_universal.py
← Index redb/extractors/macho_extractors/macho_universal.py python
import hashlib
import inspect
import json
from datetime import datetime, timezone
from typing import Any, List

from redb.extractors.enum import Tag
from redb.extractors.macho_extractor import MachOExtractor
from redb.models.dataclasses import MachOUniversal


class MachOUniversalExtractor(MachOExtractor):

    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_universal"
        self.log.debug(inspect.currentframe().f_code.co_name)

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

    def _extract_universal_info(self):
        """Extract Universal/FAT binary architecture information using new API."""
        self.log.debug(inspect.currentframe().f_code.co_name)

        if not self.macho:
            return None

        try:
            # Parse at Universal level first (new API requirement)
            self.macho.parse()

            # Get architectures using new API
            architectures = self.macho.get_architectures()
            if not architectures:
                return None

            # Check if this is a FAT binary
            is_fat = len(architectures) > 1

            architecture_info = []

            # Extract info for each architecture
            for arch_name in architectures:
                try:
                    # Get general info for this architecture
                    general_info = self.macho.get_general_info(arch=arch_name)

                    # Get header info for this architecture
                    header_info = self.macho.get_macho_header(arch=arch_name)

                    # Get architecture-specific MachO instance for detailed analysis
                    arch_macho = self.macho.get_macho_for_arch(arch_name)

                    # Calculate architecture slice hash (if we can access the raw data)
                    arch_sha256 = None
                    arch_md5 = None
                    arch_sha1 = None

                    # For FAT binaries, try to get slice-specific info
                    if is_fat and arch_macho:
                        try:
                            # This would require access to the slice data
                            # For now, we'll use the general file info
                            arch_sha256 = general_info.get('SHA256', '') if general_info else ''
                            arch_md5 = general_info.get('MD5', '') if general_info else ''
                            arch_sha1 = general_info.get('SHA1', '') if general_info else ''
                        except Exception as e:
                            self.log.debug(f"Could not extract slice hash for {arch_name}: {e}")

                    architecture_info.append({
                        'architecture': arch_name,
                        'arch_sha256': arch_sha256,
                        'arch_md5': arch_md5,
                        'arch_sha1': arch_sha1,
                        'cputype': header_info.get('cputype') if header_info else None,
                        'cpusubtype': header_info.get('cpusubtype') if header_info else None,
                        'filetype': header_info.get('filetype') if header_info else None
                    })

                except Exception as e:
                    self.log.warning(f"Error extracting info for architecture {arch_name}: {e}")
                    continue

            # Create Universal dataclass
            macho_universal = MachOUniversal(
                is_fat=is_fat,
                architecture_count=len(architectures),
                architectures=architectures,
                architecture_info=architecture_info,
                fat_hash=self.sha256,
                fat_md5=self.md5,
                fat_sha1=self.sha1
            )

            return macho_universal

        except Exception as e:
            self.log.error(f"Error extracting MachO Universal info: {e}")
            return None

    def _extract_fat_architecture_mappings(self):
        """Extract detailed FAT binary architecture mappings for database relationships."""
        self.log.debug(inspect.currentframe().f_code.co_name)

        if not self.macho:
            return []

        try:
            # Parse at Universal level first
            self.macho.parse()

            # Get architectures using new API
            architectures = self.macho.get_architectures()
            if not architectures or len(architectures) <= 1:
                return []  # Not a FAT binary

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

            # For each architecture, create a mapping record
            for arch_name in architectures:
                try:
                    # Get general info
                    general_info = self.macho.get_general_info()

                    # Create mapping record for FAT binary architecture table
                    mapping = {
                        'fat_hash': self.sha256,  # SHA256 of the FAT binary
                        'architecture': arch_name,
                        'arch_sha256': general_info.get('SHA256', '') if general_info else '',  # Will need proper slice extraction
                        'arch_md5': general_info.get('MD5', '') if general_info else '',
                        'arch_sha1': general_info.get('SHA1', '') if general_info else '',
                        'arch_filename': f"{general_info.get('Filename', '')}.{arch_name}" if general_info else '',
                        'analysis_date': current_time
                    }
                    mappings.append(mapping)

                except Exception as e:
                    self.log.warning(f"Error creating mapping for architecture {arch_name}: {e}")
                    continue

            return mappings

        except Exception as e:
            self.log.error(f"Error extracting FAT architecture mappings: {e}")
            return []

    def extract(self):
        self.log.debug(inspect.currentframe().f_code.co_name)
        try:
            universal_info = self._extract_universal_info()
            return universal_info
        except Exception as e:
            self.log.error(f"Error extracting MachO Universal info: {e}")
            return None

    def extract_fat_binary_basic_properties_data(self):
        """Extract data needed for creating multiple BasicProperties records for FAT binaries.

        Returns:
            Tuple: (is_fat, fat_sha256, architectures_info) where:
                - is_fat: bool indicating if this is a FAT binary
                - fat_sha256: SHA256 of the FAT wrapper
                - architectures_info: dict with arch names and their hashes
        """
        self.log.debug(inspect.currentframe().f_code.co_name)

        if not self.macho:
            return False, None, {}

        try:
            # Parse at Universal level first
            self.macho.parse()

            # Get architectures using new API
            architectures = self.macho.get_architectures()
            if not architectures or len(architectures) <= 1:
                return False, None, {}  # Not a FAT binary

            # This is a FAT binary
            architectures_info = {}

            for arch_name in architectures:
                try:
                    # Get general info for this architecture
                    general_info = self.macho.get_general_info(arch=arch_name)

                    if general_info:
                        architectures_info[arch_name] = {
                            'sha256': general_info.get('SHA256', ''),
                            'md5': general_info.get('MD5', ''),
                            'sha1': general_info.get('SHA1', ''),
                            'filename': general_info.get('Filename', ''),
                            'filesize': general_info.get('Filesize', 0)
                        }
                except Exception as e:
                    self.log.warning(f"Error extracting info for architecture {arch_name}: {e}")
                    continue

            return True, self.sha256, architectures_info

        except Exception as e:
            self.log.error(f"Error extracting FAT binary data: {e}")
            return False, None, {}

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

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

            # Get architecture info for the binary
            try:
                if universal_info.is_fat:
                    # For FAT binaries, architecture fields should be NULL since it contains multiple
                    architecture_raw = None
                    architecture_str = None
                else:
                    # For single-arch binaries, get the actual architecture info
                    header_info = self.macho.get_macho_header()
                    architecture_raw = header_info.get('cputype', 0) if header_info else 0
                    architecture_str = universal_info.architectures[0] if universal_info.architectures else None
            except Exception as e:
                self.log.warning(f"Could not get architecture info for binary: {e}")
                architecture_raw = None
                architecture_str = None

            # Main Universal binary record
            data.append([
                self.sha256,                              # sha256
                self.md5,                                 # md5
                self.sha1,                                # sha1
                None,                                     # parent_sha256 (always None for main FAT binary)
                architecture_raw,                         # architecture (raw CPU type)
                architecture_str,                         # architecture_str (human-readable)
                universal_info.is_fat,                    # is_fat
                universal_info.architecture_count,       # architecture_count
                universal_info.architectures,            # architectures (array)
                json.dumps(universal_info.architecture_info[0] if len(universal_info.architecture_info) == 1 else {"architectures": universal_info.architecture_info}) if universal_info.architecture_info else None,  # architecture_info (JSON)
                current_time,                             # analysis_date
            ])

            column_names = [
                'sha256', 'md5', 'sha1', 'parent_sha256', 'architecture', 'architecture_str',
                'is_fat', 'architecture_count', 'architectures', 'architecture_info',
                'analysis_date'
            ]

            column_type_names = [
                'FixedString(64)', 'FixedString(32)', 'FixedString(40)',
                'Nullable(FixedString(64))', 'Nullable(UInt32)', 'LowCardinality(Nullable(String))',
                'UInt8', 'UInt32', 'Array(LowCardinality(String))', 'JSON',
                'DateTime64(3, \'UTC\')'
            ]

            return (data, column_names, column_type_names)

        return None

    def prepare_fat_architecture_export_data(self) -> Any:
        """Prepare export data for the FAT binary architecture mapping table."""
        mappings = self._extract_fat_architecture_mappings()
        if not mappings:
            return None

        data = []
        for mapping in mappings:
            data.append([
                mapping['fat_hash'],
                mapping['architecture'],
                mapping['arch_sha256'],
                mapping['arch_md5'],
                mapping['arch_sha1'],
                mapping['arch_filename'],
                mapping['analysis_date'],
            ])

        column_names = [
            'fat_hash', 'architecture', 'arch_sha256', 'arch_md5', 'arch_sha1',
            'arch_filename', 'analysis_date'
        ]

        column_type_names = [
            'FixedString(64)', 'LowCardinality(String)', 'FixedString(64)',
            'FixedString(32)', 'FixedString(40)', 'String',
            'DateTime64(3, \'UTC\')'
        ]

        return (data, column_names, column_type_names)

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

    # def get_fat_architecture_table(self) -> str:
    #     """Return table name for FAT binary architecture mappings."""
    #     return "redb_fat_binary_architectures"