Han Yue

37 papers A* 3C 2Journal 27Unranked 5
YearRankTypeTitle / Venue / Authors
2026 J jnl
Trans. Mach. Learn. Res.
Ziao Yang, Han Yue, Jian Chen, Hongfu Liu
2025 J jnl
IEEE Trans. Computational Imaging
Han Yue, Jun Cheng, Yuxuan Ren, Chien-Chun Chen, Grant A. van Riessen, Philip Heng Wai Leong, Feng Shu
2024 J jnl
IEEE Trans. Neural Networks Learn. Syst.
Han Yue, Pengyu Hong, Hongfu Liu
2024 J jnl
Int. J. Appl. Earth Obs. Geoinformation
Han Yue, Hangbin Wu, Ville V. Lehtola, Junyi Wei, Chun Liu
2024 J jnl
CoRR
Ziao Yang, Han Yue, Jian Chen, Hongfu Liu
2024 A* conf
EMNLP
Yuqing Zhang, Baoyi He, Yihan Chen, Hangqi Li, Han Yue, Shengyu Zhang, Huaiyong Dou, Junchi Yan, Zemin Liu, Yongquan Zhang, Fei Wu
2024 J jnl
CoRR
Han Yue, Jun Cheng, Yuxuan Ren, Philip Heng Wai Leong, Steve Feng Shu
2024 J jnl
IEEE Trans. Geosci. Remote. Sens.
Han Yue, Ville V. Lehtola, Hangbin Wu, George Vosselman, Jincheng Li, Chun Liu
2024 J jnl
CoRR
Ziao Yang, Han Yue, Jian Chen, Hongfu Liu
2024 J jnl
Syst.
Han Yue, Min Huang
2023 conf
ICMLCA
Xu Yang, Chunyu Liu, Jiapeng Liu, Han Yue
2023 J jnl
Int. J. Appl. Earth Obs. Geoinformation
Shida Wang, Hangbin Wu, Han Yue, Lianbi Yao, Chun Liu, Haili Sun
2023 J jnl
Int. J. Digit. Earth
Junyi Wei, Hangbin Wu, Han Yue, Shoujun Jia, Jintao Li, Chun Liu
2023 C conf
CSCWD
Han Yue, Rucen Wang, Yi Gao, Ailing Xia, Jianhua Zhang
2023 J jnl
Int. J. Appl. Earth Obs. Geoinformation
Shufan Wang, Chun Liu, Weiyue Li, Shoujun Jia, Han Yue
2023 J jnl
IEEE Trans. Pattern Anal. Mach. Intell.
Han Yue, Jundong Li, Hongfu Liu
2023 J jnl
IEEE Geosci. Remote. Sens. Lett.
Jintao Li, Hangbin Wu, Xinjiang Ma, Yanyi Li, Han Yue, Chun Liu
2022 J jnl
IEEE Trans. Games
Han Yue, Hongfu Liu, Jian Chen
2022 J jnl
Syst.
Han Yue, Jiapeng Liu, Qin Zhang
2022 J jnl
IEEE Trans. Geosci. Remote. Sens.
Chun Liu, Doudou Zeng, Akram Akbar, Hangbin Wu, Shoujun Jia, Zeran Xu, Han Yue
2022 J jnl
ISPRS Int. J. Geo Inf.
Han Yue, Huafang Xie, Lin Liu, Jianguo Chen
2022 A* conf
NeurIPS
Han Yue, Chunhui Zhang, Chuxu Zhang, Hongfu Liu
2022 J jnl
CoRR
Han Yue, Chunhui Zhang, Chuxu Zhang, Hongfu Liu
2022 A* conf
KDD
Han Yue, Steve Q. Xia, Hongfu Liu
2022 J jnl
CoRR
Han Yue, Steve Q. Xia, Hongfu Liu
2021 J jnl
Int. J. Appl. Earth Obs. Geoinformation
Hangbin Wu, Zeran Xu, Chun Liu, Akram Akbar, Han Yue, Doudou Zeng, Huimin Yang
2021 J jnl
IEEE Access
Yang Liu, Yong Zhang, Yang Zhao, Han Yue, Dan Gao, Heng Zhang, Haiping Chen
2021 conf
WWW (Companion Volume)
Ethan Xia, Han Yue, Hongfu Liu
2020 J jnl
IEEE Access
Tao Hu, Bing She, Lian Duan, Han Yue, Julaine Clunis
2020 J jnl
IEEE Access
Qiwei Xu, Runzi Lin, Han Yue, Hong Huang, Yun Yang, Zhigang Yao
2019 J jnl
IEEE Access
Lei Wu, Han Yue, Peng Chen, De-An Wu, Qiu Jin
2019 J jnl
Trans. GIS
A. Stewart Fotheringham, Han Yue, Ziqi Li
2018 conf
Geoinformatics
Han Yue, Hangbin Wu
2017 conf
Geoinformatics
Han Yue, Xinyan Zhu, Wei Guo
2017 J jnl
ISPRS Int. J. Geo Inf.
Han Yue, Xinyan Zhu, Xinyue Ye, Wei Guo
2015 conf
Geoinformatics
Di Chen, Xinyan Zhu, Han Yue, Shuming Bao
2015 C conf
APSEC
Han Yue, Peng Wu, Tsong Yueh Chen, Yi Lv
redb/extractors/decompiler/_archive/DecompileGhidra-old.py
← Index redb/extractors/decompiler/_archive/DecompileGhidra-old.py python
from hashlib import sha256
import inspect
from pathlib import Path
import subprocess
import json
import subprocess
import json
import os
import tempfile
import uuid
import shutil
import time

