Kasturi Vasudevan

46 papers B 2C 1Journal 37Unranked 6
YearRankTypeTitle / Venue / Authors
2026 J jnl
CoRR
Kasturi Vasudevan
2023 J jnl
CoRR
Kasturi Vasudevan, Surendra Kota, Lov Kumar, Himanshu Bhusan Mishra
2023 J jnl
CoRR
Kasturi Vasudevan, Surendra Kota, Lov Kumar, Himanshu Bhusan Mishra
2022 conf
FNWF
Haijian Sun, Chris Ng, Yiming Huo, Rose Qingyang Hu, Ning Wang, Chi-Ming Chen, Kasturi Vasudevan, Jin Yang, Webert Montlouis, Dauda Ayanda, Kumar Vijay Mishra, Kürsat Tekbiyik, Nasir Hussain, Harish Kumar Sahoo, Yang Miao
2021 J jnl
IEEE Access
A. Phani Kumar Reddy, M. Sheeba Kumari, Vishakha Dhanwani, Akhil Kalpesh Bachkaniwala, Navin Kumar, Kasturi Vasudevan, Srinivasan Selvaganapathy, Sendil Kumar Devar, Punit Rathod, Vinosh Babu James J.
2021 J jnl
Wirel. Commun. Mob. Comput.
Ikhlas Ahmad, Haris Dildar, Wasi Ur Rehman Khan, Syed Amir Ali Shah, Shakir Ullah, Sadiq Ullah, Syed Muhammad Umar, Mahmoud A. M. Albreem, Mohammed H. Alsharif, Kasturi Vasudevan
2021 J jnl
CoRR
Kasturi Vasudevan, A. Phani Kumar Reddy, Gyanesh Kumar Pathak, Mahmoud A. M. Albreem
2021 conf
VTC Fall
Shivani Singh, Prem Singh, Saurabh Sahu, Kasturi Vasudevan, Himanshu B. Mishra
2020 J jnl
Int. J. Wirel. Inf. Networks
Mahmoud A. M. Albreem, Kasturi Vasudevan
2020 J jnl
CoRR
Kasturi Vasudevan, A. Phani Kumar Reddy, Gyanesh Kumar Pathak, Shivani Singh
2020 J jnl
IEEE Commun. Lett.
Prem Singh, Bagadi Usha Rani, Rohit Budhiraja, Kasturi Vasudevan
2020 J jnl
CoRR
Kasturi Vasudevan, Gyanesh Kumar Pathak, A. Phani Kumar Reddy
2020 J jnl
IEEE Trans. Commun.
Prem Singh, Himanshu B. Mishra, Aditya K. Jagannatham, Kasturi Vasudevan, Lajos Hanzo
2020 J jnl
IET Commun.
Shivani Singh, Prem Singh, Kasturi Vasudevan
2019 conf
NCC
Prem Singh, Kasturi Vasudevan
2019 J jnl
IEEE Trans. Veh. Technol.
Prem Singh, Rohit Budhiraja, Kasturi Vasudevan
2019 J jnl
IEEE Commun. Lett.
Prem Singh, Rohit Budhiraja, Kasturi Vasudevan
2019 J jnl
IEEE Trans. Signal Process.
Prem Singh, Himanshu B. Mishra, Aditya K. Jagannatham, Kasturi Vasudevan
2019 J jnl
Wirel. Pers. Commun.
Prem Singh, Kasturi Vasudevan
2019 J jnl
IET Commun.
Prem Singh, Kasturi Vasudevan
2018 J jnl
Wirel. Pers. Commun.
Ekant Sharma, Sahil Rane, Kasturi Vasudevan
2018 J jnl
IEEE Wirel. Commun. Lett.
Prem Singh, Ekant Sharma, Kasturi Vasudevan, Rohit Budhiraja
2018 J jnl
CoRR
Kasturi Vasudevan, K. Madhu, Shivani Singh
2018 J jnl
IEEE Trans. Commun.
Ekant Sharma, Rohit Budhiraja, Kasturi Vasudevan, Lajos Hanzo
2018 B conf
GLOBECOM
Prem Singh, Bagadi Usha Rani, Himanshu B. Mishra, Kasturi Vasudevan
2017 C conf
APCC
Prem Singh, Kasturi Vasudevan
2017 J jnl
CoRR
Ekant Sharma, Rohit Budhiraja, Kasturi Vasudevan
2017 conf
NCC
Prem Singh, Kasturi Vasudevan
2017 J jnl
CoRR
Vineel Kumar Veludandi, Kasturi Vasudevan
2017 J jnl
Wirel. Pers. Commun.
Vineel Kumar Veludandi, Kasturi Vasudevan
2017 J jnl
CoRR
Ekant Sharma, Rohit Budhiraja, Kasturi Vasudevan
2017 B conf
PIMRC
Ekant Sharma, Rohit Budhiraja, Kasturi Vasudevan
2017 J jnl
CoRR
Kasturi Vasudevan
2017 J jnl
Phys. Commun.
Ekant Sharma, Himanshu B. Mishra, Kasturi Vasudevan, Rohit Budhiraja
2015 J jnl
Wirel. Pers. Commun.
Kasturi Vasudevan
2015 J jnl
CoRR
Kasturi Vasudevan
2015 J jnl
CoRR
Kasturi Vasudevan
2015 J jnl
IET Commun.
Himanshu B. Mishra, Kasturi Vasudevan
2015 conf
SCVT
Ekant Sharma, Kasturi Vasudevan
2013 J jnl
IEEE Veh. Technol. Mag.
Rong Zhang, Li Wang, Gerard Parr, Osianoh Glenn Aliu, Benga Awoseyila, Nader Azarmi, Saleem Bhatti, Eliane L. Bodanese, Hong Chen, Mehrdad Dianati, Amit Kumar Dutta, Michael Fitch, Krishnamurthy Giridhar, Steve Hailes, K. V. S. Hari, Muhammad Ali Imran, Aditya K. Jagannatham, Abhay Karandikar, Santosh Kawade, Mohammed Zafar Ali Khan, Sayee C. Kompalli, Patrick Langdon, Babu Narayanan, Andreas Mauthe, Joseph McGeehan, Neelesh B. Mehta, J. Klutto Milleth, Klaus Moessner, Rakshith Rajashekar, Barathram Ramkumar, Vinay J. Ribeiro, Kasturi Vasudevan, Lajos Hanzo, John Bigham
2013 conf
ITST
Umesh Chandra Samal, Kasturi Vasudevan
2012 J jnl
Signal Image Video Process.
Kasturi Vasudevan
2007 J jnl
Signal Image Video Process.
Kasturi Vasudevan
2004 J jnl
Signal Process.
Kasturi Vasudevan
2001 J jnl
Signal Process.
Kasturi Vasudevan, Krishnamurthy Giridhar, Bhaskar Ramamurthi
1999 J jnl
Signal Process.
Kasturi Vasudevan, Krishnamurthy Giridhar, Bhaskar Ramamurthi
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))