Naoki Masuyama

91 papers A* 1A 4B 20C 1Misc 2Journal 31Unranked 32
YearRankTypeTitle / Venue / Authors
2026 J jnl
Neural Comput. Appl.
Naoki Masuyama, Takanori Takebayashi, Yusuke Nojima, Chu Kiong Loo, Hisao Ishibuchi, Stefan Wermter
2026 J jnl
IEEE Trans. Fuzzy Syst.
Takeru Konishi, Naoki Masuyama, Jorge Casillas, Yusuke Nojima
2025 B conf
IJCNN
Naoki Masuyama, Ryosuke Fujii, Takato Kinoshita, Yusuke Nojima
2025 J jnl
IEEE Access
Haruka Ozaki, Yuichiro Toda, Naoki Masuyama, Kai Fuji, Takayuki Matsuno
2025 J jnl
CoRR
Naoki Masuyama, Yuichiro Toda, Yusuke Nojima, Hisao Ishibuchi
2025 conf
GECCO Companion
Ruwang Jiao, Tao Peng, Naoki Masuyama, Yusuke Nojima
2025 conf
FUZZ
Takeru Konishi, Naoki Masuyama, Yusuke Nojima
2025 J jnl
CoRR
Ryosuke Ofuchi, Yuichiro Toda, Naoki Masuyama, Takayuki Matsuno
2025 J jnl
IEEE Access
Farhan Dawood, Naoki Masuyama, Chu Kiong Loo
2024 conf
SCIS/ISIS
Yuki Azuma, Naoki Masuyama, Yusuke Nojima
2024 B conf
CEC
Takato Kinoshita, Naoki Masuyama, Yusuke Nojima
2024 B conf
IJCNN
Kazuki Tashiro, Naoki Masuyama, Yusuke Nojima
2024 J jnl
IEEE Access
Yuichiro Toda, Naoki Masuyama
2024 Misc conf
ICMLC
Takanori Takebayashi, Naoki Masuyama, Yusuke Nojima
2024 conf
SCIS/ISIS
Teruhiko Tokusaka, Naoki Masuyama, Yusuke Nojima
2024 conf
SCIS/ISIS
Alexandre K. Tabouret, Eric Michael Vernon, Naoki Masuyama, Yusuke Nojima
2024 conf
FUZZ
Takeru Konishi, Naoki Masuyama, Jorge Casillas, Yusuke Nojima
2024 conf
FUZZ
Rowan Fuerst, Naoki Masuyama, Yusuke Nojima
2024 conf
iFUZZY
Yusuke Nojima, Shion Takasaki, Shinji Fukuda, Naoki Masuyama
2024 J jnl
CoRR
Eric Michael Vernon, Naoki Masuyama, Yusuke Nojima
2024 J jnl
IEEE Access
Naoki Masuyama, Yusuke Nojima, Yuichiro Toda, Chu Kiong Loo, Hisao Ishibuchi, Naoyuki Kubota
2023 conf
GECCO Companion
Yusuke Nojima, Yuto Fujii, Naoki Masuyama, Yiping Liu, Hisao Ishibuchi
2023 J jnl
CoRR
Naoki Masuyama, Takanori Takebayashi, Yusuke Nojima, Chu Kiong Loo, Hisao Ishibuchi, Stefan Wermter
2023 Misc conf
ICMLC
Takanori Takebayashi, Naoki Masuyama, Yusukeusuke Nijima
2023 conf
FUZZ
Yusuke Nojima, Koyo Kawano, Hajime Shimahara, Eric Vernon, Naoki Masuyama, Hisao Ishibuchi
2023 J jnl
IEEE Trans. Pattern Anal. Mach. Intell.
Naoki Masuyama, Yusuke Nojima, Chu Kiong Loo, Hisao Ishibuchi
2023 J jnl
CoRR
Naoki Masuyama, Yusuke Nojima, Yuichiro Toda, Chu Kiong Loo, Hisao Ishibuchi, Naoyuki Kubota
2023 J jnl
IEEE Access
Takato Kinoshita, Naoki Masuyama, Yiping Liu, Yusuke Nojima, Hisao Ishibuchi
2023 J jnl
Reliab. Eng. Syst. Saf.
Mohamed Arezki Mellal, Enrico Zio, Sameer Al-Dahidi, Naoki Masuyama, Yusuke Nojima
2022 J jnl
IEEE Access
Naoki Masuyama, Narito Amako, Yuna Yamada, Yusuke Nojima, Hisao Ishibuchi
2022 B conf
IJCNN
Naoki Masuyama, Yusuke Nojima, Hisao Ishibuchi, Zongying Liu
2022 J jnl
CoRR
Naoki Masuyama, Narito Amako, Yuna Yamada, Yusuke Nojima, Hisao Ishibuchi
2022 conf
MIC
Takato Kinoshita, Naoki Masuyama, Yusuke Nojima, Hisao Ishibuchi
2022 conf
WAC
Maaya Yano, Naoki Masuyama, Yusuke Nojima
2022 J jnl
CoRR
Naoki Masuyama, Itsuki Tsubota, Yusuke Nojima, Hisao Ishibuchi
2022 conf
SCIS/ISIS
Takeru Konishi, Naoki Masuyama, Yusuke Nojima
2022 conf
WAC
Eric Michael Vernon, Naoki Masuyama, Yusuke Nojima
2022 B conf
FUZZ-IEEE
Yuichi Omozaki, Naoki Masuyama, Yusuke Nojima, Hisao Ishibuchi
2022 J jnl
CoRR
Takato Kinoshita, Naoki Masuyama, Yiping Liu, Yusuke Nojima, Hisao Ishibuchi
2022 conf
SCIS/ISIS
Takato Kinoshita, Naoki Masuyama, Yusuke Nojima
2021 conf
SSCI
Victor Villin, Naoki Masuyama, Yusuke Nojima
2021 J jnl
CoRR
Victor Villin, Naoki Masuyama, Yusuke Nojima
2021 B conf
SMC
Yiping Liu, Liting Xu, Yuyan Han, Naoki Masuyama, Yusuke Nojima, Hisao Ishibuchi, Gary G. Yen
2021 J jnl
CoRR
Naoki Masuyama, Yusuke Nojima, Chu Kiong Loo, Hisao Ishibuchi
2020 J jnl
IEEE Trans. Evol. Comput.
Yiping Liu, Hisao Ishibuchi, Naoki Masuyama, Yusuke Nojima
2020 A* conf
CcS
Yuna Yamada, Naoki Masuyama, Narito Amako, Yusuke Nojima, Chu Kiong Loo, Hisao Ishibuchi
2020 B conf
CEC
Ryuichi Hashimoto, Toshiki Urita, Naoki Masuyama, Yusuke Nojima, Hisao Ishibuchi
2020 A conf
GECCO
Hisao Ishibuchi, Takashi Matsumoto, Naoki Masuyama, Yusuke Nojima
2020 J jnl
IEEE Trans. Evol. Comput.
Yiping Liu, Hisao Ishibuchi, Gary G. Yen, Yusuke Nojima, Naoki Masuyama
2020 A conf
ECAI
Hisao Ishibuchi, Takashi Matsumoto, Naoki Masuyama, Yusuke Nojima
2020 conf
SSCI
Naoki Masuyama, Yusuke Nojima, Chu Kiong Loo, Hisao Ishibuchi
2020 B conf
IJCNN
Narito Amako, Naoki Masuyama, Chu Kiong Loo, Yusuke Nojima, Yiping Liu, Hisao Ishibuchi
2020 B conf
FUZZ-IEEE
Yuichi Omozaki, Naoki Masuyama, Yusuke Nojima, Hisao Ishibuchi
2020 B conf
CEC
Yiping Liu, Hisao Ishibuchi, Gary G. Yen, Yusuke Nojima, Naoki Masuyama, Yuyan Han
2019 J jnl
Int. J. Neural Syst.
Naoki Masuyama, Chu Kiong Loo, Stefan Wermter
2019 B conf
CEC
Takashi Matsumoto, Naoki Masuyama, Yusuke Nojima, Hisao Ishibuchi
2019 C conf
EMO
Hisao Ishibuchi, Ryo Imada, Naoki Masuyama, Yusuke Nojima
2019 A conf
GECCO
Yusuke Nojima, Takafumi Fukase, Yiping Liu, Naoki Masuyama, Hisao Ishibuchi
2019 J jnl
IEEE Access
Habeebah Adamu Kakudi, Chu Kiong Loo, Foong Ming Moy, Naoki Masuyama, Kitsuchart Pasupa
2019 conf
SSCI
Ryuichi Hashimoto, Naoki Masuyama, Yusuke Nojima, Hisao Ishibuchi
2019 conf
SSCI
Naoki Masuyama, Narito Amako, Yusuke Nojima, Yiping Liu, Chu Kiong Loo, Hisao Ishibuchi
2019 conf
SSCI
Hisao Ishibuchi, Takashi Matsumoto, Naoki Masuyama, Yusuke Nojima
2019 B conf
CEC
Yiping Liu, Hisao Ishibuchi, Yusuke Nojima, Naoki Masuyama, Yuyan Han
2019 J jnl
IEEE Access
Naoki Masuyama, Chu Kiong Loo, Hisao Ishibuchi, Naoyuki Kubota, Yusuke Nojima, Yiping Liu
2019 B conf
CEC
Hisao Ishibuchi, Ryo Imada, Naoki Masuyama, Yusuke Nojima
2018 conf
PPSN (1)
Yiping Liu, Hisao Ishibuchi, Yusuke Nojima, Naoki Masuyama, Ke Shang
2018 conf
GECCO (Companion)
Ryuichi Hashimoto, Hisao Ishibuchi, Naoki Masuyama, Yusuke Nojima
2018 A conf
GECCO
Hisao Ishibuchi, Takefumi Fukase, Naoki Masuyama, Yusuke Nojima
2018 B conf
CEC
Hisao Ishibuchi, Ryo Imada, Naoki Masuyama, Yusuke Nojima
2018 conf
PPSN (1)
Yiping Liu, Hisao Ishibuchi, Yusuke Nojima, Naoki Masuyama, Ke Shang
2018 J jnl
Neural Networks
Naoki Masuyama, Chu Kiong Loo, Farhan Dawood
2018 B conf
SMC
Naoki Masuyama, Yuki Tanigaki, Yusuke Nojima, Hisao Ishibuchi
2018 conf
SSCI
Gin Chong Lee, Chu Kiong Loo, Naoki Masuyama
2018 B conf
SMC
Takashi Matsumoto, Naoki Masuyama, Yusuke Nojima, Hisao Ishibuchi
2018 J jnl
Neurocomputing
Naoki Masuyama, Chu Kiong Loo, Manjeevan Seera
2018 J jnl
IEEE Trans. Neural Networks Learn. Syst.
Naoki Masuyama, Chu Kiong Loo, Manjeevan Seera, Naoyuki Kubota
2018 J jnl
IEEE Access
Zongying Liu, Chu Kiong Loo, Naoki Masuyama, Kitsuchart Pasupa
2018 conf
WAC
Naoki Masuyama, Chu Kiong Loo, Hisao Ishibuchi, Yusuke Nojima, Yiping Lin
2018 conf
PPSN (1)
Hisao Ishibuchi, Ryo Imada, Naoki Masuyama, Yusuke Nojima
2017 J jnl
Neural Comput. Appl.
Naoki Masuyama, Md. Nazrul Islam, Manjeevan Seera, Chu Kiong Loo
2016 conf
ICONIP (4)
Naoki Masuyama, Chu Kiong Loo
2016 conf
SSCI
Naoki Masuyama, Chu Kiong Loo
2016 conf
SSCI
Wei Hong Chin, Chu Kiong Loo, Naoki Masuyama
2015 conf
SSCI
Zeeshan Rasool, Naoki Masuyama, Md. Nazrul Islam, Chu Kiong Loo
2015 B conf
IJCNN
Naoki Masuyama, Chu Kiong Loo
2015 B conf
RO-MAN
Naoki Masuyama, Chu Kiong Loo
2014 conf
RiiSS
Naoki Masuyama, Md. Nazrul Islam, Chu Kiong Loo
2014 J jnl
Int. J. Humanoid Robotics
Naoki Masuyama, Chu Kiong Loo, Naoyuki Kubota
2014 B conf
FUZZ-IEEE
Naoki Masuyama, Chu Kiong Loo
2013 conf
RVSP
Naoki Masuyama, Chu Kiong Loo, Naoyuki Kubota
2012 B conf
PRICAI
Naoki Masuyama, Chee Seng Chan, Naoyuki Kubota, Jinseok Woo
redb/extractors/apk_extractors/apk_dex.py
← Index redb/extractors/apk_extractors/apk_dex.py python
import hashlib
import inspect
import json
from collections import Counter
from datetime import datetime, timezone
from typing import Any

