Chang Wook Ahn

143 papers A* 2A 5B 1Misc 4Journal 84Unranked 45
YearRankTypeTitle / Venue / Authors
2025 J jnl
Neural Comput. Appl.
Taehyeon Kim, Man-Je Kim, Chang Wook Ahn
2025 J jnl
IEEE Access
Wooseok Song, Chang Wook Ahn
2024 conf
CAI
Ananda Phan Iman, Chang Wook Ahn
2024 J jnl
IEEE Access
Taehyeon Kim, Donghyeon Lee, Man-Je Kim, Chang Wook Ahn
2024 J jnl
IEEE Trans. Intell. Transp. Syst.
Kumar Gautam, Chang Wook Ahn
2024 J jnl
Eng. Appl. Artif. Intell.
Man-Je Kim, Donghyeon Lee, Jun Suk Kim, Chang Wook Ahn
2023 J jnl
IEEE Access
Sanghoun Oh, Chang Wook Ahn
2023 J jnl
Expert Syst. Appl.
Man-Je Kim, Jun Suk Kim, Chang Wook Ahn
2023 J jnl
IEEE Access
Dongseok Kang, Chang Wook Ahn
2023 conf
GECCO Companion
Wooseok Song, Chang Wook Ahn
2023 J jnl
Appl. Intell.
Woong-Hyun Suh, Sanghoun Oh, Chang Wook Ahn
2023 conf
CDC
Younkyung Jwa, Minseon Gwak, Jiin Kwak, Chang Wook Ahn, PooGyeon Park
2022 J jnl
IEEE Access
Nikhil Pachauri, Chang Wook Ahn
2022 J jnl
IEEE Access
Jae-Hun Jeong, Eunbin Lee, Jong-Hyun Lee, Chang Wook Ahn
2022 conf
GECCO Companion
Jun Suk Kim, Chang Wook Ahn
2022 J jnl
Future Gener. Comput. Syst.
Jun Suk Kim, Chang Wook Ahn
2021 J jnl
Pattern Recognit. Lett.
Sandeep Mellimi, Vishal Rajput, Irshad Ahmad Ansari, Chang Wook Ahn
2021 J jnl
Knowl. Based Syst.
Tae Jong Choi, Chang Wook Ahn
2021 J jnl
Int. J. Bio Inspired Comput.
Jun Suk Kim, Chang Wook Ahn
2021 J jnl
Expert Syst. Appl.
Donghyeon Lee, Man-Je Kim, Chang Wook Ahn
2021 J jnl
Symmetry
Sanghoun Oh, Woong-Hyun Suh, Chang Wook Ahn
2020 J jnl
IEEE Access
Sangmin Lim, Man-Je Kim, Chang Wook Ahn
2020 J jnl
CoRR
Tae Jong Choi, Chang Wook Ahn
2020 A* conf
AAAI
Donghyeon Lee, Man-Je Kim, Chang Wook Ahn
2020 conf
SMA
Rishi Sinhal, Irshad Ahmad Ansari, Chang Wook Ahn
2020 J jnl
IEEE Access
Rishi Sinhal, Irshad Ahmad Ansari, Chang Wook Ahn
2020 conf
SMA
Chanmin Lee, Chang Wook Ahn
2020 conf
SMA
Man-Je Kim, Jong-Hyun Lee, Chang Wook Ahn
2020 J jnl
Expert Syst. Appl.
Man-Je Kim, Jun Suk Kim, Sungjin James Kim, Min-Jung Kim, Chang Wook Ahn
2020 conf
SMA
Tran Van Khoa, Quang Vinh Dinh, Phuc Hong Nguyen, Narayan C. Debnath, Tuan-Duc Nguyen, Chang Wook Ahn
2020 J jnl
Mach. Vis. Appl.
Phuc Hong Nguyen, Chang Wook Ahn
2020 J jnl
Expert Syst. Appl.
Phuc Nguyen Hong, Chang Wook Ahn
2020 conf
SMA
Gyumin Cho, Younkyung Jwa, Chang Wook Ahn
2020 J jnl
IEEE Access
Phuc Nguyen Hong, Chang Wook Ahn
2019 J jnl
Fundam. Informaticae
Tae Jong Choi, Jong-Hyun Lee, Hee Yong Youn, Chang Wook Ahn
2019 J jnl
Swarm Evol. Comput.
Tae Jong Choi, Chang Wook Ahn
2019 J jnl
IEEE Access
Jong-Hyun Lee, Sangmin Lim, Chang Wook Ahn
2019 conf
BIC-TA (2)
Dongseok Kang, Chang Wook Ahn
2019 conf
BIC-TA (1)
Man-Je Kim, Jun Suk Kim, Donghyeon Lee, Chang Wook Ahn
2019 conf
GECCO (Companion)
Man-Je Kim, Jun Suk Kim, Donghyeon Lee, Sungjin James Kim, Min-Jung Kim, Chang Wook Ahn
2019 J jnl
IEICE Trans. Inf. Syst.
Jun Suk Kim, Chang Wook Ahn
2019 J jnl
Symmetry
Dongju Park, Chang Wook Ahn
2019 J jnl
Symmetry
Phuc Hong Nguyen, Chang Wook Ahn
2018 J jnl
CoRR
Javad Rahimipour Anaraki, Saeed Samet, Mahdi Eftekhari, Chang Wook Ahn
2018 J jnl
KSII Trans. Internet Inf. Syst.
Zahid Muhammad, Abhishek Roy, Chang Wook Ahn, Ruchi Sachan, Navrati Saxena
2018 conf
BIC-TA (2)
Tae Jong Choi, Yun-Gyung Cheong, Chang Wook Ahn
2018 conf
GECCO (Companion)
Tae Jong Choi, Chang Wook Ahn
2018 J jnl
Multim. Tools Appl.
Musrrat Ali, Chang Wook Ahn, Millie Pant
2018 J jnl
Int. J. Syst. Assur. Eng. Manag.
Musrrat Ali, Chang Wook Ahn
2018 conf
GECCO (Companion)
Man-Je Kim, Chang Wook Ahn
2018 conf
BIC-TA (2)
Dongju Park, Chang Wook Ahn
2018 J jnl
IEICE Trans. Fundam. Electron. Commun. Comput. Sci.
Phuc Nguyen Hong, Jaehoon (Paul) Jeong, Chang Wook Ahn
2018 conf
BIC-TA (2)
Jun Suk Kim, Chang Wook Ahn
2017 J jnl
Expert Syst. Appl.
Jaehun Jeong, Yusung Kim, Chang Wook Ahn
2017 conf
BIC-TA
Tae Jong Choi, Chang Wook Ahn
2017 J jnl
Nat. Comput.
Tae Jong Choi, Chang Wook Ahn
2017 J jnl
Multim. Tools Appl.
Irshad Ahmad Ansari, Millie Pant, Chang Wook Ahn
2017 J jnl
Nat. Comput.
Tae Jong Choi, Chang Wook Ahn
2017 J jnl
CAAI Trans. Intell. Technol.
Yunghee Lee, Tae Jong Choi, Chang Wook Ahn
2017 J jnl
IEICE Trans. Fundam. Electron. Commun. Comput. Sci.
Phuc Nguyen Hong, Chang Wook Ahn, Jaehoon (Paul) Jeong
2017 J jnl
Appl. Soft Comput.
Marjan Kaedi, Chang Wook Ahn
2017 conf
SEAL
Kei Ohnishi, Chang Wook Ahn
2016 J jnl
IEICE Trans. Inf. Syst.
Hyun-Tae Kim, Hyun-Kyu Kang, Chang Wook Ahn
2016 conf
BIC-TA (1)
Tae Jong Choi, Jaehun Jeong, Chang Wook Ahn
2016 J jnl
Inf. Sci.
Marjan Kaedi, Nasser Ghasem-Aghaee, Chang Wook Ahn
2016 conf
BIC-TA (1)
Yunghee Lee, Jaehun Jung, Chang Wook Ahn
2016 J jnl
Expert Syst. Appl.
Phuc Nguyen Hong, Chang Wook Ahn
2016 J jnl
IEICE Trans. Fundam. Electron. Commun. Comput. Sci.
Jong-Hyun Lee, Jinung An, Chang Wook Ahn
2016 J jnl
Expert Syst. Appl.
Phuc Nguyen Hong, Chang Wook Ahn
2016 J jnl
Eng. Appl. Artif. Intell.
Irshad Ahmad Ansari, Millie Pant, Chang Wook Ahn
2016 J jnl
Int. J. Mach. Learn. Cybern.
Irshad Ahmad Ansari, Millie Pant, Chang Wook Ahn
2015 conf
BIC-TA
Jaehun Jeong, Chang Wook Ahn
2015 J jnl
Inf. Sci.
Musrrat Ali, Chang Wook Ahn, Millie Pant, Patrick Siarry
2015 J jnl
Expert Syst. Appl.
Musrrat Ali, Chang Wook Ahn
2015 J jnl
Multim. Tools Appl.
Musrrat Ali, Chang Wook Ahn
2015 J jnl
Expert Syst. Appl.
Jong-Hyun Lee, Javad Rahimipour Anaraki, Chang Wook Ahn, Jinung An
2015 J jnl
Expert Syst. Appl.
Mojtaba Rajabi-Bahaabadi, Afshin Shariat-Mohaymany, Mohsen Babaei, Chang Wook Ahn
2015 J jnl
IEICE Trans. Inf. Syst.
Javad Rahimipour Anaraki, Mahdi Eftekhari, Chang Wook Ahn
2015 conf
BIC-TA
Irshad Ahmad Ansari, Millie Pant, Chang Wook Ahn, Jaehun Jeong
2015 conf
SocProS (2)
Irshad Ahmad Ansari, Millie Pant, Chang Wook Ahn
2014 J jnl
IEICE Trans. Inf. Syst.
Hyun-Tae Kim, Jinung An, Chang Wook Ahn
2014 J jnl
J. Comput.
Tae Jong Choi, Chang Wook Ahn
2014 conf
BIC-TA
Tae Jong Choi, Chang Wook Ahn
2014 conf
BIC-TA
Jong-Hyun Lee, Jinung An, Chang Wook Ahn
2014 J jnl
Signal Process.
Musrrat Ali, Chang Wook Ahn
2014 J jnl
Eng. Appl. Artif. Intell.
Musrrat Ali, Chang Wook Ahn, Patrick Siarry
2014 J jnl
IET Image Process.
Jae-Chern Yoo, Chang Wook Ahn
2014 J jnl
Appl. Soft Comput.
Musrrat Ali, Chang Wook Ahn, Millie Pant
2013 conf
BIC-TA
Kang Sun, Chang Wook Ahn
2013 conf
AIM
Jong-Hyun Lee, Chang Wook Ahn, Jinung An
2013 J jnl
Sci. China Inf. Sci.
Jinung An, Jong-Hyun Lee, Chang Wook Ahn
2013 conf
SDE
Musrrat Ali, Chang Wook Ahn, Millie Pant
2013 conf
ICUIMC
Musrrat Ali, Chang Wook Ahn
2013 conf
SocProS (1)
Musrrat Ali, Chang Wook Ahn, Millie Pant
2013 conf
BIC-TA
Kang Sun, Chang Wook Ahn
2013 J jnl
Sci. China Inf. Sci.
Marjan Kaedi, Nasser Ghasem-Aghaee, Chang Wook Ahn
2013 conf
SIS
Tarun Kumar Sharma, Millie Pant, Chang Wook Ahn
2013 J jnl
Digit. Signal Process.
Jae-Chern Yoo, Chang Wook Ahn
2012 J jnl
Inf. Sci.
Ngoc Hoang Luong, Hai Thanh Thi Nguyen, Chang Wook Ahn
2012 J jnl
Inf. Sci.
Chang Wook Ahn, Jinung An, Jae-Chern Yoo
2012 conf
ICUIMC
Jong-Hyun Lee, Hyun-Tae Kim, Chang Wook Ahn
2012 B conf
SMC
Kei Ohnishi, Mario Köppen, Chang Wook Ahn, Kaori Yoshida
2012 J jnl
Int. J. Artif. Intell. Tools
Musrrat Ali, Millie Pant, Ajith Abraham, Chang Wook Ahn
2012 J jnl
J. Univers. Comput. Sci.
Musrrat Ali, Millie Pant, Atulya K. Nagar, Chang Wook Ahn
2011 conf
FGIT-MulGraB (2)
Chang Wook Ahn, Sanghoun Oh, Moonyoung Oh
2011 conf
WCIT
Hyun-Tae Kim, Jong-Hyun Lee, Chang Wook Ahn
2011 conf
BIC-TA
Jong-Hyun Lee, Chang Wook Ahn
2011 conf
GECCO (Companion)
Jong-Hyun Lee, Chang Wook Ahn
2011 conf
ICUIMC
Chang Wook Ahn, Jong-Hyun Lee
2010 J jnl
Appl. Intell.
Chang Wook Ahn, Rudrapatna S. Ramakrishna
2010 J jnl
Math. Comput. Model.
Chang Wook Ahn, Eungyeong Kim, Hyun-Tae Kim, Dong-Hyun Lim, Jinung An
2010 J jnl
IEICE Trans. Commun.
Chang Wook Ahn, Ju Yeop Choi, Dong-Ha Lee, Jinung An
2010 conf
BIC-TA
Eungyeong Kim, Chang Wook Ahn
2010 A conf
GECCO
Hai T. T. Nguyen, Hoang N. Luong, Chang Wook Ahn
2010 conf
IEA/AIE (2)
Hoang Ngoc Luong, Hai Thanh Thi Nguyen, Chang Wook Ahn
2010 A conf
GECCO
Hoang N. Luong, Hai T. T. Nguyen, Chang Wook Ahn
2010 J jnl
Appl. Soft Comput.
Mohsen Davarynejad, Chang Wook Ahn, Jos L. M. Vrancken, Jan van den Berg, Carlos A. Coello Coello
2010 J jnl
IEICE Trans. Inf. Syst.
Chang Wook Ahn, Yehoon Kim
2010 conf
CCNC
Hye Joong Kang, Chang Wook Ahn, Chung G. Kang
2010 conf
IWACI
Chang Wook Ahn, Minkyu Kim
2009 A conf
GECCO
Chang Wook Ahn, Hyun-Tae Kim
2008 J jnl
IEEE Trans. Evol. Comput.
Chang Wook Ahn, Rudrapatna S. Ramakrishna
2008 J jnl
IEEE Trans. Veh. Technol.
Raed Mesleh, Harald Haas, Sinan Sinanovic, Chang Wook Ahn, Sangboh Yun
2007 A* conf
INFOCOM
Minkyu Kim, Muriel Médard, Varun Aggarwal, Una-May O'Reilly, Wonsik Kim, Chang Wook Ahn, Michelle Effros
2007 J jnl
CoRR
Minkyu Kim, Muriel Médard, Varun Aggarwal, Una-May O'Reilly, Wonsik Kim, Chang Wook Ahn, Michelle Effros
2007 A conf
GECCO
Chang Wook Ahn, Rudrapatna S. Ramakrishna
2006 conf
ICONIP (3)
Sanghoun Oh, Chang Wook Ahn, Rudrapatna S. Ramakrishna
2006 book
Chang Wook Ahn
2006 J jnl
IEICE Trans. Fundam. Electron. Commun. Comput. Sci.
Chang Wook Ahn, Rudrapatna S. Ramakrishna
2006 J jnl
IEICE Trans. Inf. Syst.
Chang Wook Ahn, Rudrapatna S. Ramakrishna
2006 J jnl
Comput. Commun.
Chang Wook Ahn
2006 ch.
Towards a New Evolutionary Computation
Chang Wook Ahn, Rudrapatna S. Ramakrishna, David E. Goldberg
2005 J jnl
IEICE Trans. Inf. Syst.
Nam Hyun Park, Chang Wook Ahn, Rudrapatna S. Ramakrishna
2005 A conf
GECCO
Chang Wook Ahn, Sanghoun Oh, Rudrapatna S. Ramakrishna
2004 J jnl
IEEE Trans. Veh. Technol.
Chang Wook Ahn, Rudrapatna S. Ramakrishna
2004 conf
GECCO (1)
Chang Wook Ahn, Rudrapatna S. Ramakrishna, David E. Goldberg
2003 Misc conf
PPAM
Chang Wook Ahn, Ki Pyo Kim, Rudrapatna S. Ramakrishna
2003 Misc conf
PPAM
Chang Wook Ahn, Rudrapatna S. Ramakrishna
2003 J jnl
IEEE Trans. Evol. Comput.
Chang Wook Ahn, Rudrapatna S. Ramakrishna
2003 Misc conf
PPAM
Chang Wook Ahn, David E. Goldberg, Rudrapatna S. Ramakrishna
2002 J jnl
IEEE Trans. Evol. Comput.
Chang Wook Ahn, Rudrapatna S. Ramakrishna
2002 Misc conf
PDPTA
Hyunmin Kim, Jihye Kim, Chang Wook Ahn, Rudrapatna S. Ramakrishna
2000 J jnl
IEEE J. Sel. Areas Commun.
Chung Gu Kang, Chang Wook Ahn, Kyung Hun Jang, Woo Sik Kang
redb/extractors/macho_extractors/macho_features.py
← Index redb/extractors/macho_extractors/macho_features.py python
import inspect
import json
from datetime import datetime, timezone
from typing import Any

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


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

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

    def _extract_macho_features_for_arch(self, arch_name):
        """Extract basic MachO features for a specific architecture."""
        self.log.debug(inspect.currentframe().f_code.co_name)

        if not self.macho:
            return None

        try:
            # Get general info using new API
            general_info = self.macho.get_general_info()
            if not general_info:
                return None

            # Get header info for this specific architecture
            header_raw = self.macho.get_macho_header(arch=arch_name)
            header_formatted = self.macho.get_macho_header(arch=arch_name, formatted=True)

            if not header_raw or not header_formatted:
                return None

            # Get entry point using new API
            entry_point = None
            try:
                entry_point_info = self.macho.get_entry_point(arch=arch_name)
                if entry_point_info:
                    if isinstance(entry_point_info, dict):
                        entry_point = entry_point_info.get('entryoff') or entry_point_info.get('entry_address')
                    else:
                        entry_point = entry_point_info
            except Exception as e:
                self.log.debug(f"No entry point found: {e}")

            # Get UUID using new API
            uuid = None
            try:
                uuid_info = self.macho.get_uuid(arch=arch_name)
                if uuid_info:
                    uuid = str(uuid_info)
            except Exception as e:
                self.log.debug(f"No UUID found: {e}")

            # Get version info using new API with formatting
            version_info = None
            version_info_str = None
            try:
                version_info = self.macho.get_version_info(arch=arch_name)
                version_info_str = self.macho.get_version_info(arch=arch_name, formatted=True)
            except Exception as e:
                self.log.debug(f"No version info found: {e}")

            # Get segments using new API
            segments = self.macho.get_segments(arch=arch_name)
            number_of_segments = len(segments) if segments else 0

            # Get dylib info using new API
            dylib_names = self.macho.get_dylib_names(arch=arch_name)
            number_of_dylibs = len(dylib_names) if dylib_names else 0

            # Count imports using new API
            imported_functions = self.macho.get_imported_functions(arch=arch_name)
            number_of_imports = sum(len(funcs) for funcs in imported_functions.values()) if imported_functions else 0

            # Count exports using new API
            exported_symbols = self.macho.get_exported_symbols(arch=arch_name)
            number_of_exports = sum(len(symbols) for symbols in exported_symbols.values()) if exported_symbols else 0

            # Get unique load command types using new API
            load_commands_set = self.macho.get_load_commands_set(arch=arch_name, formatted=True)
            if isinstance(load_commands_set, set):
                load_commands_set = sorted(list(load_commands_set))

            # Get architectures for listing purposes
            architectures = self.macho.get_architectures()

            # Determine binary properties
            is_64bit = header_raw.get('magic') in [0xFEEDFACF, 0xCFFAEDFE]  # MH_MAGIC_64, MH_CIGAM_64
            is_signed = self._is_signed()
            
            # Create MachO dataclass
            macho_features = MachO(
                # Raw values from new API
                magic=header_raw.get('magic', 0),
                cputype=header_raw.get('cputype', 0),
                cpusubtype=header_raw.get('cpusubtype', 0),
                filetype=header_raw.get('filetype', 0),
                ncmds=header_raw.get('ncmds', 0),
                sizeofcmds=header_raw.get('sizeofcmds', 0),
                flags=header_raw.get('flags', 0),
                architecture=header_raw.get('cputype', 0),  # Use cputype as architecture
                architectures=[arch_info.get('cputype', 0) for arch_info in [self.macho.get_macho_header(arch=arch) for arch in architectures] if arch_info],
                # Human-readable values from formatted API
                magic_str=header_formatted.get('magic', ''),
                cputype_str=header_formatted.get('cputype', ''),
                cpusubtype_str=header_formatted.get('cpusubtype', ''),
                filetype_str=header_formatted.get('filetype', ''),
                flags_str=header_formatted.get('flags', '').split(', ') if header_formatted.get('flags') else [],
                architecture_str=header_formatted.get('cputype', ''),
                architectures_str=[arch_info.get('cputype', '') for arch_info in [self.macho.get_macho_header(arch=arch, formatted=True) for arch in architectures] if arch_info],
                # Additional properties
                is_64bit=is_64bit,
                is_signed=is_signed,
                number_of_load_commands=header_raw.get('ncmds', 0),
                load_commands_set=load_commands_set,
                number_of_segments=number_of_segments,
                number_of_dylibs=number_of_dylibs,
                number_of_imports=number_of_imports,
                number_of_exports=number_of_exports,
                entry_point=entry_point,
                uuid=uuid,
                version_info=version_info,
                version_info_str=version_info_str
            )
            
            return macho_features
            
        except Exception as e:
            self.log.error(f"Error extracting MachO features: {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

            # For FAT binaries, return features for all architectures
            # For single arch, return just the single result
            if len(architectures) > 1:
                # FAT binary - return list of features for each architecture
                results = []
                for arch_name in architectures:
                    features = self._extract_macho_features_for_arch(arch_name)
                    if features:
                        # Add architecture identifier to the result
                        if hasattr(features, '__dict__'):
                            # If it's a dataclass, we can access its dict
                            features.arch_identifier = arch_name
                        results.append(features)
                return results
            else:
                # Single architecture - return single result
                return self._extract_macho_features_for_arch(architectures[0])
        except Exception as e:
            self.log.error(f"Error extracting MachO features: {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

            # Get architectures (macho is already parsed in __init__)
            try:
                architectures = self.macho.get_architectures()
            except Exception as e:
                self.log.error(f"Could not get architectures: {e}")
                return None

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

            # Loop through each architecture (1 for single, multiple for FAT)
            for arch_name in architectures:
                # Extract features for this specific architecture
                macho_features = self._extract_macho_features_for_arch(arch_name)
                if not macho_features:
                    continue

                # 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 hash for {arch_name}: {e}")
                    arch_sha256 = self.sha256

                # Architecture field (kept in features table for ORDER BY)
                architecture = macho_features.cputype    # Raw CPU type value

                data.append([
                    arch_sha256,                          # sha256 (architecture-specific)
                    architecture,                         # architecture (raw CPU type)
                    # Raw values
                    macho_features.magic,                 # magic
                    macho_features.cputype,               # cputype
                    macho_features.cpusubtype,            # cpusubtype
                    macho_features.filetype,              # filetype
                    macho_features.ncmds,                 # ncmds
                    macho_features.sizeofcmds,            # sizeofcmds
                    macho_features.flags,                 # flags
                    # Human-readable values
                    macho_features.magic_str,             # magic_str
                    macho_features.cputype_str,           # cputype_str
                    macho_features.cpusubtype_str,        # cpusubtype_str
                    macho_features.filetype_str,          # filetype_str
                    macho_features.flags_str,             # flags_str
                    # Other fields
                    macho_features.is_64bit,              # is_64bit
                    macho_features.is_signed,             # is_signed
                    macho_features.entry_point if macho_features.entry_point else None,           # entry_point
                    macho_features.uuid if macho_features.uuid else None,  # uuid
                    json.dumps(macho_features.version_info) if macho_features.version_info else "{}",  # version_info
                    json.dumps(macho_features.version_info_str) if macho_features.version_info_str else "{}",  # version_info_str
                    macho_features.load_commands_set,     # load_commands_set
                    macho_features.number_of_segments,    # number_of_segments
                    macho_features.number_of_dylibs,      # number_of_dylibs
                    macho_features.number_of_imports,     # number_of_imports
                    macho_features.number_of_exports,     # number_of_exports
                    current_time,                         # analysis_date
                ])

            column_names = [
                'sha256', 'architecture',
                # Raw values
                'magic', 'cputype', 'cpusubtype', 'filetype', 'ncmds', 'sizeofcmds', 'flags',
                # Human-readable values
                'magic_str', 'cputype_str', 'cpusubtype_str', 'filetype_str', 'flags_str',
                # Other fields
                'is_64bit', 'is_signed',
                'entry_point', 'uuid', 'version_info', 'version_info_str', 'load_commands_set',
                'number_of_segments', 'number_of_dylibs', 'number_of_imports', 'number_of_exports',
                'analysis_date'
            ]

            if not data:
                return None

            column_type_names = [
                'FixedString(64)', 'Nullable(UInt32)',
                # Raw values
                'UInt32', 'UInt32', 'UInt32', 'UInt32', 'UInt32', 'UInt32', 'UInt32',
                # Human-readable values
                'LowCardinality(String)', 'LowCardinality(String)', 'LowCardinality(String)', 'LowCardinality(String)', 'Array(LowCardinality(String))',
                # Other fields
                'UInt8', 'UInt8',
                'Nullable(UInt64)', 'Nullable(String)', 'JSON', 'JSON', 'Array(Nullable(String))',
                'UInt32', 'UInt32', 'UInt32', 'UInt32', 'DateTime64(3, \'UTC\')'
            ]

            return (data, column_names, column_type_names)
        
        return None

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