Jakub Wroblewski

29 papers C 3Misc 2Journal 6Unranked 18
YearRankTypeTitle / Venue / Authors
2014 conf
WI-IAT (1)
Jakub Wroblewski, Marcin Kowalski
2014 conf
RSEISP
Jakub Wroblewski, Sebastian Stawicki
2013 J jnl
Fundam. Informaticae
Dominik Slezak, Piotr Synak, Arkadiusz Wojna, Jakub Wroblewski
2012 J jnl
IEEE Data Eng. Bull.
Dominik Slezak, Piotr Synak, Janusz Borkowski, Jakub Wroblewski, Graham Toppin
2012 conf
RSCTC
Dominik Slezak, Piotr Synak, Jakub Wroblewski, Janusz Borkowski, Graham Toppin
2012 conf
IPMU (2)
Dominik Slezak, Piotr Synak, Graham Toppin, Jakub Wroblewski, Janusz Borkowski
2010 Misc conf
GrC
Dominik Slezak, Piotr Synak, Jakub Wroblewski, Graham Toppin
2008 J jnl
Proc. VLDB Endow.
Dominik Slezak, Jakub Wroblewski, Victoria Eastwood, Piotr Synak
2008 conf
RSCTC
Dominik Slezak, Jakub Wroblewski, Victoria Eastwood, Piotr Synak
2007 conf
RSKT
Dominik Slezak, Jakub Wroblewski
2005 conf
RSFDGrC (1)
Jakub Wroblewski
2005 conf
PReMI
Mohammad M. Rahman, Dominik Slezak, Jakub Wroblewski
2004 conf
Rough Sets and Current Trends in Computing
Dominik Slezak, Marcin S. Szczuka, Jakub Wroblewski
2003 J jnl
J. Intell. Inf. Syst.
Alicja Wieczorkowska, Jakub Wroblewski, Piotr Synak, Dominik Slezak
2003 C conf
ISMIS
Dominik Slezak, Jakub Wroblewski, Marcin S. Szczuka
2003 conf
RSKD
Dominik Slezak, Jakub Wroblewski, Marcin S. Szczuka
2003 conf
RSFDGrC
Dominik Slezak, Jakub Wroblewski
2003 conf
IIS
Alicja Wieczorkowska, Jakub Wroblewski, Dominik Slezak, Piotr Synak
2003 C conf
ISMIS
Jan G. Bazan, Andrzej Skowron, Dominik Slezak, Jakub Wroblewski
2002 conf
Rough Sets and Current Trends in Computing
Jan G. Bazan, Marcin S. Szczuka, Jakub Wroblewski
2002 conf
Rough Sets and Current Trends in Computing
Dominik Slezak, Jakub Wroblewski
2002 C conf
ISMIS
Dominik Slezak, Piotr Synak, Alicja Wieczorkowska, Jakub Wroblewski
2002 conf
Rough Sets and Current Trends in Computing
Jan G. Bazan, Antoni Osmólski, Andrzej Skowron, Dominik Slezak, Marcin S. Szczuka, Jakub Wroblewski
2001 J jnl
Fundam. Informaticae
Jakub Wroblewski
2001 Misc conf
AMIA
Andrew Grant, Gwyneth Grant, Jean Gagné, Carl Blanchette, Émilie Comeau, Guillaume Brodeur, Jonathon Dionne, Alphonse Ayite, Piotr Synak, Jakub Wroblewski, Cas Apanowicz
2000 conf
Rough Sets and Current Trends in Computing
Dominik Slezak, Jakub Wroblewski
1999 conf
PKDD
Dominik Slezak, Jakub Wroblewski
1998 conf
Rough Sets and Current Trends in Computing
Jakub Wroblewski
1996 J jnl
Fundam. Informaticae
Jakub Wroblewski
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