import tlsh

from redb.extractors.enum import Tag
from redb.extractors.apk_extractor import APKExtractor
from redb.models.dataclasses import APKDexFile

# Sensitive API patterns categorized for malware analysis
SENSITIVE_API_CATEGORIES = {
    "reflection": [
        "Ljava/lang/reflect/Method;->invoke",
        "Ljava/lang/reflect/Field;->get",
        "Ljava/lang/reflect/Field;->set",
        "Ljava/lang/reflect/Constructor;->newInstance",
        "Ljava/lang/Class;->forName",
        "Ljava/lang/Class;->getMethod",
        "Ljava/lang/Class;->getDeclaredMethod",
        "Ljava/lang/Class;->getDeclaredField",
        "Ljava/lang/ClassLoader;->loadClass",
    ],
    "crypto": [
        "Ljavax/crypto/Cipher;->getInstance",
        "Ljavax/crypto/Cipher;->init",
        "Ljavax/crypto/spec/SecretKeySpec;-><init>",
        "Ljavax/crypto/spec/IvParameterSpec;-><init>",
        "Ljava/security/MessageDigest;->getInstance",
        "Ljava/security/KeyStore;->getInstance",
        "Ljavax/crypto/Mac;->getInstance",
    ],
    "dynamic_loading": [
        "Ldalvik/system/DexClassLoader;-><init>",
        "Ldalvik/system/PathClassLoader;-><init>",
        "Ldalvik/system/InMemoryDexClassLoader;-><init>",
        "Ldalvik/system/BaseDexClassLoader;-><init>",
        "Ljava/lang/Runtime;->exec",
        "Ljava/lang/ProcessBuilder;->start",
    ],
    "telephony": [
        "Landroid/telephony/TelephonyManager;->getDeviceId",
        "Landroid/telephony/TelephonyManager;->getSubscriberId",
        "Landroid/telephony/TelephonyManager;->getLine1Number",
        "Landroid/telephony/TelephonyManager;->getSimSerialNumber",
        "Landroid/telephony/TelephonyManager;->getNetworkOperator",
        "Landroid/telephony/TelephonyManager;->getSimOperator",
    ],
    "sms": [
        "Landroid/telephony/SmsManager;->sendTextMessage",
        "Landroid/telephony/SmsManager;->sendMultipartTextMessage",
        "Landroid/telephony/SmsManager;->sendDataMessage",
    ],
    "network": [
        "Ljava/net/HttpURLConnection;->connect",
        "Ljava/net/URL;->openConnection",
        "Lokhttp3/OkHttpClient;-><init>",
        "Lokhttp3/Request$Builder;->build",
        "Lorg/apache/http/client/HttpClient;->execute",
        "Landroid/webkit/WebView;->loadUrl",
        "Landroid/webkit/WebView;->setWebViewClient",
    ],
    "native": [
        "Ljava/lang/System;->loadLibrary",
        "Ljava/lang/System;->load",
        "Ljava/lang/Runtime;->loadLibrary",
    ],
    "device_info": [
        "Landroid/os/Build;->FINGERPRINT",
        "Landroid/os/Build;->MODEL",
        "Landroid/os/Build;->MANUFACTURER",
        "Landroid/os/Build;->PRODUCT",
        "Landroid/os/Build;->BRAND",
        "Landroid/os/Build;->DEVICE",
        "Landroid/os/Build;->HARDWARE",
        "Landroid/os/Build;->SERIAL",
        "Landroid/os/Build$VERSION;->SDK_INT",
        "Landroid/provider/Settings$Secure;->getString",
    ],
    "file_io": [
        "Ljava/io/FileOutputStream;-><init>",
        "Ljava/io/FileInputStream;-><init>",
        "Landroid/content/SharedPreferences;->edit",
        "Landroid/database/sqlite/SQLiteDatabase;->execSQL",
        "Landroid/database/sqlite/SQLiteDatabase;->rawQuery",
    ],
    "ipc": [
        "Landroid/content/ContentResolver;->query",
        "Landroid/content/ContentResolver;->insert",
        "Landroid/content/ContentResolver;->delete",
        "Landroid/content/Intent;-><init>",
        "Landroid/content/Context;->sendBroadcast",
        "Landroid/content/Context;->startService",
        "Landroid/content/Context;->bindService",
    ],
}


