Om Prakash

66 papers B 2Misc 1Journal 61Unranked 2
YearRankTypeTitle / Venue / Authors
2026 J jnl
CoRR
Soham Ravikant Joshi, Shikha Patel, Om Prakash
2026 J jnl
Appl. Algebra Eng. Commun. Comput.
Ashutosh Singh, Tulay Yildirim, Om Prakash
2026 J jnl
Discret. Math.
Indibar Debnath, Habibul Islam, Edgar Martínez-Moro, Om Prakash
2026 J jnl
CoRR
Anup Kushwaha, Om Prakash
2025 J jnl
Adv. Math. Commun.
Indibar Debnath, Om Prakash
2025 J jnl
CoRR
Anup Kushwaha, Indibar Debnath, Om Prakash
2025 conf
ICECET
Shikha Yadav, Ashutosh Singh, Om Prakash
2025 conf
IWSDA
Shikha Patel, Soham Ravikant Joshi, Om Prakash
2025 B conf
ISIT
Soham Ravikant Joshi, Shikha Patel, Om Prakash
2025 J jnl
CoRR
Anup Kushwaha, Om Prakash
2025 J jnl
Comput. Appl. Math.
Indibar Debnath, Om Prakash
2025 J jnl
Comput. Appl. Math.
Om Prakash, Shikha Patel, Habibul Islam
2025 J jnl
CoRR
Kundan Suxena, Indibar Debnath, Om Prakash
2025 J jnl
Adv. Math. Commun.
Shikha Yadav, Indibar Debnath, Om Prakash
2024 J jnl
CoRR
Om Prakash, Shikha Patel, Habibul Islam
2024 J jnl
CoRR
Priyanka Sharma, Ashutosh Singh, Om Prakash
2024 J jnl
CoRR
Ashutosh Singh, Tulay Yildirim, Om Prakash
2024 J jnl
CoRR
Indibar Debnath, Habibul Islam, Edgar Martínez-Moro, Om Prakash
2024 J jnl
Comput. Appl. Math.
Shikha Yadav, Ashutosh Singh, Habibul Islam, Om Prakash, Patrick Solé
2024 J jnl
IEEE Access
Ashutosh Singh, Priyanka Sharma, Om Prakash
2024 J jnl
Comput. Appl. Math.
Shikha Patel, Ashutosh Singh, Om Prakash
2023 J jnl
CoRR
Ashutosh Singh, Priyanka Sharma, Om Prakash
2023 J jnl
Cryptogr. Commun.
Indibar Debnath, Om Prakash, Habibul Islam
2023 J jnl
Entropy
Om Prakash, Ashutosh Singh, Ram Krishna Verma, Patrick Solé, Wei Cheng
2023 J jnl
CoRR
Om Prakash, Shikha Patel, Habibul Islam
2023 J jnl
Cryptogr. Commun.
Indibar Debnath, Om Prakash, Habibul Islam
2023 J jnl
Adv. Math. Commun.
Ram Krishna Verma, Om Prakash, Ashutosh Singh, Habibul Islam
2023 J jnl
Adv. Math. Commun.
Om Prakash, Shikha Yadav, Habibul Islam, Patrick Solé
2023 J jnl
Quantum Inf. Process.
Om Prakash, Ram Krishna Verma, Ashutosh Singh
2022 J jnl
Des. Codes Cryptogr.
Shikha Patel, Om Prakash
2022 J jnl
J. Appl. Math. Comput.
Habibul Islam, Shikha Patel, Om Prakash, Patrick Solé
2022 J jnl
Cryptogr. Commun.
Habibul Islam, Om Prakash
2022 J jnl
Cryptogr. Commun.
Shikha Patel, Om Prakash, Habibul Islam
2022 J jnl
Cryptogr. Commun.
Shikha Patel, Om Prakash, Habibul Islam
2022 J jnl
Adv. Math. Commun.
Habibul Islam, Om Prakash, Ram Krishna Verma
2022 J jnl
Discret. Math. Algorithms Appl.
Ravindra Kumar, Om Prakash
2022 J jnl
CoRR
Indibar Debnath, Ashutosh Singh, Om Prakash, Abdollah Alhevaz
2022 B conf
ISIT
Shikha Patel, Om Prakash
2022 J jnl
Int. J. Inf. Coding Theory
Om Prakash, Shikha Yadav, Priyanka Sharma
2022 J jnl
Comput. Appl. Math.
Om Prakash, Shikha Yadav, Habibul Islam, Patrick Solé
2022 J jnl
Discret. Math. Algorithms Appl.
Om Prakash, Shikha Patel
2021 J jnl
Discret. Math.
Habibul Islam, Edgar Martínez-Moro, Om Prakash
2021 J jnl
CoRR
Habibul Islam, Edgar Martínez-Moro, Om Prakash
2021 J jnl
Comput. Appl. Math.
Habibul Islam, Om Prakash
2021 J jnl
Quantum Inf. Process.
Adel Alahmadi, Habibul Islam, Om Prakash, Patrick Solé, Ahmad Alkenani, Najat M. Muthana, Rola Hijazi
2021 J jnl
Comput. Appl. Math.
Om Prakash, Shikha Patel, Shikha Yadav
2021 J jnl
J. Appl. Math. Comput.
Shikha Yadav, Habibul Islam, Om Prakash, Patrick Solé
2021 J jnl
Adv. Math. Commun.
Habibul Islam, Om Prakash, Patrick Solé
2020 J jnl
Int. J. Inf. Coding Theory
Habibul Islam, Ram Krishna Verma, Om Prakash
2020 J jnl
CoRR
Ram Krishna Verma, Om Prakash, Ashutosh Singh
2020 J jnl
Quantum Inf. Process.
Habibul Islam, Om Prakash
2020 Misc conf
ACCT
Ram Krishna Verma, Om Prakash, Ashutosh Singh
2020 J jnl
Int. J. Inf. Coding Theory
Shikha Patel, Om Prakash
2019 J jnl
J. Appl. Math. Comput.
Habibul Islam, Tushar Bag, Om Prakash
2019 J jnl
Discret. Math. Algorithms Appl.
Habibul Islam, Om Prakash
2019 J jnl
CoRR
Habibul Islam, Om Prakash
2019 J jnl
J. Appl. Math. Comput.
Habibul Islam, Om Prakash
2019 J jnl
CoRR
Om Prakash, Shikha Patel, Shikha Yadav
2019 J jnl
CoRR
Shikha Patel, Om Prakash
2018 J jnl
Discret. Math. Algorithms Appl.
Tushar Bag, Habibul Islam, Om Prakash, Ashish Kumar Upadhyay
2018 J jnl
Int. J. Inf. Coding Theory
Habibul Islam, Om Prakash
2018 J jnl
Int. J. Inf. Coding Theory
Habibul Islam, Om Prakash
2018 J jnl
CoRR
Om Prakash, Habibul Islam
2017 J jnl
CoRR
Habibul Islam, Om Prakash
2017 J jnl
Electron. Notes Discret. Math.
Sheela Suthar, Om Prakash
2017 J jnl
CoRR
Habibul Islam, Om Prakash
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))