Haik Kalantarian

43 papers B 3C 6Misc 2Journal 17Unranked 14
YearRankTypeTitle / Venue / Authors
2021 Misc conf
PSB
Peter Washington, Émilie Leblanc, Kaitlyn Dunlap, Yordan Penev, Maya Varma, Jae-Yoon Jung, Brianna Sierra Chrisman, Min Woo Sun, Nate Tyler Stockham, Kelley Marie Paskov, Haik Kalantarian, Catalin Voss, Nick Haber, Dennis P. Wall
2021 J jnl
Cogn. Comput.
Peter Washington, Haik Kalantarian, Jack Kent, Arman Husic, Aaron Kline, Émilie Leblanc, Cathy Hou, Cezmi Mutlu, Kaitlyn Dunlap, Yordan Penev, Nate Tyler Stockham, Brianna Sierra Chrisman, Kelley Marie Paskov, Jae-Yoon Jung, Catalin Voss, Nick Haber, Dennis P. Wall
2020 J jnl
IEEE Trans. Games
Haik Kalantarian, Khaled Jedoui, Peter Washington, Dennis P. Wall
2020 Misc conf
PSB
Peter Washington, Kelley Marie Paskov, Haik Kalantarian, Nate Tyler Stockham, Catalin Voss, Aaron Kline, Ritik Patnaik, Brianna Sierra Chrisman, Maya Varma, Qandeel Tariq, Kaitlyn Dunlap, Jessey N. Schwartz, Nick Haber, Dennis P. Wall
2020 J jnl
CoRR
Peter Washington, Haik Kalantarian, Jack Kent, Arman Husic, Aaron Kline, Émilie Leblanc, Cathy Hou, Cezmi Mutlu, Kaitlyn Dunlap, Yordan Penev, Maya Varma, Nate Tyler Stockham, Brianna Sierra Chrisman, Kelley M. Paskov, Min Woo Sun, Jae-Yoon Jung, Catalin Voss, Nick Haber, Dennis P. Wall
2019 J jnl
J. Heal. Informatics Res.
Haik Kalantarian, Peter Washington, Jessey N. Schwartz, Jena Daniels, Nick Haber, Dennis P. Wall
2019 J jnl
Artif. Intell. Medicine
Haik Kalantarian, Khaled Jedoui, Peter Washington, Qandeel Tariq, Kaiti Dunlap, Jessey N. Schwartz, Dennis P. Wall
2018 conf
ICHI
Haik Kalantarian, Peter Washington, Jessey N. Schwartz, Jena Daniels, Nick Haber, Dennis P. Wall
2017 J jnl
IEEE J. Biomed. Health Informatics
Haik Kalantarian, Costas Sideris, Majid Sarrafzadeh
2017 J jnl
IEEE Pervasive Comput.
Haik Kalantarian, Nabil Alshurafa, Majid Sarrafzadeh
2017 J jnl
IEEE Trans. Biomed. Eng.
Haik Kalantarian, Costas Sideris, Bobak Mortazavi, Nabil Alshurafa, Majid Sarrafzadeh
2017 J jnl
Sensors
Anahita Hosseini, Chris M. Buonocore, Sepideh Hashemzadeh, Hannaneh Hojaiji, Haik Kalantarian, Costas Sideris, Alex A. T. Bui, Christine E. King, Majid Sarrafzadeh
2017 J jnl
Pervasive Mob. Comput.
Haik Kalantarian, Majid Sarrafzadeh
2017 J jnl
IEEE J. Biomed. Health Informatics
Nabil Alshurafa, Costas Sideris, Mohammad Pourhomayoun, Haik Kalantarian, Majid Sarrafzadeh, Jo-Ann Eastwood
2016 conf
PETRA
Costas Sideris, Sakib Shaikh, Haik Kalantarian, Majid Sarrafzadeh
2016 B conf
ICCCN
Tuan Le, Haik Kalantarian, Mario Gerla
2016 conf
EMBC
Ebrahim Nemati, Konstantinos Sideris, Haik Kalantarian, Majid Sarrafzadeh
2016 J jnl
Comput. Biol. Medicine
Costas Sideris, Mohammad Pourhomayoun, Haik Kalantarian, Majid Sarrafzadeh
2016 C conf
BSN
Haik Kalantarian, Costas Sideris, Tuan Le, Christine E. King, Majid Sarrafzadeh
2016 C conf
WoWMoM
Tuan Le, Haik Kalantarian, Mario Gerla
2016 J jnl
Wirel. Commun. Mob. Comput.
Tuan Le, Haik Kalantarian, Mario Gerla
2016 J jnl
Artif. Intell. Medicine
Haik Kalantarian, Babak Moatamed, Nabil Alshurafa, Majid Sarrafzadeh
2016 conf
EMBC
Anahita Hosseini, Haik Kalantarian, Majid Sarrafzadeh
2016 conf
ICHI
Haik Kalantarian, Majid Sarrafzadeh, Shibo Zhang, Nabil Alshurafa
2016 B conf
SMARTCOMP
Costas Sideris, Haik Kalantarian, Ebrahim Nemati, Majid Sarrafzadeh
2016 conf
EMBC
Haik Kalantarian, Costas Sideris, Tuan Le, Anahita Hosseini, Majid Sarrafzadeh
2016 C conf
BSN
Anahita Hosseini, Chris M. Buonocore, Sepideh Hashemzadeh, Hannaneh Hojaiji, Haik Kalantarian, Costas Sideris, Alex A. T. Bui, Christine E. King, Majid Sarrafzadeh
2016
Haik Kalantarian
2016 conf
VNC
Reuben Vince Rabsatt, Haik Kalantarian, Mario Gerla
2016 J jnl
Microprocess. Microsystems
Haik Kalantarian, Bobak Mortazavi, Mohammad Pourhomayoun, Nabil Alshurafa, Majid Sarrafzadeh
2015 conf
WMNC
Tuan Le, Haik Kalantarian, Mario Gerla
2015 B conf
IWCMC
Tuan Le, Haik Kalantarian, Mario Gerla
2015 C conf
BSN
Haik Kalantarian, Nabil Alshurafa, Ebrahim Nemati, Tuan Le, Majid Sarrafzadeh
2015 conf
Med-Hoc-Net
Tuan Le, Haik Kalantarian, Mario Gerla
2015 J jnl
Comput. Biol. Medicine
Haik Kalantarian, Majid Sarrafzadeh
2015 conf
Wireless Health
Costas Sideris, Nabil Alshurafa, Haik Kalantarian, Majid Sarrafzadeh, Jo-Ann Eastwood
2015 J jnl
Comput. Biol. Medicine
Haik Kalantarian, Nabil Alshurafa, Tuan Le, Majid Sarrafzadeh
2015 conf
PerCom Workshops
Haik Kalantarian, Nabil Alshurafa, Tuan Le, Majid Sarrafzadeh
2015 conf
PerCom Workshops
Haik Kalantarian, Nabil Alshurafa, Mohammad Pourhomayoun, Majid Sarrafzadeh
2015 C conf
WOWMOM
Tuan Le, Haik Kalantarian, Mario Gerla
2014 C conf
BSN
Haik Kalantarian, Nabil Alshurafa, Majid Sarrafzadeh
2014 conf
Med-Hoc-Net
You Lu, Mario Gerla, Tuan Le, Vince Rabsatt, Haik Kalantarian
2013 conf
PerCom Workshops
Haik Kalantarian, Sunghoon Ivan Lee, Anurag Mishra, Hassan Ghasemzadeh, Jason J. Liu, Majid Sarrafzadeh
redb/extractors/decompiler/apk/jadx_wrapper.py
← Index redb/extractors/decompiler/apk/jadx_wrapper.py python
"""JADX decompiler subprocess wrapper.

Manages JADX subprocess execution for Java decompilation,
following the CAPA extractor subprocess pattern.
"""

