Mamoru Mimura

60 papers B 2C 4Misc 8Journal 26Unranked 20
YearRankTypeTitle / Venue / Authors
2025 J jnl
Clust. Comput.
Mamoru Mimura, Kazuyuki Kurashina
2024 Misc ed.
IWSEC
Kazuhiko Minematsu, Mamoru Mimura
2024 J jnl
Internet Things
Mamoru Mimura, Takayuki Ishimaru
2024 J jnl
IEEE Access
Yuhei Otsubo, Akira Otsuka, Mamoru Mimura
2024 conf
ICICS (1)
Kou Sugiura, Mamoru Mimura
2024 J jnl
IEEE Access
Mamoru Mimura, Satoki Kanno
2024 J jnl
J. Inf. Process.
Phung Minh Ngoc, Mamoru Mimura
2023 J jnl
IEEE Access
Mamoru Mimura, Risa Yamamoto
2023 B conf
NSS
Satoki Kanno, Mamoru Mimura
2023 conf
SocialSec
Takayuki Ishimaru, Mamoru Mimura
2023 J jnl
Expert Syst. Appl.
Mamoru Mimura
2023 conf
C2SI
Phung Minh Ngoc, Mamoru Mimura
2023 C conf
ISPEC
Yuki Nakagawa, Mamoru Mimura
2022 conf
BWCCA
Yuki Mezawa, Mamoru Mimura
2022 J jnl
Int. J. Inf. Sec.
Mamoru Mimura, Ryo Ito
2022 J jnl
CoRR
Yuhei Otsubo, Akira Otsuka, Mamoru Mimura
2022 C conf
ISPEC
Yuki Mezawa, Mamoru Mimura
2022 J jnl
J. Inf. Process.
Phung Minh Ngoc, Mamoru Mimura
2022 J jnl
Internet Things
Mamoru Mimura
2022 J jnl
J. Inf. Process.
Son Duc Nguyen, Mamoru Mimura, Hidema Tanaka
2021 J jnl
Comput. Secur.
Ryusei Maeda, Mamoru Mimura
2021 conf
CANDAR (Workshops)
Phung Minh Ngoc, Mamoru Mimura
2021 J jnl
Internet Things
Phung Minh Ngoc, Mamoru Mimura
2021 J jnl
Internet Things
Son Duc Nguyen, Mamoru Mimura, Hidema Tanaka
2021 J jnl
J. Inf. Process.
Son Duc Nguyen, Mamoru Mimura, Hidema Tanaka
2021 J jnl
Internet Things
Mamoru Mimura, Yui Tajiri
2021 conf
BWCCA
Mamoru Mimura, Takumi Yamasaki
2020 J jnl
J. Inf. Secur. Appl.
Mamoru Mimura
2020 J jnl
IEEE Access
Mamoru Mimura
2020 Misc conf
IWSEC
Yui Tajiri, Mamoru Mimura
2020 conf
BWCCA
Phung Minh Ngoc, Mamoru Mimura
2020 J jnl
J. Inf. Process.
Mamoru Mimura, Taro Ohminami
2020 J jnl
J. Inf. Secur. Appl.
Mamoru Mimura
2020 J jnl
IEEE Access
Yuhei Otsubo, Akira Otsuka, Mamoru Mimura, Takeshi Sakaki
2019 conf
ISCIT
Son Nguyen Duc, Mamoru Mimura, Hidema Tanaka
2019 J jnl
J. Inf. Process.
Mamoru Mimura
2019 conf
AsiaJCIS
Hiroki Sato, Mamoru Mimura, Hidema Tanaka
2019 conf
AsiaJCIS
Ryo Ito, Mamoru Mimura
2019 J jnl
J. Inf. Process.
Mamoru Mimura, Hiroya Miura
2019 conf
AsiaJCIS
Mamoru Mimura, Yuya Suga
2019 Misc conf
IWSEC
Mamoru Mimura, Taro Ohminami
2019 B conf
NSS
Mamoru Mimura
2018 C conf
ICICS
Mamoru Mimura, Hidema Tanaka
2018 conf
CANDAR Workshops
Hiroya Miura, Mamoru Mimura, Hidema Tanaka
2018 J jnl
J. Inf. Process.
Mamoru Mimura, Hidema Tanaka
2018 C conf
ISPEC
Hiroya Miura, Mamoru Mimura, Hidema Tanaka
2018 conf
CANDAR Workshops
Mamoru Mimura
2018 conf
CANDAR
Son Duc Nguyen, Mamoru Mimura, Hidema Tanaka
2018 conf
CANDAR Workshops
Junta Imai, Mamoru Mimura, Hidema Tanaka
2018 J jnl
CoRR
Yuhei Otsubo, Akira Otsuka, Mamoru Mimura, Takeshi Sakaki, Atsuhiro Goto
2017 conf
AsiaJCIS
Mamoru Mimura, Yuhei Otsubo, Hidehiko Tanaka, Hidema Tanaka
2017 Misc conf
WISA
Son Duc Nguyen, Mamoru Mimura, Hidema Tanaka
2017 Misc conf
ICISS
Bold Munkhbaatar, Mamoru Mimura, Hidema Tanaka
2017 Misc conf
ICISS
Mamoru Mimura, Hidema Tanaka
2017 conf
CANDAR
Mamoru Mimura, Yuhei Otsubo, Hidema Tanaka, Atsuhiro Goto
2017 Misc conf
ICISS
Son Duc Nguyen, Mamoru Mimura, Hidema Tanaka
2017 conf
CANDAR
Mamoru Mimura, Hidema Tanaka
2017 Misc conf
ICISC
Mamoru Mimura, Hidema Tanaka
2016 conf
AsiaJCIS
Mamoru Mimura, Yuhei Otsubo, Hidehiko Tanaka
2010 conf
BWCCA
Mamoru Mimura, Hidehiko Tanaka
redb/extractors/macho_extractors/macho_exports.py
← Index redb/extractors/macho_extractors/macho_exports.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
from redb.models.dataclasses import MachOExport


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

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

    def _extract_exports(self, arch_name=None):
        """Extract export information from the MachO binary for a specific architecture."""
        self.log.debug(inspect.currentframe().f_code.co_name)

        if not self.macho:
            return None

        try:
            # Get exported symbols using new API for specific architecture
            exported_symbols = self.macho.get_exported_symbols(arch=arch_name)

            # Extract all exported symbols (may be empty for some binaries)
            # Handle None or empty dict
            if not exported_symbols:
                exported_symbols = {}
            all_symbols = []
            for dylib_name, symbols in exported_symbols.items():
                # Process symbol names
                for symbol in symbols:
                    if isinstance(symbol, bytes):
                        symbol = symbol.decode('utf-8', errors='replace')
                    all_symbols.append(symbol)

            # Create export dataclass
            macho_export = MachOExport(
                macho_exports_total=len(all_symbols),
                macho_export_symbols=all_symbols  # Empty list is fine, but None is not allowed for Array type
            )

            return macho_export

        except Exception as e:
            self.log.error(f"Error extracting MachO exports for arch {arch_name}: {e}")
            return None

    def extract(self):
        self.log.debug(inspect.currentframe().f_code.co_name)
        try:
            # Get architectures (macho is already parsed in base class)
            architectures = self.macho.get_architectures()
            if len(architectures) > 1:
                # FAT binary - return list of exports for each architecture
                results = []
                for arch_name in architectures:
                    exports = self._extract_exports(arch_name)
                    if exports:
                        exports.arch_identifier = arch_name
                        results.append(exports)
                return results
            else:
                # Single architecture - return single result
                return self._extract_exports(architectures[0] if architectures else None)
        except Exception as e:
            self.log.error(f"Error extracting MachO exports: {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 base class)
            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)

            # Loop through each architecture (1 for single, multiple for FAT)
            for arch_name in architectures:
                # Get architecture-specific sha256
                try:
                    arch_general_info = self.macho.get_general_info(arch=arch_name)
                    arch_header_raw = self.macho.get_macho_header(arch=arch_name)
                    arch_sha256 = arch_general_info.get('SHA256', self.sha256)
                    arch_cputype_raw = arch_header_raw.get('cputype', 0) if arch_header_raw else 0
                except Exception as e:
                    self.log.warning(f"Could not get arch-specific data for {arch_name}: {e}")
                    arch_sha256 = self.sha256
                    arch_cputype_raw = 0

                # Get exports for this architecture
                macho_export = self._extract_exports(arch_name)
                if not macho_export:
                    continue

                data.append([
                    arch_sha256,                          # sha256 (arch-specific)
                    macho_export.macho_exports_total,     # macho_exports_total
                    macho_export.macho_export_symbols,    # macho_export_symbols (keep as array!)
                    current_time,                         # analysis_date
                ])

            column_names = [
                'sha256',
                'macho_exports_total', 'macho_export_symbols',
                'analysis_date'
            ]

            if not data:
                return None

            column_type_names = [
                'FixedString(64)',
                'UInt32', 'Array(Nullable(String))',
                'DateTime64(3, \'UTC\')'
            ]

            return (data, column_names, column_type_names)

        return None

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