Man-Hong Yung

18 papers B 1Journal 17
YearRankTypeTitle / Venue / Authors
2026 J jnl
IEEE Trans. Netw.
P. A. Mosharev, Choon-Meng Lee, Xu Shu, Xiaoshan Zhang, Man-Hong Yung
2025 J jnl
CoRR
P. A. Mosharev, Choon-Meng Lee, Xu Shu, Xiaoshan Zhang, Man-Hong Yung
2025 J jnl
Nat. Comput. Sci.
Zi-Song Shen, Feng Pan, Yao Wang, Yi-Ding Men, Wen-Biao Xu, Man-Hong Yung, Pan Zhang
2024 J jnl
Comput. Softw. Big Sci.
Hideki Okawa, Qing-Guo Zeng, Xian-Zhe Tao, Man-Hong Yung
2024 J jnl
CoRR
Runqiu Shu, Bowen Liu, Zhaoping Xiong, Xiaopeng Cui, Yunting Li, Wei Cui, Man-Hong Yung, Nan Qiao
2024 J jnl
CoRR
Runqiu Shu, Xusheng Xu, Man-Hong Yung, Wei Cui
2023 J jnl
Quantum
Chufan Lyu, Xusheng Xu, Man-Hong Yung, Abolfazl Bayat
2022 J jnl
Quantum
Fei Shi, Mao-Sheng Li, Mengyao Hu, Lin Chen, Man-Hong Yung, Yan-Ling Wang, Xiande Zhang
2021 J jnl
Quantum Eng.
Jingwei Wen, Dingshun Lv, Man-Hong Yung, Gui-Lu Long
2019 J jnl
Quantum
Xi Yong, Man-Hong Yung, Xue-Ke Song, Xun Gao, Angsheng Li
2019 J jnl
CoRR
Xiao-Ming Zhang, Man-Hong Yung
2019 B conf
ISIT
Yuuya Yoshida, Man-Hong Yung, Masahito Hayashi
2019 J jnl
CoRR
Ximing Wang, Yue-Chi Ma, Min-Hsiu Hsieh, Man-Hong Yung
2019 J jnl
CoRR
Bin Cheng, Man-Hong Yung
2017 J jnl
CoRR
Yue-Chi Ma, Man-Hong Yung
2016 J jnl
CoRR
Hang Li, Xun Gao, Tao Xin, Man-Hong Yung, Guilu Long
2013 J jnl
CoRR
James D. Whitfield, Man-Hong Yung, David G. Tempel, Sergio Boixo, Alán Aspuru-Guzik
2004 J jnl
Quantum Inf. Comput.
Man-Hong Yung, Debbie W. Leung, Sougato Bose
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