Ramakrishnan Raman

44 papers C 1Journal 31Unranked 12
YearRankTypeTitle / Venue / Authors
2026 C conf
ICCE
Varsha Arya, Akshat Gaurav, Priyanka Chaurasia, Kwok Tai Chui, Brij B. Gupta, Ramakrishnan Raman
2026 J jnl
Comput. Electr. Eng.
Brij B. Gupta, Akshat Gaurav, Shin-Hung Pan, Varsha Arya, Wadee Alhalabi, Kwok Tai Chui, Ramakrishnan Raman, Nadia Nedjah
2025 J jnl
Int. J. Cloud Appl. Comput.
Iman Akour, Mohammad Alauthman, Ammar Almomani, Ramakrishnan Raman, Varsha Arya
2025 J jnl
Inf. Syst. Manag.
Mahmud Akhter Shareef, Irfan Butt, F. Tegwen Malik, Ramakrishnan Raman, Yogesh K. Dwivedi
2025 J jnl
SN Comput. Sci.
Sandeep Kumar Hegde, Rajalaxmi Hegde, C. Naveen Kumar, R. Meenakshi, Ramakrishnan Raman, G. M. Jayaseelan
2025 J jnl
Ann. Oper. Res.
Ramakrishnan Raman, Pranav Vyas, Hardik Vachharajani
2025 J jnl
Int. J. Web Inf. Syst.
Vincent Shin-Hung Pan, Akshat Gaurav, Saoucene Mahfoudh, Turki Althaqafi, Wadee Alhalabi, Ramakrishnan Raman, Ching-Hsien Hsu
2025 J jnl
J. Comput. Inf. Syst.
Keng-Boon Ooi, Garry Wei-Han Tan, Mostafa Al-Emran, Mohammed A. Al-Sharafi, Alexandru Capatina, Amrita Chakraborty, Yogesh K. Dwivedi, Tzu-Ling Huang, Arpan Kumar Kar, Voon-Hsien Lee, Xiu-Ming Loh, Adrian Micu, Patrick Mikalef, Emmanuel Mogaji, Neeraj Pandey, Ramakrishnan Raman, Nripendra P. Rana, Prianka Sarker, Anshuman Sharma, Ching-I Teng, Samuel Fosso Wamba, Lai-Wan Wong
2025 J jnl
Ind. Manag. Data Syst.
Keng-Boon Ooi, Alex Koohang, Eugene Cheng-Xi Aw, Tat Huei Cham, Cihan Cobanoglu, Charles Dennis, Yogesh K. Dwivedi, Jun-Jie Hew, Heather Linton Kelly, Laurie Hughes, Chieh-Yu Lin, Anubhav Mishra, Ian Phau, Ramakrishnan Raman, Marianna Sigala, Yun-Chia Tang, Lai-Wan Wong, Garry Wei-Han Tan
2024 J jnl
Int. J. Inf. Manag.
Yogesh K. Dwivedi, Anand Jeyaraj, Laurie Hughes, Gareth H. Davies, Manju Ahuja, Mousa Ahmed Albashrawi, Adil S. Al-Busaidi, Salah A. Al-Sharhan, Khalid Ibrahim Al-Sulaiti, Levent Altinay, Shem Amalaya, Sunil Archak, María Teresa Ballestar, Shonil A. Bhagwat, Anandhi Bharadwaj, Amit Bhushan, Indranil Bose, Pawan Budhwar, Deborah Bunker, Alexandru Capatina, Lemuria D. Carter, Ioanna D. Constantiou, Crispin R. Coombs, Tom Crick, Csaba Csáki, Yves Darnige, Rahul Dé, Rick Delbridge, Rameshwar Dubey, Robin Gauld, Ravikumar Gutti, Marié Hattingh, Arve Haug, Leeya Hendricks, Airo Hino, Cathy H. C. Hsu, Netta Iivari, Marijn Janssen, Ikram Jebabli, Paul Jones, Iris A. Junglas, Abhishek Kaushik, Deepak Khazanchi, Mitsuru Kodama, Sascha Kraus, Vikram Kumar, Christian Maier, F. Tegwen Malik, Machdel Matthee, Ian P. McCarthy, Marco Meier, Bhimaraya A. Metri, Adrian Micu, Angela-Eliza Micu, Santosh K. Misra, Anubhav Mishra, Tonja Molin-Juustila, Leif Oppermann, Nicholas O'Regan, Abhipsa Pal, Neeraj Pandey, Ilias O. Pappas, Andrew Parker, Kavita Pathak, Daniel A. Pienta, Ariana Polyviou, Ramakrishnan Raman, Samuel Ribeiro-Navarrete, Paavo Ritala, Michael Rosemann, Suprateek Sarker, Pallavi Saxena, Daniel Schlagwein, Hergen Schultze, Chitra Sharma, Sujeet Kumar Sharma, Antonis C. Simintiras, Vinay Kumar Singh, Hanlie Smuts, John Soldatos, Manoj Kumar Tiwari, Jason Bennett Thatcher, Cristina Vanberghen, Ákos Varga, Polyxeni Vassilakopoulou, Viswanath Venkatesh, Giampaolo Viglia, Tim Vorley, Michael R. Wade, Paul Walton
2024 J jnl
Ann. Oper. Res.
Kawaljeet Kapoor, Ali Ziaee Bigdeli, Yogesh K. Dwivedi, Ramakrishnan Raman
2024 J jnl
Comput. Hum. Behav.
Janarthanan Balakrishnan, Ronnie Das, Ali Abdallah Alalwan, Ramakrishnan Raman, Yogesh K. Dwivedi
2023 J jnl
Inf. Syst. Frontiers
Yogesh K. Dwivedi, Nir Kshetri, Laurie Hughes, Nripendra P. Rana, Abdullah M. Baabdullah, Arpan Kumar Kar, Alex Koohang, Samuel Ribeiro-Navarrete, Nina Belei, Janarthanan Balakrishnan, Sriparna Basu, Abhishek Behl, Gareth H. Davies, Vincent Dutot, Rohita Dwivedi, Leighton Evans, Reto Felix, Richard Foster-Fletcher, Mihalis Giannakis, Ashish Gupta, Chris Hinsch, Animesh Jain, Nina Jane Patel, Timothy Jung, Satinder Juneja, Qeis Kamran, Sanjar Mohamed AB, Neeraj Pandey, Savvas Papagiannidis, Ramakrishnan Raman, Philipp A. Rauschnabel, Preeti Tak, Alexandra Taylor, M. Claudia tom Dieck, Giampaolo Viglia, Yichuan Wang, Meiyi Yan
2023 conf
TDIT (1)
Arpita Gurbaxani, Ramakrishnan Raman
2023 J jnl
Int. J. Inf. Manag.
Yogesh K. Dwivedi, Nir Kshetri, Laurie Hughes, Emma L. Slade, Anand Jeyaraj, Arpan Kumar Kar, Abdullah M. Baabdullah, Alex Koohang, Vishnupriya Raghavan, Manju Ahuja, Hanaa Albanna, Mousa Ahmad Albashrawi, Adil S. Al-Busaidi, Janarthanan Balakrishnan, Yves Barlette, Sriparna Basu, Indranil Bose, Laurence D. Brooks, Dimitrios Buhalis, Lemuria D. Carter, Soumyadeb Chowdhury, Tom Crick, Scott W. Cunningham, Gareth H. Davies, Robert M. Davison, Rahul De', Denis Dennehy, Yanqing Duan, Rameshwar Dubey, Rohita Dwivedi, John S. Edwards, Carlos Flavián, Robin Gauld, Varun Grover, Mei-Chih Hu, Marijn Janssen, Paul Jones, Iris A. Junglas, Sangeeta Khorana, Sascha Kraus, Kai R. Larsen, Paul Latreille, Sven Laumer, F. Tegwen Malik, Abbas Mardani, Marcello Mariani, Sunil Mithas, Emmanuel Mogaji, Jeretta Horn Nord, Siobhán O'Connor, Fevzi Okumus, Margherita Pagani, Neeraj Pandey, Savvas Papagiannidis, Ilias O. Pappas, Nishith Pathak, Jan Pries-Heje, Ramakrishnan Raman, Nripendra P. Rana, Sven-Volker Rehm, Samuel Ribeiro-Navarrete, Alexander Richter, Frantz Rowe, Suprateek Sarker, Bernd Carsten Stahl, Manoj Kumar Tiwari, Wil M. P. van der Aalst, Viswanath Venkatesh, Giampaolo Viglia, Michael R. Wade, Paul Walton, Jochen Wirtz, Ryan T. Wright
2023 conf
TDIT (3)
V. T. Rakesh, Preetha Menon, Ramakrishnan Raman
2023 J jnl
J. Comput. Inf. Syst.
Alex Koohang, Jeretta Horn Nord, Keng-Boon Ooi, Garry Wei-Han Tan, Mostafa Al-Emran, Eugene Cheng-Xi Aw, Abdullah Mohammed Baabdullah, Dimitrios Buhalis, Tat Huei Cham, Charles Dennis, Vincent Dutot, Yogesh K. Dwivedi, Laurie Hughes, Emmanuel Mogaji, Neeraj Pandey, Ian Phau, Ramakrishnan Raman, Anshuman Sharma, Marianna Sigala, Akiko Ueno, Lai-Wan Wong
2023 J jnl
Inf. Syst. Frontiers
Yogesh K. Dwivedi, Elvira Ismagilova, Nripendra P. Rana, Ramakrishnan Raman
2022 conf
IC3I
Pallavi Shetty, Kapil Joshi, Ramakrishnan Raman, K. Naga Venkateshwara Rao, A. Vijaya Kumar, Mohit Tiwari
2022 conf
IC3I
Melanie Lourens, Ramakrishnan Raman, P. Vanitha, Rajesh Singh, Geetha Manoharan, Manoj Kumar Tiwari
2022 J jnl
Data
S. Vijayakumar Bharathi, Dhanya Pramod, Ramakrishnan Raman
2022 conf
IC3I
Ramakrishnan Raman, Rajesh Singh, Soumya Ranjan Sabat, Shivaji Bothe, Shalini Singh, Lalit Thakur
2022 conf
IC3I
Anju J. Prakash, Gargibala Satpathy, Ramakrishnan Raman, E. Manikandan, Dharam Buddhi, Dhiraj Kapila
2022 J jnl
Int. J. Inf. Manag.
Yogesh K. Dwivedi, David Laurie Hughes, Arpan Kumar Kar, Abdullah M. Baabdullah, Purva Grover, Roba Abbas, Daniela Andreini, Iyad Abumoghli, Yves Barlette, Deborah Bunker, Leona Chandra Kruse, Ioanna D. Constantiou, Robert M. Davison, Rahul De', Rameshwar Dubey, Henry Fenby-Taylor, Babita Gupta, Wu He, Mitsuru Kodama, Matti Mäntymäki, Bhimaraya A. Metri, Katina Michael, Johan Olaisen, Niki Panteli, Samuli Pekkola, Rohit Nishant, Ramakrishnan Raman, Nripendra P. Rana, Frantz Rowe, Suprateek Sarker, Brenda Scholtz, Maung Sein, Jeel Dharmeshkumar Shah, Thompson S. H. Teo, Manoj Kumar Tiwari, Morten Thanning Vendelø, Michael R. Wade
2022 J jnl
Int. J. Commun. Networks Inf. Secur.
Luis Alberto Núñez Lira, Kukati Aruna Kumari, Ramakrishnan Raman, Ardhariksa Zukhruf Kurniullah, Santiago Aquiles Gallarday Morales, Tula Del Carmen Espinoza Cordero
2022 conf
IC3I
Chhaya Nayak, Ramakrishnan Raman, P. Dileep, Anita Gehlot, Gogula Laxmi Priyanka, Dhiraj Kapila
2022 conf
IC3I
Ramakrishnan Raman, Khyati R. Nirmal, Anita Gehlot, Snehal Trivedi, Dimple Saini, R. Ponnusamy
2022 conf
I3E
Elvira Ismagilova, Yogesh K. Dwivedi, Nripendra P. Rana, Ramakrishnan Raman
2022 J jnl
Int. J. Inf. Manag.
Sujeet Kumar Sharma, Rahul De', Anand Jeyaraj, Ramakrishnan Raman
2022 conf
IC3I
Chandrashekhar Goswami, Ramakrishnan Raman, Biju G. Pillai, Rajesh Singh, Basava Dhanne, Dhiraj Kapila
2022 J jnl
Int. J. Inf. Manag.
Yogesh K. Dwivedi, David Laurie Hughes, Abdullah M. Baabdullah, Samuel Ribeiro-Navarrete, Mihalis Giannakis, Mutaz M. Al-Debei, Denis Dennehy, Bhimaraya A. Metri, Dimitrios Buhalis, Christy M. K. Cheung, Kieran Conboy, Ronan Doyle, Rameshwar Dubey, Vincent Dutot, Reto Felix, D. P. Goyal, Anders Gustafsson, Chris Hinsch, Ikram Jebabli, Marijn Janssen, Young-Gab Kim, Jooyoung Kim, Stefan Koos, David Kreps, Nir Kshetri, Vikram Kumar, Keng-Boon Ooi, Savvas Papagiannidis, Ilias O. Pappas, Ariana Polyviou, Sang-Min Park, Neeraj Pandey, Maciel Manoel Queiroz, Ramakrishnan Raman, Philipp A. Rauschnabel, Anuragini Shirish, Marianna Sigala, Konstantina Spanaki, Garry Wei-Han Tan, Manoj Kumar Tiwari, Giampaolo Viglia, Samuel Fosso Wamba
2022 conf
IC3I
Ramakrishnan Raman, Jaymin Bhalani, B. Sumathy, Shivaji Bothe, Anita Gehlot, Maddikera Kalyan Chakravarthi
2022 J jnl
Int. J. Commun. Networks Inf. Secur.
Hitesh Keserwani, Himanshu Rastogi, Ardhariksa Zukhruf Kurniullah, Sushil Kumar Janardan, Ramakrishnan Raman, Vinod Motiram Rathod, Ankur Gupta
2022 J jnl
Int. J. Commun. Networks Inf. Secur.
N. Noor Alleema, Ramakrishnan Raman, Fidel Castro-Cayllahua, Vinod Motiram Rathod, Juan Carlos Cotrina-Aliaga, Supriya Sanjay Ajagekar, Reshma Ramakant Kanse
2022 J jnl
Int. J. Inf. Manag. Data Insights
Hemant Tiwari, Ramakrishnan Raman
2022 J jnl
Ann. Oper. Res.
Mahmud Akhter Shareef, Yogesh K. Dwivedi, Vinod Kumar, David Laurie Hughes, Ramakrishnan Raman
2022 conf
IC3I
Ramakrishnan Raman, Rajesh Singh, Zatin Gupta, Shikha Verma, Akshay Rajput, Swapnil M. Parikh
2021 J jnl
Int. J. Inf. Manag.
Yogesh K. Dwivedi, Elvira Ismagilova, David Laurie Hughes, Jamie Carlson, Raffaele Filieri, Jenna Jacobson, Varsha Jain, Heikki Karjaluoto, Hajer Kefi, Anjala S. Krishen, Vikram Kumar, Mohammad M. Rahman, Ramakrishnan Raman, Philipp A. Rauschnabel, Jennifer E. Rowley, Jari Salo, Gina A. Tran, Yichuan Wang
2020 J jnl
Int. J. Inf. Manag.
Yogesh K. Dwivedi, David Laurie Hughes, Crispin R. Coombs, Ioanna D. Constantiou, Yanqing Duan, John S. Edwards, Babita Gupta, Banita Lal, Santosh K. Misra, Prakhar Prashant, Ramakrishnan Raman, Nripendra P. Rana, Sujeet Kumar Sharma, Nitin Upadhyay
2019 J jnl
Int. J. Inf. Manag.
Mahmud Akhter Shareef, Ramakrishnan Raman, Abdullah M. Baabdullah, Rafeed Mahmud, Jashim Uddin Ahmed, Humayun Kabir, Vinod Kumar, Uma Kumar, Muhammad Shakaib Akram, Ahmedul Kabir, Bhasker Mukerji
2017 J jnl
J. Theor. Appl. Electron. Commer. Res.
Ramakrishnan Raman, Dhanya Pramod
2017 J jnl
Inf. Resour. Manag. J.
S. Vijayakumar Bharathi, Dhanya Pramod, Ramakrishnan Raman
2013 J jnl
J. Comput. Sci.
S. Vijayakumar Bharathi, Dhanya Pramod, Ramakrishnan Raman
2012 J jnl
Int. J. Syst. Assur. Eng. Manag.
Marco Aiello, Nitin Agarwal, Ramakrishnan Raman, Urvashi Rathod
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"