Ozgun Y. Bursalioglu

47 papers B 7Misc 4Journal 24Unranked 12
YearRankTypeTitle / Venue / Authors
2024 J jnl
CoRR
Jaime Guajardo, Ozgun Y. Bursalioglu, Dan B. Goldman
2019 J jnl
IEEE Trans. Wirel. Commun.
Ozgun Y. Bursalioglu, Giuseppe Caire, Ratheesh Kumar Mungara, Haralabos C. Papadopoulos, Chenwei Wang
2018 conf
ICC Workshops
Ozgun Y. Bursalioglu, Zheda Li, Chenwei Wang, Haralabos C. Papadopoulos
2018 J jnl
CoRR
Ozgun Y. Bursalioglu, Zheda Li, Chenwei Wang, Haralabos C. Papadopoulos
2018 B conf
ISIT
Ratheesh Kumar Mungara, Giuseppe Caire, Ozgun Y. Bursalioglu, Chenwei Wang, Haralabos C. Papadopoulos
2018 J jnl
CoRR
Ozgun Y. Bursalioglu, Giuseppe Caire, Ratheesh Kumar Mungara, Haralabos C. Papadopoulos, Chenwei Wang
2018 J jnl
IEEE Trans. Signal Process.
Vishnu V. Ratnam, Andreas F. Molisch, Ozgun Y. Bursalioglu, Haralabos C. Papadopoulos
2018 conf
ICC
Chenwei Wang, Ozgun Y. Bursalioglu, Haralabos C. Papadopoulos, Giuseppe Caire
2018 J jnl
CoRR
Chenwei Wang, Ozgun Y. Bursalioglu, Haralabos C. Papadopoulos, Giuseppe Caire
2018 conf
ICC
Shiva Navabi, Chenwei Wang, Ozgun Y. Bursalioglu, Haralabos C. Papadopoulos
2018 J jnl
CoRR
Shiva Navabi, Chenwei Wang, Ozgun Y. Bursalioglu, Haralabos C. Papadopoulos
2017 J jnl
CoRR
Ozgun Y. Bursalioglu, Chenwei Wang, Haralabos C. Papadopoulos, Giuseppe Caire
2017 conf
ICC
Zheda Li, Nadisanka Rupasinghe, Ozgun Y. Bursalioglu, Chenwei Wang, Haralabos C. Papadopoulos, Giuseppe Caire
2017 J jnl
CoRR
Vishnu V. Ratnam, Andreas F. Molisch, Ozgun Y. Bursalioglu, Haralabos C. Papadopoulos
2017 conf
ICC
Vishnu V. Ratnam, Ozgun Y. Bursalioglu, Haralabos C. Papadopoulos, Andreas F. Molisch
2016 Misc conf
ACSSC
Ozgun Y. Bursalioglu, Chenwei Wang, Haralabos C. Papadopoulos, Giuseppe Caire
2016 J jnl
CoRR
Weng-Chon Ao, Chenwei Wang, Ozgun Y. Bursalioglu, Haralabos C. Papadopoulos
2016 conf
ICC
Weng-Chon Ao, Chenwei Wang, Ozgun Y. Bursalioglu, Haralabos C. Papadopoulos
2016 J jnl
CoRR
Zheda Li, Nadisanka Rupasinghe, Ozgun Y. Bursalioglu, Chenwei Wang, Haralabos C. Papadopoulos, Giuseppe Caire
2016 J jnl
IEICE Trans. Commun.
Haralabos C. Papadopoulos, Chenwei Wang, Ozgun Y. Bursalioglu, Xiaolin Hou, Yoshihisa Kishiyama
2016 J jnl
IEEE Trans. Wirel. Commun.
Dilip Bethanabhotla, Ozgun Y. Bursalioglu, Haralabos C. Papadopoulos, Giuseppe Caire
2016 J jnl
CoRR
Ozgun Y. Bursalioglu, Chenwei Wang, Haralabos C. Papadopoulos, Giuseppe Caire
2016 conf
ICC
Ozgun Y. Bursalioglu, Chenwei Wang, Haralabos C. Papadopoulos, Giuseppe Caire
2015 B conf
GLOBECOM
Qiaoyang Ye, Ozgun Y. Bursalioglu, Haralabos C. Papadopoulos
2015 J jnl
CoRR
Qiaoyang Ye, Ozgun Y. Bursalioglu, Haralabos C. Papadopoulos
2015 J jnl
CoRR
Qiaoyang Ye, Ozgun Y. Bursalioglu, Haralabos C. Papadopoulos, Constantine Caramanis, Jeffrey G. Andrews
2014 conf
GlobalSIP
Haralabos C. Papadopoulos, Ozgun Y. Bursalioglu, Giuseppe Caire
2014 J jnl
CoRR
Dilip Bethanabhotla, Ozgun Y. Bursalioglu, Haralabos C. Papadopoulos, Giuseppe Caire
2014 J jnl
IEEE Trans. Wirel. Commun.
Ryan Rogalin, Ozgun Y. Bursalioglu, Haralabos C. Papadopoulos, Giuseppe Caire, Andreas F. Molisch, Antonios Michaloliakos, Horia Vlad Balan, Konstantinos Psounis
2014 Misc conf
ITA
Dilip Bethanabhotla, Ozgun Y. Bursalioglu, Haralabos C. Papadopoulos, Giuseppe Caire
2013 Misc conf
ITA
Ryan Rogalin, Ozgun Y. Bursalioglu, Haralabos C. Papadopoulos, Giuseppe Caire, Andreas F. Molisch
2013 J jnl
IEEE Trans. Commun.
Ozgun Y. Bursalioglu, Giuseppe Caire, Dariush Divsalar
2013 J jnl
CoRR
Ryan Rogalin, Ozgun Y. Bursalioglu, Haralabos C. Papadopoulos, Giuseppe Caire, Andreas F. Molisch, Antonios Michaloliakos, Horia Vlad Balan, Konstantinos Psounis
2013 conf
VTC Spring
Ankit Singh Rawat, Ozgun Y. Bursalioglu, Haralabos C. Papadopoulos
2012 J jnl
CoRR
Ozgun Y. Bursalioglu, Giuseppe Caire, Dariush Divsalar
2012 conf
ACSCC
Ozgun Y. Bursalioglu, Sean A. Ramprashad, Haralabos C. Papadopoulos
2011 B conf
ISIT
Ozgun Y. Bursalioglu, Giuseppe Caire
2011 Misc conf
ITA
Ozgun Y. Bursalioglu, Giuseppe Caire, Dariush Divsalar
2011 J jnl
IEEE Trans. Signal Process.
Ozgun Y. Bursalioglu, Maria Fresia, Giuseppe Caire, H. Vincent Poor
2010 B conf
DCC
Ozgun Y. Bursalioglu, Giuseppe Caire
2009 J jnl
CoRR
Ozgun Y. Bursalioglu, Maria Fresia, Giuseppe Caire, H. Vincent Poor
2009 B conf
DCC
Ozgun Y. Bursalioglu, Maria Fresia, Giuseppe Caire, H. Vincent Poor
2009 B conf
ISIT
Ozgun Y. Bursalioglu, Giuseppe Caire, Maria Fresia, H. Vincent Poor
2008 J jnl
Int. J. Digit. Multim. Broadcast.
Ozgun Y. Bursalioglu, Maria Fresia, Giuseppe Caire, H. Vincent Poor
2008 conf
VTC Fall
Ozgun Y. Bursalioglu, Haralabos C. Papadopoulos, Carl-Erik W. Sundberg
2006 conf
ICASSP (2)
Bi Song, Ozgun Y. Bursalioglu, Amit K. Roy-Chowdhury, Ertem Tuncel
2005 B conf
ISIT
Ozgun Y. Bursalioglu, Ertem Tuncel
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))