Wahyu Caesarendra

31 papers C 2Journal 21Unranked 8
YearRankTypeTitle / Venue / Authors
2025 J jnl
Inf.
Shoffan Saifullah, Rafal Drezewski, Anton Yudhana, Wahyu Caesarendra, Nurul Huda
2025 J jnl
Earth Sci. Informatics
Robert Kurniawan, Imam Sujono, Wahyu Caesarendra, Bahrul Ilmi Nasution, Prana Ugiana Gio
2025 J jnl
J. King Saud Univ. Comput. Inf. Sci.
Triyanna Widiyaningtyas, Ilham Saifudin, Ilham Ari Elbaith Zaeni, Moh. Zulfiqar Naufal Maulana, Wahyu Caesarendra
2025 J jnl
Neural Comput. Appl.
Shoffan Saifullah, Rafal Drezewski, Anton Yudhana, Maciej Wielgosz, Wahyu Caesarendra
2025 J jnl
J. Intell. Manuf.
Mochamad Denny Surindra, Gusti Ahmad Fanshuri Alfarisy, Wahyu Caesarendra, Mohamad Iskandar Petra, Totok Prasetyo, Tegoeh Tjahjowidodo, Grzegorz Królczyk, Adam Glowacz, Munish Kumar Gupta
2024 J jnl
Digit.
Selamat Muslimin, Ekawati Prihatini, Nyayu Latifah Husni, Tresna Dewi, Mukhidin Wartam Bin Umar, Auvi Crisanta Ana Bela, Sri Utami Handayani, Wahyu Caesarendra
2024 J jnl
Simul. Model. Pract. Theory
Guntur Danang Wijaya, Wahyu Caesarendra, Mohamad Iskandar Petra, Grzegorz Królczyk, Adam Glowacz
2023 C conf
INDIN
Kirana Astari Pranoto, Wahyu Caesarendra, Mohamad Iskandar Petra, Grzegorz Królczyk, Mochamad Denny Surindra, Putri Wulandari Yoyo
2023 J jnl
Knowl. Eng. Data Sci.
Heni Sumarti, Fahira Septiani, Agus Sudarmanto, Wahyu Caesarendra, Edmi Edison Rizki
2023 C conf
IECON
I Ketut Adi Purnawan, Adhi Dharma Wibawa, Wahyu Caesarendra, Mauridhi Hery Purnomo
2022 conf
IWBIS
Lalu Syamsul Khalid, Grafika Jati, Wahyu Caesarendra, Wisnu Jatmiko
2022 J jnl
J. King Saud Univ. Comput. Inf. Sci.
Silvester Dian Handy Permana, Gusti Saputra, Budi Arifitama, Yaddarabullah, Wahyu Caesarendra, Robbi Rahim
2021 J jnl
Sensors
Muhammad Irfan, Abdullah S. Alwadie, Adam Glowacz, Muhammad Awais, Saifur Rahman, Mohammad Kamal Asif Khan, Mohammad Jalalah, Omar AlShorman, Wahyu Caesarendra
2021 conf
IWBIS
Sengli Egani Sitepu, Grafika Jati, Machmud Roby Alhamidi, Wahyu Caesarendra, Wisnu Jatmiko
2021 J jnl
Sensors
Yondha Dwika Arferiandi, Wahyu Caesarendra, Herry Nugraha
2021 conf
IWBIS
Putri Shaniya, Grafika Jati, Machmud Roby Alhamidi, Wahyu Caesarendra, Wisnu Jatmiko
2020 J jnl
Symmetry
Totok Prasetyo, Mochamad Denny Surindra, Wahyu Caesarendra, Taufik, Adam Glowacz, Muhammad Irfan, Witold Glowacz
2020 J jnl
Symmetry
Vigneashwara Pandiyan, Wahyu Caesarendra, Adam Glowacz, Tegoeh Tjahjowidodo
2020 J jnl
Symmetry
Moh Arozi, Wahyu Caesarendra, Mochammad Ariyanto, M. Munadi, Joga Dharma Setiawan, Adam Glowacz
2019 J jnl
Algorithms
Annisa Darmawahyuni, Siti Nurmaini, Sukemi, Wahyu Caesarendra, Vicko Bhayyu, Muhammad Naufal Rachmatullah, Firdaus
2018 J jnl
Appl. Soft Comput.
Wahyu Caesarendra, Tomi Wijaya, Tegoeh Tjahjowidodo, Bobby K. Pappachan, Arthur Wee, Muhammad Izzat Roslan
2018 conf
SCIS&ISIS
Vigneashwara Pandiyan, Tegoeh Tjahjowidodo, Wahyu Caesarendra, Gunasekaran Praveen, Tomi Wijaya, Bobby K. Pappachan
2018 J jnl
CoRR
Wahyu Caesarendra, Mahardhika Pratama, Tegoeh Tjahjowidodo, Kiet Tieu, Buyung Kosasih
2017 J jnl
Sensors
Bobby K. Pappachan, Wahyu Caesarendra, Tegoeh Tjahjowidodo, Tomi Wijaya
2017 conf
PACRIM
Tomi Wijaya, Wahyu Caesarendra, Bobby K. Pappachan, Tegoeh Tjahjowidodo, Arthur Wee, Muhammad Izzat Roslan
2015 conf
AIM
Wahyu Caesarendra, Farika T. Putri, Mochammad Ariyanto, Joga Dharma Setiawan
2015 conf
AIM
Wahyu Caesarendra, Jong Myeong Lee, Jung Min Ha, Byeong-Keun Choi
2013 conf
AIM
Wahyu Caesarendra, Buyung Kosasih, Kiet Tieu, Craig A. S. Moodie
2011 J jnl
IEEE Trans. Reliab.
Wahyu Caesarendra, Achmad Widodo, Hong Thom Pham, Bo-Suk Yang, Joga Dharma Setiawan
2011 J jnl
Expert Syst. Appl.
Achmad Widodo, Min-Chan Shim, Wahyu Caesarendra, Bo-Suk Yang
2010 J jnl
Expert Syst. Appl.
Wahyu Caesarendra, Gang Niu, Bo-Suk Yang
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"