Malcolm Clarke

22 papers Journal 11Unranked 11
YearRankTypeTitle / Venue / Authors
2024 conf
BuildSys
Chun Wai Chiu, Christos Efstratiou, Marialena Nikolopoulou, Matthew Barker, Andrew Baldwin, Malcolm Clarke
2018 J jnl
IEEE Trans. Biomed. Eng.
Malcolm Clarke, Joost de Folter, Vivek Verma, Hulya Gokalp
2017 J jnl
Comput.
Brian Ondiege, Malcolm Clarke, Glenford Mapp
2016 J jnl
IEEE J. Biomed. Health Informatics
Malcolm Clarke, Hulya Gokalp, Joanna Fursse, Russell W. Jones
2015 conf
EMBC
Hulya Gokalp, Malcolm Clarke
2015 J jnl
IEEE J. Biomed. Health Informatics
Malcolm Clarke, Paul Schluter, Barry Reinhold, Brian Reinhold
2014 J jnl
BMC Medical Informatics Decis. Mak.
Joost de Folter, Hulya Gokalp, Joanna Fursse, Urvashi Sharma, Malcolm Clarke
2014 conf
SOSE
Glenford E. Mapp, Mahdi Aiash, Brian Ondiege, Malcolm Clarke
2013 conf
EMBC
Héctor Gilberto Barrón-González, Miguel Martínez-Espronceda, Santiago Led, Luis Serrano, Christoph Fischer, Malcolm Clarke
2011 J jnl
CoRR
Jasni Mohamad Zain, Malcolm Clarke
2010 conf
MedInfo
Urvashi Sharma, Julie Barnett, Malcolm Clarke
2008 conf
MIE
Joanna Fursse, Malcolm Clarke, Russell W. Jones, Sneh Khemka, Genevieve Findlay
2008 conf
MIE
Malcolm Clarke
2007 J jnl
Int. J. Electron. Heal.
Tanja Bratan, Jyoti Choudrie, Malcolm Clarke, Russell W. Jones, Andrew Larkworthy
2006 conf
EMBC
CA Thiyagarajan, Malcolm Clarke
2006 J jnl
Int. J. Heal. Inf. Syst. Informatics
Janice A. Osbourne, Malcolm Clarke
2006 conf
EMBC
Tanja Bratan, Malcolm Clarke
2004 J jnl
Br. J. Educ. Technol.
Malcolm Clarke, Clive Butler, Peter Schmidt-Hansen, Mary Somerville
1999 conf
MIE
Malcolm Clarke, Russell W. Jones, Nikos Kanellopoulos, Dimitris Lioupis, A. Nassiopoulos
1999 conf
MIE
Malcolm Clarke, Russell W. Jones, Dimitris Lioupis, S. George, D. Cairns
1997 J jnl
Learn. Publ.
Malcolm Clarke
1995 J jnl
Neural Comput. Appl.
Zeping Shen, Malcolm Clarke, Russell W. Jones, Thea Alberti
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