Manisa Pipattanasomporn

48 papers Journal 17Unranked 31
YearRankTypeTitle / Venue / Authors
2021 J jnl
CoRR
Umit Cali, Murat Kuzlu, Manisa Pipattanasomporn, Onur Elma, Ramesh Reddi
2021 J jnl
CoRR
Umit Cali, Murat Kuzlu, Vinayak Sharma, Manisa Pipattanasomporn, Ferhat Özgür Çatak
2020 conf
ISGT
Ikechukwu Dimobi, Manisa Pipattanasomporn, Saifur Rahman
2020 J jnl
IEEE Internet Things J.
Xiangyu Zhang, Manisa Pipattanasomporn, Tao Chen, Saifur Rahman
2020 J jnl
IEEE Trans. Smart Grid
Rajendra Adhikari, Manisa Pipattanasomporn, Saifur Rahman
2020 conf
ISGT
Murat Kuzlu, Salih Sarp, Manisa Pipattanasomporn, Umit Cali
2019 conf
ISC2
Chayanit Chotbenjamaporn, Achiraya Chutisilp, Panuwat Threethanuchai, Sarun Poolkrajang, Methasit Tuwawit, Pamaree Laowong, Apisara Tirajitto, Ekkawit Wang, Rada Muangsiri, Arocha Compeecharoenporn, Vasant Srichawla, Nakornthip Prompoon, Chotirat Ratanamahatana, Manisa Pipattanasomporn
2019 conf
ISGT
Ashraful Haque, Manisa Pipattanasomporn, Saifur Rahman, Sri Raghavan Kothandaraman, Ahmadreza Malekpour, Esa Aleksi Paaso, Shay Bahramirad
2019 conf
ISGT
Manisa Pipattanasomporn, Saifur Rahman, Murat Kuzlu
2019 conf
ISGT
Zejia Jing, Mengmeng Cai, Manisa Pipattanasomporn, Saifur Rahman, Raghavan Kothandaraman, Ahmadreza Malekpour, Esa Aleksi Paaso, Shay Bahramirad
2019 conf
ISGT
Jason Lin, Manisa Pipattanasomporn, Saifur Rahman
2019 J jnl
IEEE Internet Things J.
Aditya Nugur, Manisa Pipattanasomporn, Murat Kuzlu, Saifur Rahman
2019 conf
ISC2
Jatuwat Sa-ngiampak, Chutipon Hirankanokkul, Yanisa Sunthornyotin, Jakpat Mingmongkolmitr, Sojirath Thunprateep, Nicha Rojsrikul, Tai Tantipiwatanaskul, Kachamas Techapichetvanich, Anon Pongsawang, Thanakorn Prayoonkittikul, Ukrit Wattanakulchart, Nakornthip Prompoon, Chotirat Ratanamahatana, Manisa Pipattanasomporn
2019 J jnl
IEEE Access
Desong Bian, Di Shi, Manisa Pipattanasomporn, Murat Kuzlu, Saifur Rahman
2019 conf
ISC2
Chavich Ajchariyavanich, Tanat Limpisthira, Nachanon Chanjarasvichai, Theetouch Jareonwatanan, Wichayut Phongphanpanya, Sirapol Wareechuensuk, Supavit Srichareonkul, Satid Tachatanitanont, Chotirat Ratanamahatana, Nakornthip Prompoon, Manisa Pipattanasomporn
2019 conf
Blockchain
Murat Kuzlu, Manisa Pipattanasomporn, Levent Gurses, Saifur Rahman
2019 J jnl
CoRR
Desong Bian, Murat Kuzlu, Manisa Pipattanasomporn, Saifur Rahman, Di Shi
2019 J jnl
IET Commun.
Desong Bian, Murat Kuzlu, Manisa Pipattanasomporn, Saifur Rahman, Di Shi
2019 conf
ISC2
T. Chaiwattanayon, N. Oudomying, Pongpanod Sankosik, P. A.-Aree, K. Vasiksiri, N. Boonyakitjakarn, T. Janwattanakul, T. Pruekkumvong, P. Ketprapakorn, B. Lohachitranont, P. Wiboontanasarn, Chotirat Ratanamahatana, Nakornthip Prompoon, Manisa Pipattanasomporn
2019 conf
ISC2
Boonsita Vatcharakomonphan, Chompakorn Chaksangchaichot, Natnapin Ketchaikosol, Tanapong Tetiranont, Tharit Chullapram, Pattabhum Kosittanakiat, Peeramit Masana, Phirawat Chansajcha, Satsawat Suttawuttiwong, Supakit Thamkittikhun, Samatchaya Wattanachindaporn, Akekamon Boonsith, Chotirat Ratanamahatana, Nakornthip Prompoon, Manisa Pipattanasomporn
2018 conf
ISC2
Xiangyu Zhang, Mengmeng Cai, Manisa Pipattanasomporn, Saifur Rahman
2018 conf
ISC2
Murat Kuzlu, Manisa Pipattanasomporn, Saifur Rahman
2018 conf
ISC2
Mengmeng Cai, Sneharaj Ramdaspalli, Manisa Pipattanasomporn, Saifur Rahman, Ahmadreza Malekpour, Sri Raghavan Kothandaraman
2018 conf
ISC2
Musaed Alrashidi, Massoud Alrashidi, Manisa Pipattanasomporn, Saifur Rahman
2017 conf
ISGT
Rajendra Adhikari, Xiangyu Zhang, Manisa Pipattanasomporn, Murat Kuzlu, Saifur Rahman
2017 J jnl
IET Networks
Murat Kuzlu, Md. Moshiur Rahman, Manisa Pipattanasomporn, Saifur Rahman
2017 conf
ISGT
Kruthika Rathinavel, Manisa Pipattanasomporn, Murat Kuzlu, Saifur Rahman
2016 conf
ISGT Europe
Xiangyu Zhang, Manisa Pipattanasomporn, Murat Kuzlu, Saifur Rahman Bradley
2016 conf
WF-IoT
Xiangyu Zhang, Rajendra Adhikari, Manisa Pipattanasomporn, Murat Kuzlu, Saifur Rahman
2016 conf
ISGT Europe
Rajendra Adhikari, Manisa Pipattanasomporn, Murat Kuzlu, Saifur Rahman Bradley
2016 conf
ISGT Europe
Sneharaj Ramdaspalli, Manisa Pipattanasomporn, Murat Kuzlu, Saifur Rahman
2015 J jnl
IEEE Trans. Smart Grid
Warodom Khamphanchai, Manisa Pipattanasomporn, Murat Kuzlu, Jinghe Zhang, Saifur Rahman
2015 conf
ISGT Asia
Warodom Khamphanchai, Manisa Pipattanasomporn, Murat Kuzlu, S. Rahman
2015 conf
ISGT Asia
Manisa Pipattanasomporn, Murat Kuzlu, Warodom Khamphanchai, A. Saha, Kruthika Rathinavel, S. Rahman
2014 conf
ISGT
M. M. Rahman, Murat Kuzlu, Manisa Pipattanasomporn, Saifur Rahman
2014 conf
ISGT
Desong Bian, Murat Kuzlu, Manisa Pipattanasomporn, Saifur Rahman
2014 J jnl
Comput. Networks
Murat Kuzlu, Manisa Pipattanasomporn, Saifur Rahman
2014 J jnl
IEEE Trans. Smart Grid
Manisa Pipattanasomporn, Murat Kuzlu, Saifur Rahman, Yonael Teklu
2013 conf
ISGT
Warodom Khamphanchai, Murat Kuzlu, Manisa Pipattanasomporn
2013 conf
ISGT
Murat Kuzlu, Manisa Pipattanasomporn
2013 conf
ISGT
Avijit Saha, Murat Kuzlu, Manisa Pipattanasomporn
2013 conf
ISGT
Shibani Ghosh, Manisa Pipattanasomporn, Saifur Rahman
2012 J jnl
IEEE Trans. Smart Grid
Manisa Pipattanasomporn, Murat Kuzlu, Saifur Rahman
2012 conf
ISGT
Manisa Pipattanasomporn, Murat Kuzlu, Saifur Rahman
2012 J jnl
IEEE Trans. Smart Grid
Reza Arghandeh, Manisa Pipattanasomporn, Saifur Rahman
2012 J jnl
IEEE Trans. Smart Grid
Shengnan Shao, Manisa Pipattanasomporn, Saifur Rahman
2012 J jnl
IEEE Trans. Smart Grid
Murat Kuzlu, Manisa Pipattanasomporn, Saifur Rahman
2011 J jnl
IEEE Trans. Smart Grid
Shengnan Shao, Manisa Pipattanasomporn, Saifur Rahman
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))