import os
import re
import signal
import subprocess
from typing import Dict, Optional


class JADXDecompiler:
    """Subprocess wrapper for JADX Java decompilation."""

    def __init__(self, jadx_path: str = None, timeout: int = None, log=None):
        self.jadx_path = jadx_path or os.getenv("JADX_PATH", "jadx")
        self.timeout = timeout or int(os.getenv("JADX_TIMEOUT", "300"))
        self.log = log

    def decompile(self, apk_path: str, output_dir: str) -> bool:
        """Run JADX decompilation on an APK file.

        Returns True on success, False on failure.
        """
        cmd = [
            self.jadx_path,
            "--no-res",
            "--no-imports",
            "--threads-count", "2",
            "--output-dir", 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"JADX returned non-zero exit code {process.returncode}: "
                            f"{stderr[:500] if stderr else 'no stderr'}"
                        )
                    # JADX may still produce partial output on non-zero exit
                    return os.path.isdir(os.path.join(output_dir, "sources"))
                return True

            except subprocess.TimeoutExpired:
                if self.log:
                    self.log.error(
                        f"JADX timed out after {self.timeout}s"
                    )
                # Kill the process group
                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"JADX not found at '{self.jadx_path}'. "
                    "Install JADX or set JADX_PATH env var."
                )
            return False
        except Exception as e:
            if self.log:
                self.log.error(f"JADX execution error: {e}")
            return False

    def parse_java_methods(self, output_dir: str) -> Dict[str, str]:
        """Parse JADX output into per-method Java source.

        Returns dict keyed by 'package.ClassName.methodName(ParamType1, ParamType2)'.
        """
        sources_dir = os.path.join(output_dir, "sources")
        if not os.path.isdir(sources_dir):
            return {}

        methods = {}
        for root, _dirs, files in os.walk(sources_dir):
            for fname in files:
                if not fname.endswith(".java"):
                    continue
                fpath = os.path.join(root, fname)
                try:
                    with open(fpath, "r", encoding="utf-8", errors="replace") as f:
                        content = f.read()

                    # Derive the fully qualified class name from file path
                    rel_path = os.path.relpath(fpath, sources_dir)
                    class_fqn = rel_path.replace(os.sep, ".").replace("/", ".")
                    if class_fqn.endswith(".java"):
                        class_fqn = class_fqn[:-5]

                    file_methods = self._extract_methods_from_java(
                        content, class_fqn
                    )
                    methods.update(file_methods)

                except Exception:
                    continue

        return methods

    def _extract_methods_from_java(
        self, source: str, class_fqn: str
    ) -> Dict[str, str]:
        """Extract individual methods from a Java source file.

        Uses brace-depth tracking to find method boundaries.
        """
        methods = {}
        lines = source.split("\n")
        i = 0

        while i < len(lines):
            line = lines[i]
            match = self._is_method_declaration(line)
            if match:
                method_name, param_types = match
                # Track brace depth to find method end
                start_line = i
                brace_depth = 0
                found_open = False

                for j in range(i, len(lines)):
                    for ch in lines[j]:
                        if ch == "{":
                            brace_depth += 1
                            found_open = True
                        elif ch == "}":
                            brace_depth -= 1

                    if found_open and brace_depth == 0:
                        method_body = "\n".join(lines[start_line : j + 1])
                        key = f"{class_fqn}.{method_name}({param_types})"
                        methods[key] = method_body
                        i = j + 1
                        break
                else:
                    i += 1
            else:
                i += 1

        return methods

    # Regex for method declarations (not constructors, not class/interface decl)
    _METHOD_DECL_RE = re.compile(
        r"^\s*(?:(?:public|private|protected|static|final|synchronized|"
        r"native|abstract|strictfp)\s+)*"
        r"(?:[\w<>\[\]?.]+\s+)"  # return type
        r"(\w+)"  # method name
        r"\s*\(([^)]*)\)"  # parameters
        r"(?:\s*throws\s+[\w.,\s]+)?"
        r"\s*\{"
    )

    def _is_method_declaration(self, line: str) -> Optional[tuple]:
        """Check if a line is a method declaration.

        Returns (method_name, param_types_str) or None.
        """
        m = self._METHOD_DECL_RE.match(line)
        if not m:
            return None

        method_name = m.group(1)
        params_raw = m.group(2).strip()

        # Skip class-level blocks
        if method_name in ("if", "for", "while", "switch", "try", "catch"):
            return None

        # Extract just the type names from parameters
        if not params_raw:
            return (method_name, "")

        param_types = []
        for param in params_raw.split(","):
            param = param.strip()
            if not param:
                continue
            parts = param.split()
            # Last non-annotation token before the variable name is the type
            # Simple heuristic: type is second-to-last, name is last
            if len(parts) >= 2:
                param_types.append(parts[-2])
            elif len(parts) == 1:
                param_types.append(parts[0])

        return (method_name, ", ".join(param_types))