Igor Mishkovski

35 papers C 3Journal 12Unranked 18
YearRankTypeTitle / Venue / Authors
2025 J jnl
Appl. Netw. Sci.
Dimitar Kitanovski, Igor Mishkovski, Viktor Stojkoski, Miroslav Mirchev
2024 conf
ICT Innovations
Aleksandar Tenev, Silvana Markovska-Simoska, Igor Mishkovski
2024 conf
MIPRO
Jovan Manchev, Miroslav Mirchev, Igor Mishkovski
2024 J jnl
Inf.
Maryan Rizinski, Andrej Jankov, Vignesh Sankaradas, Eugene Pinsky, Igor Mishkovski, Dimitar Trajanov
2024 J jnl
CoRR
Miroslav Mirchev, Lasko Basnarkov, Igor Mishkovski
2024 J jnl
CoRR
Dimitar Kitanovski, Igor Mishkovski, Viktor Stojkoski, Miroslav Mirchev
2023 J jnl
CoRR
Maryan Rizinski, Andrej Jankov, Vignesh Sankaradas, Eugene Pinsky, Igor Mishkovski, Dimitar Trajanov
2023 conf
ICT Innovations
Ivan Krstev, Igor Mishkovski, Miroslav Mirchev, Blagica Golubova, Sasho Gramatikov
2019 conf
ICT Innovations
David Serafimov, Miroslav Mirchev, Igor Mishkovski
2019 conf
ICT Innovations
Kostadin Mishev, Ana Gjorgjevikj, Riste Stojanov, Igor Mishkovski, Irena Vodenska, Ljubomir T. Chitkushev, Dimitar Trajanov
2018 C conf
ISCAS
Miroslav Mirchev, Igor Mishkovski, Ljupco Kocarev
2018 J jnl
IEEE Access
Riste Stojanov, Sasho Gramatikov, Igor Mishkovski, Dimitar Trajanov
2017 J jnl
IEEE Trans. Circuits Syst. I Regul. Pap.
Igor Mishkovski, Miroslav Mirchev, Sanja Scepanovic, Ljupco Kocarev
2017 J jnl
CoRR
Sanja Scepanovic, Igor Mishkovski, Jukka Ruohonen, Frederick Ayala-Gómez, Tuomas Aura, Sami Hyrynsalmi
2017 J jnl
Online Soc. Networks Media
Sanja Scepanovic, Igor Mishkovski, Bruno Gonçalves, Nguyen Trung Hieu, Pan Hui
2016 conf
EISIC
Jukka Ruohonen, Sanja Scepanovic, Sami Hyrynsalmi, Igor Mishkovski, Tuomas Aura, Ville Leppänen
2016 conf
ECSA Workshops
Jukka Ruohonen, Sanja Scepanovic, Sami Hyrynsalmi, Igor Mishkovski, Tuomas Aura, Ville Leppänen
2016 J jnl
CoRR
Sanja Scepanovic, Igor Mishkovski, Bruno Gonçalves, Nguyen Trung Hieu, Pan Hui
2016 conf
FiCloud Workshops
Jukka Ruohonen, Sanja Scepanovic, Sami Hyrynsalmi, Igor Mishkovski, Tuomas Aura, Ville Leppänen
2015 J jnl
Ad Hoc Sens. Wirel. Networks
Leonid Djinevski, Sonja Filiposka, Igor Mishkovski, Dimitar Trajanov
2014 J jnl
IEEE Trans. Circuits Syst. I Regul. Pap.
Aleksandra Bogojeska, Miroslav Mirchev, Igor Mishkovski, Ljupco Kocarev
2013 conf
ICT Innovations
Igor Mishkovski
2012 conf
ICT Innovations
Sasho Gramatikov, Fernando Jaureguizar, Igor Mishkovski, Julián Cabrera, Narciso García
2012 C conf
ISCAS
Igor Mishkovski, Miroslav Mirchev, Fernando Corinto, Mario Biey
2012
Igor Mishkovski
2011 conf
ICT Innovations
Igor Mishkovski, Sonja Filiposka, Dimitar Trajanov, Ljupco Kocarev
2011 ch.
Chaos-Based Cryptography
Igor Mishkovski, Ljupco Kocarev
2011 conf
ICT Innovations
Sonja Filiposka, Igor Mishkovski, Dimitar Trajanov
2010 conf
ICT Innovations
Leonid Djinevski, Igor Mishkovski, Dimitar Trajanov
2010 C conf
ISCAS
Igor Mishkovski, Marco Righero, Mario Biey, Ljupco Kocarev
2010 conf
ICT Innovations
Todorka Banova, Igor Mishkovski, Dimitar Trajanov, Ljupco Kocarev
2010 conf
ICT Innovations
Miroslav Mirchev, Igor Mishkovski, Ljupco Kocarev
2009 conf
ICT Innovations
Igor Mishkovski, Risto Kojchev, Dimitar Trajanov, Ljupco Kocarev
2008 conf
TeNe
Igor Mishkovski, Sonja Filiposka, Sasho Gramatikov, Dimitar Trajanov, Ljupco Kocarev
2007 conf
SCSS (1)
Aksenti Grnarov, Bekim Cilku, Igor Mishkovski, Sonja Filiposka, Dimitar Trajanov
redb/extractors/decompiler/apk/apktool_wrapper.py
← Index redb/extractors/decompiler/apk/apktool_wrapper.py python
"""Apktool disassembler subprocess wrapper.

Manages apktool subprocess execution for smali disassembly,
following the CAPA extractor subprocess pattern.
"""

