Naoya Isoyama

63 papers A* 5B 2C 7Misc 2Journal 14Unranked 33
YearRankTypeTitle / Venue / Authors
2026 J jnl
IEEE Trans. Vis. Comput. Graph.
Daiki Hagimori, Naoya Isoyama, Monica Perusquía-Hernández, Shunsuke Yoshimoto, Hideaki Uchiyama, Nobuchika Sakata, Kiyoshi Kiyokawa
2025 J jnl
IEEE Trans. Vis. Comput. Graph.
Xiaodan Hu, Yan Zhang, Alexander Plopski, Yuta Itoh, Monica Perusquía-Hernández, Naoya Isoyama, Hideaki Uchiyama, Kiyoshi Kiyokawa
2024 conf
APMAR
Miku Nakata, Yutaro Hirao, Monica Perusquía-Hernández, Naoya Isoyama, Hideaki Uchiyama, Kiyoshi Kiyokawa
2024 A* conf
VR
Hiroki Ota, Daiki Hagimori, Monica Perusquía-Hernández, Naoya Isoyama, Yutaro Hirao, Hideaki Uchiyama, Kiyoshi Kiyokawa
2024 conf
ICAT-EGVE
Takara Fujisawa, Daiki Hagimori, Monica Perusquía-Hernández, Naoya Isoyama, Hideaki Uchiyama, Kiyoshi Kiyokawa
2024 J jnl
Displays
Xiaodan Hu, Yan Zhang, Hideaki Uchiyama, Naoya Isoyama, Nobuchika Sakata, Kiyoshi Kiyokawa
2024 Misc conf
ICASSP
Mayuka Kono, Yutaro Hirao, Monica Perusquía-Hernández, Naoya Isoyama, Hideaki Uchiyama, Nobuchika Sakata, Jun Takamatsu, Kiyoshi Kiyokawa
2023 conf
VR Workshops
Zhengchang Yang, Naoya Isoyama, Nobuchika Sakata, Kiyoshi Kiyokawa
2023 B conf
RO-MAN
Takuya Sasaki, Daiki Hagimori, Monica Perusquía-Hernández, Naoya Isoyama, Hideaki Uchiyama, Kiyoshi Kiyokawa, Yoshihiro Kuroda
2023 conf
VR Workshops
Maho Otsuka, Monica Perusquía-Hernández, Naoya Isoyama, Hideaki Uchiyama, Kiyoshi Kiyokawa
2023 J jnl
IEEE Trans. Instrum. Meas.
Huakun Liu, Xin Wei, Monica Perusquía-Hernández, Naoya Isoyama, Hideaki Uchiyama, Kiyoshi Kiyokawa
2023 conf
AHs
Kaito Yokoro, Monica Perusquía-Hernández, Naoya Isoyama, Hideaki Uchiyama, Kiyoshi Kiyokawa
2023 J jnl
Sensors
Takeru Baba, Naoya Isoyama, Hideaki Uchiyama, Nobuchika Sakata, Kiyoshi Kiyokawa
2023 A* conf
ISMAR
Kizashi Nakano, Monica Perusquía-Hernández, Naoya Isoyama, Hideaki Uchiyama, Kiyoshi Kiyokawa
2023 A* conf
VR
Riku Otono, Adélaïde Genay, Monica Perusquía-Hernández, Naoya Isoyama, Hideaki Uchiyama, Martin Hachet, Anatole Lécuyer, Kiyoshi Kiyokawa
2023 J jnl
Sensors
Johannes Schirm, Andrés Roberto Gómez-Vargas, Monica Perusquía-Hernández, Richard T. Skarbez, Naoya Isoyama, Hideaki Uchiyama, Kiyoshi Kiyokawa
2023 conf
AHs
Hiroto Oshimi, Monica Perusquía-Hernández, Naoya Isoyama, Hideaki Uchiyama, Kiyoshi Kiyokawa
2023 J jnl
CoRR
Xiaodan Hu, Yan Zhang, Naoya Isoyama, Hideaki Uchiyama, Nobuchika Sakata, Kiyoshi Kiyokawa
2023 conf
EMBC
Xin Wei, Huakun Liu, Monica Perusquía-Hernández, Katsutoshi Masai, Naoya Isoyama, Hideaki Uchiyama, Kiyoshi Kiyokawa
2023 conf
APMAR
Shota Matsuo, Monica Perusquía-Hernández, Naoya Isoyama, Hideaki Uchiyama, Kiyoshi Kiyokawa
2022 conf
ICAT-EGVE (Posters and Demos)
Yujia Zhang, Monica Perusquía-Hernández, Naoya Isoyama, Norihiko Kawai, Hideaki Uchiyama, Nobuchika Sakata, Kiyoshi Kiyokawa
2022 conf
ICAT-EGVE
Ryosuke Miyawaki, Monica Perusquía-Hernández, Naoya Isoyama, Hideaki Uchiyama, Kiyoshi Kiyokawa
2022 conf
VR Workshops
Kazuma Yoshimura, Naoya Isoyama, Hideaki Uchiyama, Nobuchika Sakata, Kiyoshi Kiyokawa, Yoshihiro Kuroda
2022 conf
VR Workshops
Yan Zhang, Kiyoshi Kiyokawa, Naoya Isoyama, Hideaki Uchiyama, Xubo Yang
2022 conf
APMAR
Maho Otsuka, Monica Perusquía-Hernández, Naoya Isoyama, Hideaki Uchiyama, Kiyoshi Kiyokawa
2022 A* conf
ISMAR
Naoya Fukumoto, Naoya Isoyama, Hideaki Uchiyama, Nobuchika Sakata, Kiyoshi Kiyokawa
2022 conf
IPIN-WiP
Takuma Uno, Naoya Isoyama, Hideaki Uchiyama, Nobuchika Sakata, Kiyoshi Kiyokawa
2022 conf
ICAT-EGVE (Posters and Demos)
Johannes Schirm, Monica Perusquía-Hernández, Naoya Isoyama, Hideaki Uchiyama, Kiyoshi Kiyokawa
2022 conf
APMAR
Yujia Zhang, Monica Perusquía-Hernández, Naoya Isoyama, Norihiko Kawai, Hideaki Uchiyama, Nobuchika Sakata, Kiyoshi Kiyokawa
2022 conf
ISMAR Adjunct
Taiki Kato, Naoya Isoyama, Norihiko Kawai, Hideaki Uchiyama, Nobuchika Sakata, Kiyoshi Kiyokawa
2022 conf
ISMAR Adjunct
Riku Otono, Adélaïde Genay, Monica Perusquía-Hernández, Naoya Isoyama, Hideaki Uchiyama, Martin Hachet, Anatole Lécuyer, Kiyoshi Kiyokawa
2022 J jnl
Sensors
Eiichi Hasegawa, Naoya Isoyama, Diego Vilela Monteiro, Nobuchika Sakata, Kiyoshi Kiyokawa
2022 conf
VR Workshops
Riku Otono, Naoya Isoyama, Hideaki Uchiyama, Kiyoshi Kiyokawa
2022 conf
CHI Extended Abstracts
Kizashi Nakano, Daichi Horita, Naoya Isoyama, Hideaki Uchiyama, Kiyoshi Kiyokawa
2021 conf
ICAT-EGVE
Setthawut Chotchaicharin, Johannes Schirm, Naoya Isoyama, Diego Vilela Monteiro, Hideaki Uchiyama, Nobuchika Sakata, Kiyoshi Kiyokawa
2021 conf
ISMAR Adjunct
Setthawut Chotchaicharin, Johannes Schirm, Naoya Isoyama, Hideaki Uchiyama, Kiyoshi Kiyokawa
2021 conf
VR Workshops
Xiaodan Hu, Yan Zhang, Naoya Isoyama, Nobuchika Sakata, Kiyoshi Kiyokawa
2021 conf
WHC
Daiki Hagimori, Naoya Isoyama, Shunsuke Yoshimoto, Nobuchika Sakata, Kiyoshi Kiyokawa
2021 conf
AHs
Hiroaki Aoki, Ayumi Ohnishi, Naoya Isoyama, Tsutomu Terada, Masahiko Tsukamoto
2021 J jnl
IEEE Trans. Vis. Comput. Graph.
Kizashi Nakano, Naoya Isoyama, Diego Monteiro, Nobuchika Sakata, Kiyoshi Kiyokawa, Takuji Narumi
2021 J jnl
J. Robotics Mechatronics
Kenta Higashi, Naoya Isoyama, Nobuchika Sakata, Kiyoshi Kiyokawa
2021 conf
AHs
Eiichi Hasegawa, Naoya Isoyama, Nobuchika Sakata, Kiyoshi Kiyokawa
2021 conf
VR Workshops
Masatoshi Yokomi, Naoya Isoyama, Nobuchika Sakata, Kiyoshi Kiyokawa
2021 J jnl
Adv. Robotics
Daiki Hagimori, Naoya Isoyama, Shunsuke Yoshimoto, Nobuchika Sakata, Kiyoshi Kiyokawa
2020 A* conf
ISMAR
Yan Zhang, Naoya Isoyama, Nobuchika Sakata, Kiyoshi Kiyokawa, Hong Hua
2019 C conf
CW
Daiki Hagimori, Naoya Isoyama, Shunsuke Yoshimoto, Nobuchika Sakata, Kiyoshi Kiyokawa
2019 C conf
MoMM
Yamato Sakuragi, Naoya Isoyama, Tsutomu Terada, Masahiko Tsukamoto
2019 B conf
MUM
Ryosuke Eguchi, Naoya Isoyama, Tsutomu Terada, Masahiko Tsukamoto
2019 Misc conf
UbiComp
Yuki Matsuura, Tsutomu Terada, Tomohiro Aoki, Susumu Sonoda, Naoya Isoyama, Masahiko Tsukamoto
2018 C conf
ICCC
Naoya Isoyama, Tsutomu Terada, Masahiko Tsukamoto
2018 J jnl
Int. J. Autom. Technol.
Guillaume Lopez, Takahiro Tokuda, Manami Oshima, Kizito Nkurikiyeyezu, Naoya Isoyama, Kiyoshi Itao
2018 conf
COMPSAC (2)
Guillaume Lopez, Hiroko Tobase, Naoya Isoyama
2017 conf
UbiComp/ISWC Adjunct
Naoya Isoyama, Tsutomu Terada, Masahiko Tsukamoto
2016 conf
MobiQuitous (Adjunct Proceedings)
Takayuki Okamura, Naoya Isoyama, Guillaume Lopez
2016 conf
Urb-IoT
Junji Takahashi, Daichi Shioiri, Yuki Shida, Yusuke Kobana, Ryuji Suzuki, Yuto Kobayashi, Naoya Isoyama, Guillaume Lopez, Yoshito Tobe
2016 J jnl
J. Mobile Multimedia
Naoya Isoyama, Masahiro Kinoshita, Ryo Izuta, Tsutomu Terada, Masahiko Tsukamoto
2015 conf
UbiComp/ISWC Adjunct
Naoya Isoyama, Tsutomu Terada, Masahiko Tsukamoto
2015 C conf
MoMM
Naoya Isoyama, Tsutomu Terada, Masahiko Tsukamoto
2015 C conf
MoMM
Naoya Isoyama, Masahiro Kinoshita, Ryo Izuta, Tsutomu Terada, Masahiko Tsukamoto
2014 conf
AH
Naoya Isoyama, Tsutomu Terada, Masahiko Tsukamoto
2013 J jnl
Int. J. Wavelets Multiresolution Inf. Process.
Naoya Isoyama, Tsutomu Terada, Junichi Akita, Masahiko Tsukamoto
2013 C conf
MoMM
Naoya Isoyama, Tsutomu Terada, Masahiko Tsukamoto
2011 C conf
MoMM
Naoya Isoyama, Tsutomu Terada, Junichi Akita, Masahiko Tsukamoto
redb/extractors/apk_extractors/apk_manifest.py
← Index redb/extractors/apk_extractors/apk_manifest.py python
import inspect
import json
from datetime import datetime, timezone
from typing import Any

