Haitao Guo

60 papers A* 1B 1C 1Misc 3Journal 38Unranked 16
YearRankTypeTitle / Venue / Authors
2026 J jnl
Expert Syst. Appl.
Kun Zhu, Haitao Guo, Guanzhou Chen, Xiaodong Zhang, Lei Ding, Xiangyun Liu, Jun Lu
2026 A* conf
AAAI
Lei Ding, Xibing Zuo, Haitao Guo, Jun Lu, Zhihui Gong, Xuanguang Liu, Jicang Lu
2026 J jnl
CoRR
Jun Lu, Zehao Sang, Haoqi Wei, Xiangyun Liu, Kun Zhu, Haitao Guo, Zhihui Gong, Lei Ding
2025 J jnl
IET Image Process.
Yuanyuan Tian, Hongliang Wang, Xiaolong Zhu, Haitao Guo
2025 J jnl
CoRR
Kai Zheng, Zhenkai Wu, Fupeng Wei, Miaolan Zhou, Kai Lie, Haitao Guo, Lei Ding, Wei Zhang, Hang-Cheng Dong
2025 J jnl
CoRR
Lei Ding, Tong Liu, Xuanguang Liu, Xiangyun Liu, Haitao Guo, Jun Lu
2025 J jnl
CoRR
Lei Ding, Xibing Zuo, Danfeng Hong, Haitao Guo, Jun Lu, Zhihui Gong, Lorenzo Bruzzone
2025 J jnl
Comput. Mater. Continua
Shengxi Jiao, Fenghao Xu, Haitao Guo
2024 J jnl
IET Image Process.
Zhaoxuan Lu, Xiaolong Zhu, Haitao Guo, Xingang Xie, Xiangzi Chen, Xiangqian Quan
2024 J jnl
IEEE Trans. Geosci. Remote. Sens.
Lei Ding, Jing Zhang, Haitao Guo, Kai Zhang, Bing Liu, Lorenzo Bruzzone
2023 J jnl
Remote. Sens.
Ziyu Rao, Jun Lu, Chuan Li, Haitao Guo
2023 J jnl
Remote. Sens.
Xuesong Zhang, Zhihui Gong, Haitao Guo, Xiangyun Liu, Lei Ding, Kun Zhu, Jiaqi Wang
2023 J jnl
IEEE Trans. Geosci. Remote. Sens.
Donghang Yu, Haitao Guo, Chuan Zhao, Xiangyun Liu, Qing Xu, Yuzhun Lin, Lei Ding
2023 J jnl
Remote. Sens.
Yiting Niu, Haitao Guo, Jun Lu, Lei Ding, Donghang Yu
2023 J jnl
IEEE J. Sel. Top. Appl. Earth Obs. Remote. Sens.
Donghang Yu, Qing Xu, Xiangyun Liu, Haitao Guo, Jun Lu, Yuzhun Lin, Liang Lv
2023 J jnl
Remote. Sens.
Qingfeng Hou, Jun Lu, Haitao Guo, Xiangyun Liu, Zhihui Gong, Kun Zhu, Yifan Ping
2023 J jnl
Remote. Sens.
Yiting Niu, Haitao Guo, Jun Lu, Lei Ding, Donghang Yu
2022 J jnl
J. Ambient Intell. Humaniz. Comput.
Kayumiy Shokh Jakhon, Haitao Guo, Kyungeun Cho
2022 J jnl
IEEE Access
Donghang Yu, Qing Xu, Haitao Guo, Jun Lu, Yuzhun Lin, Xiangyun Liu
2022 conf
CACML
Weijia Sun, Qian Zhang, Haitao Guo, Qingliang Chen, Juxiu Wu, Yujie Zhang, Xueyin An, Chuancheng Ma, Hengchang Li
2022 J jnl
IEEE J. Sel. Top. Appl. Earth Obs. Remote. Sens.
Donghang Yu, Qing Xu, Haitao Guo, Junfeng Xu, Jun Lu, Yuzhun Lin, Xiangyun Liu
2022 J jnl
IEEE Trans. Geosci. Remote. Sens.
Lei Ding, Haitao Guo, Sicong Liu, Lichao Mou, Jing Zhang, Lorenzo Bruzzone
2022 conf
EITCE
Yuxin Shang, Hao Cuib, Haitao Guo
2022 conf
NCAA (1)
Xiaotong Pan, Jian Tang, Heng Xia, Weitao Li, Haitao Guo
2022 J jnl
CoRR
Lei Ding, Jing Zhang, Kai Zhang, Haitao Guo, Bing Liu, Lorenzo Bruzzone
2022 J jnl
Remote. Sens.
Jiaqi Wang, Zhihui Gong, Xiangyun Liu, Haitao Guo, Jun Lu, Donghang Yu, Yuzhun Lin
2022 J jnl
Remote. Sens.
Jiaqi Wang, Zhihui Gong, Xiangyun Liu, Haitao Guo, Donghang Yu, Lei Ding
2022 J jnl
J. Inf. Technol. Res.
Fude Cao, ChunGuang Zheng, Limin Huang, Aihua Wang, Jiong Zhang, Feng Zhou, Haoxue Ju, Haitao Guo, Yuxia Du
2021 J jnl
CoRR
Lei Ding, Haitao Guo, Sicong Liu, Lichao Mou, Jing Zhang, Lorenzo Bruzzone
2020 J jnl
IEEE Geosci. Remote. Sens. Lett.
Chuan Zhao, Haitao Guo, Jun Lu, Donghang Yu, Daoji Li, Xiaowei Chen
2020 J jnl
Sensors
Donghang Yu, Qing Xu, Haitao Guo, Chuan Zhao, Yuzhun Lin, Daoji Li
2020 J jnl
Enterp. Inf. Syst.
Yunsick Sung, Haitao Guo, Jong Hyuk Park
2020 J jnl
IEEE J. Sel. Top. Appl. Earth Obs. Remote. Sens.
Donghang Yu, Haitao Guo, Qing Xu, Jun Lu, Chuan Zhao, Yuzhun Lin
2020 J jnl
Sensors
Haitao Guo, Yunsick Sung
2019 conf
iThings/GreenCom/CPSCom/SmartData
Haitao Guo, Yunsick Sung, Jungho Kang
2018 conf
ADHIP
Jinbao Shan, Haitao Guo
2018 J jnl
Soft Comput.
Yunsick Sung, Haitao Guo, Sang-Geol Lee
2017 J jnl
IEEE Geosci. Remote. Sens. Lett.
Xiaowei Chen, Baoming Zhang, Minyi Cen, Haitao Guo, Tonggang Zhang, Chuan Zhao
2016 C conf
IGARSS
Jintao Yu, Haitao Guo, Chuanguang Li, Jun Lu
2016 B conf
ICIP
Songze Tang, Haitao Guo, Nan Zhou, Lili Huang, Tianming Zhan
2016 conf
CCPR (2)
Xiaowei Chen, Haitao Guo, Chuan Zhao, Baoming Zhang, Yuzhun Lin
2014 conf
BIBM
Qiang Yu, Hongwei Huo, Xiaoyang Chen, Haitao Guo, Jeffrey Scott Vitter, Jun Huan
2013 conf
Geoinformatics
Hongwei Zhang, Baoming Zhang, Haitao Guo, Jun Lu, Hong He
2013 conf
GreenCom/iThings/CPScom
Wei Sun, Rongxin Yan, Lichen Sun, Donghui Meng, Zheng Li, Haitao Guo, Wenbin Li
2013 conf
Geoinformatics
Zhiqing Liu, Zhaohui Xu, Baoming Zhang, Haitao Guo, Pengcheng Li
2009 J jnl
Reliab. Eng. Syst. Saf.
Haitao Guo, Simon J. Watson, Peter Tavner, Jiangping Xiang
2008 J jnl
Reliab. Eng. Syst. Saf.
Haitao Guo, Xianhui Yang
2007 J jnl
Reliab. Eng. Syst. Saf.
Haitao Guo, Xianhui Yang
2006 J jnl
IEEE Pervasive Comput.
Anthony D. Joseph, Alastair R. Beresford, Jean Bacon, David Naveen Cottingham, Jonathan J. Davies, Brian D. Jones, Haitao Guo, Wei Guan, Yong Lin, Houbing Song, Liviu Iftode, Simone Fuchs, Bernhard Lamprecht, Kyandoghere Kyamakya, Jorge González Fernández, Juan Carlos Yelmo García, Yod Samuel Martín García, Jorge de Gracia Santos, Milind Nimesh, Gang Pan, Zhaohui Wu, Qing Wu, Zhenyu Shan, Jie Sun, Jian Lu, Guoqing Yang, Muhammad Khurram Khan, Jiashu Zhang
1998 Misc conf
ICASSP
Haitao Guo
1998 J jnl
IEEE Trans. Signal Process.
Haitao Guo, Gary A. Sitton, C. Sidney Burrus
1997 conf
ICIP (3)
Lin Yue, Haitao Guo
1997 conf
ICIP (1)
Haitao Guo, C. Sidney Burrus
1997 Misc conf
ICASSP
Haitao Guo, C. Sidney Burrus
1996 Misc conf
ICASSP
Haitao Guo, C. Sidney Burrus
1996 J jnl
IEEE Signal Process. Lett.
Markus Lang, Haitao Guo, J. E. Odegard, C. Sidney Burrus, Raymond O. Wells Jr.
1995 conf
ICIP (3)
Dong Wei, Jan E. Odegard, Haitao Guo, Markus Lang, C. Sidney Burrus
1994 conf
ICASSP (3)
Haitao Guo, Gary A. Sitton, C. Sidney Burrus
1994 conf
ICIP (1)
Haitao Guo, J. E. Odegard, Markus Lang, Ramesh A. Gopinath, Ivan W. Selesnick, C. Sidney Burrus
1994 conf
ICIP (2)
Ramesh A. Gopinath, Markus Lang, Haitao Guo, J. E. Odegard
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))