Vibhore Kumar

32 papers A 7B 2Journal 8Unranked 14
YearRankTypeTitle / Venue / Authors
2014 conf
ECML/PKDD (1)
Leman Akoglu, Rohit Khandekar, Vibhore Kumar, Srinivasan Parthasarathy, Deepak Rajan, Kun-Lung Wu
2013 J jnl
IBM J. Res. Dev.
Martin Hirzel, Henrique Andrade, Bugra Gedik, Gabriela Jacques-Silva, Rohit Khandekar, Vibhore Kumar, Mark P. Mendell, Howard Nasgaard, Scott Schneider, Robert Soulé, Kun-Lung Wu
2012 J jnl
CoRR
Gabriela Jacques-Silva, Bugra Gedik, Rohit Wagle, Kun-Lung Wu, Vibhore Kumar
2012 J jnl
Proc. VLDB Endow.
Gabriela Jacques-Silva, Bugra Gedik, Rohit Wagle, Kun-Lung Wu, Vibhore Kumar
2012 conf
DEBS
Giuliano Losa, Vibhore Kumar, Henrique Andrade, Bugra Gedik, Martin Hirzel, Robert Soulé, Kun-Lung Wu
2012 conf
DEBS
Sai Wu, Vibhore Kumar, Kun-Lung Wu, Beng Chin Ooi
2012 conf
DEBS
Eric Bouillet, Ravi Kothari, Vibhore Kumar, Laurent Mignet, Senthil Nathan, Anand Ranganathan, Deepak S. Turaga, Octavian Udrea, Olivier Verscheure
2011 J jnl
Clust. Comput.
Sanjay Kumar, Vanish Talwar, Vibhore Kumar, Parthasarathy Ranganathan, Karsten Schwan
2010 A conf
ESOP
Robert Soulé, Martin Hirzel, Robert Grimm, Bugra Gedik, Henrique Andrade, Vibhore Kumar, Kun-Lung Wu
2010 B conf
EDBT
Vibhore Kumar, Henrique Andrade, Bugra Gedik, Kun-Lung Wu
2010 A conf
Middleware
Joel L. Wolf, Deepak Rajan, Kirsten Hildrum, Rohit Khandekar, Vibhore Kumar, Sujay S. Parekh, Kun-Lung Wu, Andrey Balmin
2010 conf
IPDPS Workshops
Scott Pakin, Craig B. Stunkel, José Flich, Henrique Andrade, Vibhore Kumar, Deepak S. Turaga
2009 J jnl
IEEE Trans. Parallel Distributed Syst.
Sangeetha Seshadri, Vibhore Kumar, Brian F. Cooper, Ling Liu
2009 conf
ICAC
Sanjay Kumar, Vanish Talwar, Vibhore Kumar, Parthasarathy Ranganathan, Karsten Schwan
2008 B conf
NOMS
Vibhore Kumar, Karsten Schwan, Subu Iyer, Yuan Chen, Akhil Sahai
2008
Vibhore Kumar
2008 conf
SERVICES I
Sangeetha Seshadri, Bhuvan Bamba, Brian F. Cooper, Vibhore Kumar, Ling Liu, Karsten Schwan, Gong Zhang
2007 conf
Integrated Network Management
Zhongtang Cai, Yuan Chen, Vibhore Kumar, Dejan S. Milojicic, Karsten Schwan
2007 J jnl
J. Grid Comput.
Zhongtang Cai, Vibhore Kumar, Karsten Schwan
2007 J jnl
Clust. Comput.
Vibhore Kumar, Brian F. Cooper, Zhongtang Cai, Greg Eisenhauer, Karsten Schwan
2007 A conf
IPDPS
Sangeetha Seshadri, Vibhore Kumar, Brian F. Cooper, Ling Liu
2007 A conf
Middleware
Vibhore Kumar, Brian F. Cooper, Greg Eisenhauer, Karsten Schwan
2006 A conf
HPDC
Zhongtang Cai, Vibhore Kumar, Karsten Schwan
2006 J jnl
Concurr. Comput. Pract. Exp.
Zhongtang Cai, Greg Eisenhauer, Qi He, Vibhore Kumar, Karsten Schwan, Matthew Wolf
2006 conf
ICAC
Vibhore Kumar, Zhongtang Cai, Brian F. Cooper, Greg Eisenhauer, Karsten Schwan, Mohamed S. Mansour, Balasubramanian Seshasayee, Patrick M. Widener
2006 conf
ICDE Workshops
Sangeetha Seshadri, Vibhore Kumar, Brian F. Cooper
2006 A conf
Middleware
Zhongtang Cai, Vibhore Kumar, Brian F. Cooper, Greg Eisenhauer, Karsten Schwan, Robert E. Strom
2005 conf
ICAC
Vibhore Kumar, Brian F. Cooper, Karsten Schwan
2005 A conf
ICDCS
Vibhore Kumar, Brian F. Cooper, Zhongtang Cai, Greg Eisenhauer, Karsten Schwan
2004 conf
Middleware for Grid Computing
Zhongtang Cai, Greg Eisenhauer, Qi He, Vibhore Kumar, Karsten Schwan, Matthew Wolf
2004 conf
DMSN
Vibhore Kumar, Brian F. Cooper, Shamkant B. Navathe
2004 conf
DSOM
David M. Chess, Vibhore Kumar, Alla Segal, Ian Whalley
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))