class APKDexExtractor(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.dex_files = []
        self.log.debug(inspect.currentframe().f_code.co_name)

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

    def _analyze_api_usage(self, dex):
        """Categorize sensitive API calls found in DEX bytecode."""
        api_usage = {cat: set() for cat in SENSITIVE_API_CATEGORIES}

        try:
            for method in dex.get_encoded_methods():
                code = method.get_code()
                if not code:
                    continue
                try:
                    bytecode = code.get_bc()
                    if not bytecode:
                        continue
                    for instruction in bytecode.get_instructions():
                        op_name = instruction.get_name()
                        if not op_name or not op_name.startswith("invoke"):
                            continue
                        output = instruction.get_output()
                        if not output:
                            continue
                        for category, patterns in SENSITIVE_API_CATEGORIES.items():
                            for pattern in patterns:
                                if pattern in output:
                                    api_usage[category].add(output.strip())
                                    break
                except Exception:
                    continue
        except Exception as e:
            self.log.warning(f"Error analyzing API usage: {e}")

        # Convert sets to sorted lists
        return {cat: sorted(calls) for cat, calls in api_usage.items() if calls}

    def _compute_obfuscation_indicators(self, classes, methods):
        """Compute obfuscation indicators from class/method names."""
        class_names = []
        for cls in classes:
            try:
                name = cls.get_name()
                if name:
                    class_names.append(name)
            except Exception:
                continue

        method_names = []
        for m in methods:
            try:
                name = m.get_name()
                if name and name not in ("<init>", "<clinit>"):
                    method_names.append(name)
            except Exception:
                continue

        if not class_names:
            return None

        # Short class names: extract just the class part from Dalvik notation
        short_class = 0
        for n in class_names:
            simple = n.split("/")[-1].rstrip(";")
            if len(simple) <= 2:
                short_class += 1

        short_method = sum(1 for n in method_names if len(n) <= 2)

        return {
            "short_class_names_pct": round(short_class / max(len(class_names), 1), 4),
            "short_method_names_pct": round(short_method / max(len(method_names), 1), 4),
            "non_ascii_identifiers": sum(1 for n in class_names if not n.isascii()),
            "avg_class_name_length": round(
                sum(len(n) for n in class_names) / max(len(class_names), 1), 2
            ),
        }

    def _compute_top_packages(self, classes):
        """Compute top packages by class count."""
        package_counter = Counter()
        for cls in classes:
            try:
                name = cls.get_name()  # "Lcom/example/foo/Bar;"
                if not name:
                    continue
                parts = name[1:].replace("/", ".").rsplit(".", 1)
                if len(parts) > 1:
                    package = parts[0]
                else:
                    package = "(default)"
                package_counter[package] += 1
            except Exception:
                continue

        return [
            {"package": pkg, "class_count": count}
            for pkg, count in package_counter.most_common(20)
        ]

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

        from androguard.core.dex import DEX

        try:
            dex_names = list(self.apk.get_dex_names() or [])
        except Exception as e:
            self.log.warning(f"Error getting DEX names for {self.hash.sha256}: {e}")
            dex_names = []

        try:
            dex_buffers = list(self.apk.get_all_dex() or [])
        except Exception as e:
            self.log.error(f"Error getting DEX buffers for {self.hash.sha256}: {e}")
            return None

        if not dex_buffers:
            self.log.debug("No DEX files found in APK")
            return None

        self.dex_files = []
        for i, dex_data in enumerate(dex_buffers):
            dex_name = dex_names[i] if i < len(dex_names) else f"classes{i}.dex"

            dex_sha256 = hashlib.sha256(dex_data).hexdigest()
            dex_tlsh = None
            if len(dex_data) >= 50:
                try:
                    dex_tlsh = tlsh.hash(dex_data) or None
                except Exception:
                    pass

            try:
                d = DEX(dex_data)
            except Exception as e:
                self.log.warning(f"Failed to parse DEX {dex_name}: {e}")
                continue

            try:
                classes = list(d.get_classes() or [])
            except Exception as e:
                self.log.warning(f"Error getting classes from {dex_name}: {e}")
                classes = []
            try:
                methods = list(d.get_methods() or [])
            except Exception as e:
                self.log.warning(f"Error getting methods from {dex_name}: {e}")
                methods = []
            try:
                strings = list(d.get_strings() or [])
            except Exception as e:
                self.log.warning(f"Error getting strings from {dex_name}: {e}")
                strings = []

            try:
                top_packages = self._compute_top_packages(classes)
            except Exception as e:
                self.log.warning(f"Error computing top packages for {dex_name}: {e}")
                top_packages = []
            try:
                api_usage = self._analyze_api_usage(d)
            except Exception as e:
                self.log.warning(f"Error analyzing API usage for {dex_name}: {e}")
                api_usage = {}
            try:
                obfuscation_indicators = self._compute_obfuscation_indicators(classes, methods)
            except Exception as e:
                self.log.warning(f"Error computing obfuscation indicators for {dex_name}: {e}")
                obfuscation_indicators = None

            self.dex_files.append(APKDexFile(
                filename=dex_name,
                sha256=dex_sha256,
                class_count=len(classes),
                method_count=len(methods),
                string_count=len(strings),
                tlsh=dex_tlsh,
                top_packages=top_packages,
                api_usage=api_usage if api_usage else None,
                obfuscation_indicators=obfuscation_indicators,
            ))

        return self.dex_files if self.dex_files else None

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

            current_time = datetime.now(timezone.utc)

            # DEX table: one row per DEX file
            dex_data = []
            for dex in self.dex_files:
                dex_data.append([
                    self.sha256,
                    dex.sha256,
                    dex.filename,
                    dex.tlsh,
                    dex.class_count,
                    dex.method_count,
                    dex.string_count,
                    json.dumps(dex.top_packages) if dex.top_packages else None,
                    json.dumps(dex.obfuscation_indicators) if dex.obfuscation_indicators else None,
                    current_time,
                ])

            # API usage table: one row per category per DEX
            api_data = []
            for dex in self.dex_files:
                if dex.api_usage:
                    for category, api_calls in dex.api_usage.items():
                        api_data.append([
                            self.sha256,
                            dex.sha256,
                            category,
                            api_calls,
                            current_time,
                        ])

            return {
                'multi_table': True,
                'dex': {
                    'table': 'redb_apk_dex',
                    'data': dex_data,
                    'column_names': [
                        'sha256', 'dex_sha256', 'dex_filename', 'dex_tlsh',
                        'dex_class_count', 'dex_method_count', 'dex_string_count',
                        'dex_top_packages', 'dex_obfuscation_indicators',
                        'analysis_date',
                    ],
                    'column_type_names': [
                        'FixedString(64)', 'FixedString(64)', 'String', 'Nullable(String)',
                        'UInt32', 'UInt32', 'UInt32',
                        'Nullable(String)', 'Nullable(String)',
                        "DateTime64(3, 'UTC')",
                    ],
                },
                'api_usage': {
                    'table': 'redb_apk_dex_api_usage',
                    'data': api_data,
                    'column_names': [
                        'sha256', 'dex_sha256', 'api_category',
                        'api_calls', 'analysis_date',
                    ],
                    'column_type_names': [
                        'FixedString(64)', 'FixedString(64)', 'LowCardinality(String)',
                        'Array(String)', "DateTime64(3, 'UTC')",
                    ],
                },
            }

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