from redb.extractors.enum import Tag
from redb.extractors.apk_extractor import APKExtractor
from redb.models.dataclasses import APKManifest, APKManifestComponent


class APKManifestExtractor(APKExtractor):

    def __init__(
        self, filepath, log, exporters=None, index_prefix=None,
        known_benign=False, known_malicious=False,
        apk=None,
    ):
        super().__init__(
            filepath, log, exporters, index_prefix,
            known_benign, known_malicious, apk,
        )
        self.manifest = None
        self.components = []
        self.log.debug(inspect.currentframe().f_code.co_name)

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

    def _is_component_exported(self, component_type, component_name):
        """Determine if a component is exported.

        Pre-API 31: exported is implicitly True if intent filters exist.
        API 31+: android:exported must be explicit; default is False.
        """
        try:
            exported_attr = None
            # Try to get the exported attribute directly from the XML
            axml = self.apk.get_android_manifest_xml()
            if axml is not None:
                for node in axml.getElementsByTagName(component_type):
                    name = node.getAttributeNS(
                        "http://schemas.android.com/apk/res/android", "name"
                    )
                    if name == component_name:
                        exported_attr = node.getAttributeNS(
                            "http://schemas.android.com/apk/res/android", "exported"
                        )
                        break
        except Exception:
            exported_attr = None

        if exported_attr == "true":
            return True
        if exported_attr == "false":
            return False

        # If not explicitly set, check for intent filters (pre-API 31 behavior)
        try:
            intent_filters = self.apk.get_intent_filters(component_type, component_name)
            if intent_filters:
                actions = intent_filters.get("action", [])
                if actions:
                    return True
        except Exception:
            pass

        return False

    def _get_intent_filters_for_component(self, component_type, component_name):
        """Get intent filters for a specific component."""
        actions = []
        categories = []
        try:
            intent_filters = self.apk.get_intent_filters(component_type, component_name)
            if intent_filters:
                actions = intent_filters.get("action", [])
                categories = intent_filters.get("category", [])
        except Exception:
            pass
        return actions, categories

    def _safe_extract(self, field_name, func, default=None):
        """Extract a single field, logging and returning default on failure."""
        try:
            return func()
        except Exception as e:
            self.log.warning(
                f"Error extracting APK manifest field '{field_name}' for "
                f"{self.hash.sha256}: {e}"
            )
            return default

    def extract(self):
        if not self._is_valid_apk():
            self.log.error(f"Invalid APK for {self.hash.sha256}")
            return None

        activities = self._safe_extract(
            "activities", lambda: list(self.apk.get_activities() or []), []
        )
        services = self._safe_extract(
            "services", lambda: list(self.apk.get_services() or []), []
        )
        receivers = self._safe_extract(
            "receivers", lambda: list(self.apk.get_receivers() or []), []
        )
        providers = self._safe_extract(
            "providers", lambda: list(self.apk.get_providers() or []), []
        )

        # Build component list with intent filter info
        self.components = []
        all_actions = set()
        all_categories = set()
        exported_components = []

        component_map = [
            ("activity", activities),
            ("service", services),
            ("receiver", receivers),
            ("provider", providers),
        ]

        for comp_type, comp_list in component_map:
            for comp_name in comp_list:
                try:
                    is_exported = self._is_component_exported(comp_type, comp_name)
                    actions, categories = self._get_intent_filters_for_component(
                        comp_type, comp_name
                    )
                    all_actions.update(actions)
                    all_categories.update(categories)
                    if is_exported:
                        exported_components.append(comp_name)

                    self.components.append(APKManifestComponent(
                        component_type=comp_type,
                        class_name=comp_name,
                        is_exported=is_exported,
                        intent_actions=list(actions),
                        intent_categories=list(categories),
                    ))
                except Exception as e:
                    self.log.warning(
                        f"Error processing component '{comp_name}' for "
                        f"{self.hash.sha256}: {e}"
                    )
                    # Still add the component with minimal info
                    self.components.append(APKManifestComponent(
                        component_type=comp_type,
                        class_name=comp_name,
                        is_exported=False,
                        intent_actions=[],
                        intent_categories=[],
                    ))

        # Uses-feature
        uses_features = []
        try:
            uses_features = list(self.apk.get_features() or [])
        except Exception:
            pass

        # Meta-data
        meta_data = None
        try:
            axml = self.apk.get_android_manifest_xml()
            if axml is not None:
                md = {}
                for node in axml.getElementsByTagName("meta-data"):
                    name = node.getAttributeNS(
                        "http://schemas.android.com/apk/res/android", "name"
                    )
                    value = node.getAttributeNS(
                        "http://schemas.android.com/apk/res/android", "value"
                    )
                    resource = node.getAttributeNS(
                        "http://schemas.android.com/apk/res/android", "resource"
                    )
                    if name:
                        md[name] = value or resource or ""
                if md:
                    meta_data = md
        except Exception:
            pass

        # Full manifest XML
        manifest_xml = None
        try:
            axml = self.apk.get_android_manifest_xml()
            if axml is not None:
                manifest_xml = axml.toxml()
        except Exception:
            try:
                manifest_xml = self.apk.get_android_manifest_axml().get_xml()
                if isinstance(manifest_xml, bytes):
                    manifest_xml = manifest_xml.decode("utf-8", errors="replace")
            except Exception:
                pass

        self.manifest = APKManifest(
            activity_count=len(activities),
            service_count=len(services),
            receiver_count=len(receivers),
            provider_count=len(providers),
            activities=activities,
            services=services,
            receivers=receivers,
            providers=providers,
            exported_components=exported_components,
            intent_filters_by_action=sorted(all_actions),
            intent_filters_by_category=sorted(all_categories),
            uses_features=uses_features,
            meta_data=meta_data,
            manifest_xml=manifest_xml,
        )
        return self.manifest

    def prepare_export_data(self, exporter_type: str) -> Any:
        if exporter_type == "ClickHouseExporter":
            if not self.manifest:
                return None

            current_time = datetime.now(timezone.utc)
            m = self.manifest

            # Components table (one row per component)
            components_data = []
            for comp in self.components:
                components_data.append([
                    self.sha256,
                    comp.component_type,
                    comp.class_name,
                    int(comp.is_exported),
                    comp.intent_actions,
                    comp.intent_categories,
                    current_time,
                ])

            # Manifest summary table (one row per APK)
            manifest_data = [[
                self.sha256,
                m.activity_count,
                m.service_count,
                m.receiver_count,
                m.provider_count,
                m.intent_filters_by_action,
                m.intent_filters_by_category,
                m.uses_features,
                m.manifest_xml,
                current_time,
            ]]

            return {
                'multi_table': True,
                'manifest': {
                    'table': 'redb_apk_manifest',
                    'data': manifest_data,
                    'column_names': [
                        'sha256',
                        'activity_count', 'service_count', 'receiver_count', 'provider_count',
                        'intent_filters_by_action', 'intent_filters_by_category',
                        'uses_features', 'manifest_xml', 'analysis_date',
                    ],
                    'column_type_names': [
                        'FixedString(64)',
                        'UInt16', 'UInt16', 'UInt16', 'UInt16',
                        'Array(String)', 'Array(String)',
                        'Array(String)', 'Nullable(String)',
                        "DateTime64(3, 'UTC')",
                    ],
                },
                'components': {
                    'table': 'redb_apk_components',
                    'data': components_data,
                    'column_names': [
                        'sha256', 'component_type', 'class_name', 'is_exported',
                        'intent_actions', 'intent_categories', 'analysis_date',
                    ],
                    'column_type_names': [
                        'FixedString(64)', 'LowCardinality(String)', 'String', 'UInt8',
                        'Array(String)', 'Array(String)',
                        "DateTime64(3, 'UTC')",
                    ],
                },
            }

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