from dotenv import load_dotenv

from redb.extractors.enum import Tag
from redb.models.dataclasses import Decompiled
from redb.extractors.extractor import Extractor


class DecompileGhidra(Extractor):
    def __init__(
        self,
        filepath,
        log,
        index_prefix=None,
        elastic_index=None,
        known_benign=False,
        known_malicious=False,
    ):
        super().__init__(
            filepath, log, index_prefix, elastic_index, known_benign, known_malicious
        )
        self.log.debug(inspect.currentframe().f_code.co_name)
        self.elastic_index = self.index_prefix + "-ghidra"
        self.ghidra_path = "/opt/ghidra"
        self.java_script_path = (
            self.ghidra_path
            + "/Ghidra/Features/Base/ghidra_scripts/GhidraDecompilerScript.java"
        )
        self.decompiled = None
        load_dotenv()
        self.decompiled_folder = os.getenv("DECOMPILED_FOLDER", "/opt/decompiled")
        self.log.debug(f"Decompiled folder: {self.decompiled_folder}")

    def run_command(self, cmd, env=None):
        try:
            self.log.info(f"Starting command: {' '.join(cmd)}")
            start_time = time.time()
            TIMEOUT = 1200  # 20 minutes in seconds
            process = subprocess.Popen(
                cmd, env=env, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True
            )

            while True:
                output = process.stdout.readline()
                if output:
                    print(output.strip())
                if process.poll() is not None:
                    break
            try:
                stdout, stderr = process.communicate(timeout=TIMEOUT)
            except subprocess.TimeoutExpired:
                process.kill()
                self.log.error(f"Ghidra timed out after {TIMEOUT} seconds")
                # raise subprocess.TimeoutExpired(process.args, TIMEOUT)
                return None
            end_time = time.time()

            self.log.debug(
                f"Command finished. Execution time: {end_time - start_time:.2f} seconds"
            )
            self.log.debug(f"Return code: {process.returncode}")

            if process.returncode != 0:
                self.log.error(f"Error output:\n{stderr}")
                return None
            return stdout
        except Exception as e:
            self.log.error(f"Error running command {' '.join(cmd)}: {e}")
            return None

    def analyze_binary(self):
        self.log.debug(f"Ghidra path: {self.ghidra_path}")
        self.log.debug(f"Binary path: {self.filepath}")
        self.log.debug(f"Java script path: {self.java_script_path}")

        # Check if Java script exists
        if not os.path.exists(self.java_script_path):
            self.log.error(f"Error: Java script not found at {self.java_script_path}")
            return None

        # Set up environment variables
        env = os.environ.copy()
        java_home = "/usr/lib/jvm/java-17-openjdk-amd64"  # Adjust this path if needed
        env["JAVA_HOME"] = java_home
        env["PATH"] = f"{java_home}/bin:{env['PATH']}"
        env["LD_LIBRARY_PATH"] = f"{java_home}/lib:{env.get('LD_LIBRARY_PATH', '')}"
        env["DECOMPILED_FOLDER"] = self.decompiled_folder

        # Print environment variables for debugging
        self.log.debug(f"JAVA_HOME: {env['JAVA_HOME']}")
        self.log.debug(f"PATH: {env['PATH']}")
        self.log.debug(f"LD_LIBRARY_PATH: {env['LD_LIBRARY_PATH']}")

        # Check Ghidra installation
        analyzeHeadless_path = f"{self.ghidra_path}/support/analyzeHeadless"
        self.log.debug(
            f"analyzeHeadless exists: {os.path.exists(analyzeHeadless_path)}"
        )

        # Create a temporary project directory
        project_path = tempfile.gettempdir() + "/ghidra_" + str(uuid.uuid4())
        os.makedirs(project_path, exist_ok=True)
        self.log.debug(f"Created temporary project path: {project_path}")
        output_file = ""

        try:
            # Run Ghidra's headless analyzer
            analyze_cmd = [
                analyzeHeadless_path,
                project_path,
                "TempProject",
                "-import",
                self.filepath,
                "-postScript",
                self.java_script_path,
                self.sha256,
                "-deleteProject",
            ]

            result = self.run_command(analyze_cmd, env=env)
            if result is None:
                return None

            # Read the output JSON file
            output_file = os.path.join(
                self.decompiled_folder, self.sha256 + "-decompiled.json"
            )
            if os.path.exists(output_file):
                with open(output_file, "r") as f:
                    functions = json.load(f)
                return functions
            else:
                self.log.error(
                    f"Output file {output_file} not found. Ghidra analysis may have failed."
                )
                return None
        finally:
            # Clean up
            if os.path.exists(project_path):
                shutil.rmtree(project_path)
                self.log.debug(f"Deleted temporary project path: {project_path}")

    def extract(self):
        self.log.debug(inspect.currentframe().f_code.co_name)
        try:
            functions = self.analyze_binary()

            if functions:
                self.log.info(f"Extracted functions from {self.filepath}:")
                for func in functions:
                    id = sha256(func["address"].encode()).hexdigest()
                    self.decompiled = Decompiled(
                        _id=id,
                        decompiled_function_name=func["name"],
                        decompiled_function_address=func["address"],
                        decompiled_function=func["decompiled"],
                    )
                    self.export_to_elastic([self.decompiled])
            else:
                self.log.error("No decompiled functions extracted.")
            return True
        except Exception as e:
            self.log.error(f"Error extracting decompiled information: {e}")
            return None

    def tag(self):
        return Tag.DECOMPILED.value