Oleg Rokhlenko

86 papers A* 13A 5B 5C 2Journal 30Unranked 29
YearRankTypeTitle / Venue / Authors
2026 conf
LaCATODA@AAAI
Soyeong Jeong, Aparna Elangovan, Emine Yilmaz, Oleg Rokhlenko
2026 A* conf
AAAI
Zae Myung Kim, Anand Ramachandran, Farideh Tavazoee, Joo-Kyung Kim, Oleg Rokhlenko, Dongyeop Kang
2025 J jnl
CoRR
Jiali Cheng, Anjishnu Kumar, Roshan Lal, Rishi Rajasekaran, Hani Ramezani, Omar Zia Khan, Oleg Rokhlenko, Sunny Chiu-Webster, Gang Hua, Hadi Amiri
2025 J jnl
CoRR
Soyeong Jeong, Aparna Elangovan, Emine Yilmaz, Oleg Rokhlenko
2025 J jnl
CoRR
Zae Myung Kim, Anand Ramachandran, Farideh Tavazoee, Joo-Kyung Kim, Oleg Rokhlenko, Dongyeop Kang
2025 conf
ACL (1)
Xiangci Li, Zhiyu Chen, Jason Ingyu Choi, Nikhita Vedula, Besnik Fetahu, Oleg Rokhlenko, Shervin Malmasi
2025 J jnl
CoRR
Xiangci Li, Zhiyu Chen, Jason Ingyu Choi, Nikhita Vedula, Besnik Fetahu, Oleg Rokhlenko, Shervin Malmasi
2024 conf
ECIR (2)
Lingbo Mo, Besnik Fetahu, Oleg Rokhlenko, Shervin Malmasi
2024 J jnl
CoRR
Lingbo Mo, Besnik Fetahu, Oleg Rokhlenko, Shervin Malmasi
2024 conf
LREC/COLING
Parth Patwa, Simone Filice, Zhiyu Chen, Giuseppe Castellucci, Oleg Rokhlenko, Shervin Malmasi
2024 J jnl
CoRR
Parth Patwa, Simone Filice, Zhiyu Chen, Giuseppe Castellucci, Oleg Rokhlenko, Shervin Malmasi
2024 conf
IRonGraphs
Besnik Fetahu, Nachshon Cohen, Elad Haramaty, Liane Lewin-Eytan, Oleg Rokhlenko, Shervin Malmasi
2024 J jnl
CoRR
Besnik Fetahu, Nachshon Cohen, Elad Haramaty, Liane Lewin-Eytan, Oleg Rokhlenko, Shervin Malmasi
2024 conf
ECIR (4)
Besnik Fetahu, Tejas Mehta, Qun Song, Nikhita Vedula, Oleg Rokhlenko, Shervin Malmasi
2024 J jnl
CoRR
Besnik Fetahu, Tejas Mehta, Qun Song, Nikhita Vedula, Oleg Rokhlenko, Shervin Malmasi
2024 conf
NAACL (Industry Track)
Nikhita Vedula, Giuseppe Castellucci, Eugene Agichtein, Oleg Rokhlenko, Shervin Malmasi
2024 J jnl
CoRR
Nikhita Vedula, Giuseppe Castellucci, Eugene Agichtein, Oleg Rokhlenko, Shervin Malmasi
2024 A* conf
SIGIR
Nikhita Vedula, Oleg Rokhlenko, Shervin Malmasi
2024 J jnl
CoRR
Nikhita Vedula, Oleg Rokhlenko, Shervin Malmasi
2023 conf
ACL (industry)
Pedro Faustini, Zhiyu Chen, Besnik Fetahu, Oleg Rokhlenko, Shervin Malmasi
2023 J jnl
CoRR
Pedro Faustini, Zhiyu Chen, Besnik Fetahu, Oleg Rokhlenko, Shervin Malmasi
2023 conf
ECIR (2)
Sergey Volokhin, Marcus D. Collins, Oleg Rokhlenko, Eugene Agichtein
2023 A conf
INTERSPEECH
Pedro Faustini, Besnik Fetahu, Giuseppe Castellucci, Anjie Fang, Oleg Rokhlenko, Shervin Malmasi
2023 A* conf
SIGIR
Nikhita Vedula, Marcus D. Collins, Oleg Rokhlenko
2023 J jnl
CoRR
Simone Filice, Jason Ingyu Choi, Giuseppe Castellucci, Eugene Agichtein, Oleg Rokhlenko
2023 A conf
EACL
Tuan Manh Lai, Giuseppe Castellucci, Saar Kuzi, Heng Ji, Oleg Rokhlenko
2023 conf
ACL (1)
Zhuoer Wang, Marcus D. Collins, Nikhita Vedula, Simone Filice, Shervin Malmasi, Oleg Rokhlenko
2023 J jnl
CoRR
Zhuoer Wang, Marcus D. Collins, Nikhita Vedula, Simone Filice, Shervin Malmasi, Oleg Rokhlenko
2023 conf
EMNLP (Findings)
Besnik Fetahu, Pedro Faustini, Anjie Fang, Giuseppe Castellucci, Oleg Rokhlenko, Shervin Malmasi
2023 J jnl
CoRR
Besnik Fetahu, Pedro Faustini, Giuseppe Castellucci, Anjie Fang, Oleg Rokhlenko, Shervin Malmasi
2023 conf
ACL (industry)
Zhiyu Chen, Jason Ingyu Choi, Besnik Fetahu, Oleg Rokhlenko, Shervin Malmasi
2023 J jnl
CoRR
Zhiyu Chen, Jason Ingyu Choi, Besnik Fetahu, Oleg Rokhlenko, Shervin Malmasi
2023 A conf
WSDM
Nikhita Vedula, Marcus D. Collins, Eugene Agichtein, Oleg Rokhlenko
2023 conf
EMNLP (Industry Track)
Besnik Fetahu, Zhiyu Chen, Oleg Rokhlenko, Shervin Malmasi
2023 J jnl
CoRR
Besnik Fetahu, Zhiyu Chen, Oleg Rokhlenko, Shervin Malmasi
2023 conf
EMNLP (Findings)
Besnik Fetahu, Zhiyu Chen, Sudipta Kar, Oleg Rokhlenko, Shervin Malmasi
2023 J jnl
CoRR
Besnik Fetahu, Zhiyu Chen, Sudipta Kar, Oleg Rokhlenko, Shervin Malmasi
2023 J jnl
CoRR
Sudipta Kar, Giuseppe Castellucci, Simone Filice, Shervin Malmasi, Oleg Rokhlenko
2023 conf
SemEval@ACL
Besnik Fetahu, Sudipta Kar, Zhiyu Chen, Oleg Rokhlenko, Shervin Malmasi
2023 J jnl
CoRR
Besnik Fetahu, Sudipta Kar, Zhiyu Chen, Oleg Rokhlenko, Shervin Malmasi
2023 A* conf
KDD
Shervin Malmasi, Besnik Fetahu, Eugene Agichtein, Oleg Rokhlenko, Ido Guy, Nicola Ueffing, Surya Kallumadi
2022 J jnl
CoRR
Anna Gottardi, Osman Ipek, Giuseppe Castellucci, Shui Hu, Lavina Vaz, Yao Lu, Anju Khatri, Anjali Chadha, Desheng Zhang, Sattvik Sahai, Prerna Dwivedi, Hangjie Shi, Lucy Hu, Andy Huang, Luke Dai, Bofei Yang, Varun Somani, Pankaj Rajan, Ron Rezac, Michael Johnston, Savanna Stiff, Leslie Ball, David Carmel, Yang Liu, Dilek Hakkani-Tur, Oleg Rokhlenko, Kate Bland, Eugene Agichtein, Reza Ghanadan, Yoelle Maarek
2022 J jnl
Inf. Retr. J.
Alexandre Salle, Shervin Malmasi, Oleg Rokhlenko, Eugene Agichtein
2022 A* conf
EMNLP
Andrea Iovine, Anjie Fang, Besnik Fetahu, Jie Zhao, Oleg Rokhlenko, Shervin Malmasi
2022 A* conf
WWW
Andrea Iovine, Anjie Fang, Besnik Fetahu, Oleg Rokhlenko, Shervin Malmasi
2022 conf
EMNLP (Industry Track)
Besnik Fetahu, Akash Veeragouni, Oleg Rokhlenko, Shervin Malmasi
2022 conf
NAACL-HLT
Besnik Fetahu, Anjie Fang, Oleg Rokhlenko, Shervin Malmasi
2022 conf
EMNLP (Industry Track)
Alex Estes, Nikhita Vedula, Marcus D. Collins, Matt Cecil, Oleg Rokhlenko
2022 B conf
CHIIR
Sergey Volokhin, Marcus D. Collins, Oleg Rokhlenko, Eugene Agichtein
2022 B conf
COLING
Shervin Malmasi, Anjie Fang, Besnik Fetahu, Sudipta Kar, Oleg Rokhlenko
2022 J jnl
CoRR
Shervin Malmasi, Anjie Fang, Besnik Fetahu, Sudipta Kar, Oleg Rokhlenko
2022 A* conf
KDD
Sudipta Kar, Giuseppe Castellucci, Simone Filice, Shervin Malmasi, Oleg Rokhlenko
2022 conf
EMNLP (Industry Track)
Zhiyu Chen, Jie Zhao, Anjie Fang, Besnik Fetahu, Oleg Rokhlenko, Shervin Malmasi
2022 J jnl
CoRR
Zhiyu Chen, Jie Zhao, Anjie Fang, Besnik Fetahu, Oleg Rokhlenko, Shervin Malmasi
2022 conf
SemEval@NAACL
Shervin Malmasi, Anjie Fang, Besnik Fetahu, Sudipta Kar, Oleg Rokhlenko
2022 conf
ECIR (2)
Nikhita Vedula, Marcus D. Collins, Eugene Agichtein, Oleg Rokhlenko
2022 B conf
COLING
Jason Ingyu Choi, Saar Kuzi, Nikhita Vedula, Jie Zhao, Giuseppe Castellucci, Marcus D. Collins, Shervin Malmasi, Oleg Rokhlenko, Eugene Agichtein
2021 A* conf
AAAI
Natawut Monaikul, Giuseppe Castellucci, Simone Filice, Oleg Rokhlenko
2021 conf
NAACL-HLT
Tao Meng, Anjie Fang, Oleg Rokhlenko, Shervin Malmasi
2021 A* conf
SIGIR
Besnik Fetahu, Anjie Fang, Oleg Rokhlenko, Shervin Malmasi
2021 conf
ECIR (1)
Alexandre Salle, Shervin Malmasi, Oleg Rokhlenko, Eugene Agichtein
2021 A conf
EACL
Simone Filice, Giuseppe Castellucci, Marcus D. Collins, Eugene Agichtein, Oleg Rokhlenko
2021 conf
NAACL-HLT
Sergey Volokhin, Joyce C. Ho, Oleg Rokhlenko, Eugene Agichtein
2020 ed.
PrivateNLP@WSDM
Oluwaseyi Feyisetan, Sepideh Ghanavati, Oleg Rokhlenko, Patricia Thaine
2020 A* conf
SIGIR
Anjie Fang, Simone Filice, Nut Limsopatham, Oleg Rokhlenko
2018 conf
SCAI@EMNLP
Nut Limsopatham, Oleg Rokhlenko, David Carmel
2017 J jnl
CoRR
Li Zhou, Kevin Small, Oleg Rokhlenko, Charles Elkan
2016 A* conf
SIGIR
Adi Omari, David Carmel, Oleg Rokhlenko, Idan Szpektor
2016 A conf
CSCW
Dan Pelleg, Oleg Rokhlenko, Idan Szpektor, Eugene Agichtein, Ido Guy
2015 A* conf
WWW
Oren Anava, Shahar Golan, Nadav Golbandi, Zohar Shay Karnin, Ronny Lempel, Oleg Rokhlenko, Oren Somekh
2014 J jnl
CoRR
Oren Anava, Shahar Golan, Nadav Golbandi, Zohar Shay Karnin, Ronny Lempel, Oleg Rokhlenko, Oren Somekh
2013 conf
HT
Oleg Rokhlenko, Nadav Golbandi, Ronny Lempel, Limor Leibovich
2013 conf
ACL (1)
Oleg Rokhlenko, Idan Szpektor
2012 conf
WWW (Companion Volume)
Gideon Dror, Dan Pelleg, Oleg Rokhlenko, Idan Szpektor
2009 conf
GEC Summit
Oleg Rokhlenko, Ydo Wexler
2009 A* conf
DAC
Eli Arbel, Cindy Eisner, Oleg Rokhlenko
2009 B conf
FMCAD
Eli Arbel, Oleg Rokhlenko, Karen Yorav
2008 J jnl
J. Discrete Algorithms
Ron Y. Pinter, Oleg Rokhlenko, Dekel Tsur, Michal Ziv-Ukelson
2008 J jnl
IEEE ACM Trans. Comput. Biol. Bioinform.
Antoni Lozano, Ron Y. Pinter, Oleg Rokhlenko, Gabriel Valiente, Michal Ziv-Ukelson
2007
Oleg Rokhlenko
2007 J jnl
Bioinform.
Oleg Rokhlenko, Tomer Shlomi, Roded Sharan, Eytan Ruppin, Ron Y. Pinter
2007 C conf
WABI
Antoni Lozano, Ron Y. Pinter, Oleg Rokhlenko, Gabriel Valiente, Michal Ziv-Ukelson
2007 J jnl
Bioinform.
Oleg Rokhlenko, Ydo Wexler, Zohar Yakhini
2006 C conf
WABI
Oleg Rokhlenko, Tomer Shlomi, Roded Sharan, Eytan Ruppin, Ron Y. Pinter
2005 J jnl
Bioinform.
Ron Y. Pinter, Oleg Rokhlenko, Esti Yeger Lotem, Michal Ziv-Ukelson
2004 B conf
CPM
Ron Y. Pinter, Oleg Rokhlenko, Dekel Tsur, Michal Ziv-Ukelson
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"