import os
import signal
import subprocess
from typing import List, Optional


class ApktoolDisassembler:
    """Subprocess wrapper for apktool smali disassembly."""

    def __init__(
        self, apktool_path: str = None, timeout: int = None, log=None
    ):
        self.apktool_path = apktool_path or os.getenv("APKTOOL_PATH", "apktool")
        self.timeout = timeout or int(os.getenv("APKTOOL_TIMEOUT", "120"))
        self.log = log

    def disassemble(self, apk_path: str, output_dir: str) -> bool:
        """Run apktool disassembly on an APK file.

        Returns True on success, False on failure.
        """
        cmd = [
            self.apktool_path,
            "d",
            "--no-res",
            "--force",
            "--output", output_dir,
            apk_path,
        ]

        try:
            process = subprocess.Popen(
                cmd,
                stdout=subprocess.PIPE,
                stderr=subprocess.PIPE,
                text=True,
                preexec_fn=os.setsid,
            )

            try:
                stdout, stderr = process.communicate(timeout=self.timeout)
                if process.returncode != 0:
                    if self.log:
                        self.log.warning(
                            f"apktool returned non-zero exit code {process.returncode}: "
                            f"{stderr[:500] if stderr else 'no stderr'}"
                        )
                    return False
                return True

            except subprocess.TimeoutExpired:
                if self.log:
                    self.log.error(
                        f"apktool timed out after {self.timeout}s"
                    )
                try:
                    os.killpg(os.getpgid(process.pid), signal.SIGTERM)
                    process.wait(timeout=3)
                except (ProcessLookupError, subprocess.TimeoutExpired):
                    try:
                        os.killpg(os.getpgid(process.pid), signal.SIGKILL)
                    except ProcessLookupError:
                        pass
                return False

        except FileNotFoundError:
            if self.log:
                self.log.error(
                    f"apktool not found at '{self.apktool_path}'. "
                    "Install apktool or set APKTOOL_PATH env var."
                )
            return False
        except Exception as e:
            if self.log:
                self.log.error(f"apktool execution error: {e}")
            return False

    def get_smali_directories(self, output_dir: str) -> List[str]:
        """Return paths to all smali output directories.

        Handles multi-DEX: smali/, smali_classes2/, smali_classes3/, etc.
        """
        smali_dirs = []
        if not os.path.isdir(output_dir):
            return smali_dirs

        for entry in sorted(os.listdir(output_dir)):
            if entry == "smali" or entry.startswith("smali_classes"):
                full_path = os.path.join(output_dir, entry)
                if os.path.isdir(full_path):
                    smali_dirs.append(full_path)

        return smali_dirs