Xiaodan Liu

22 papers Journal 16Unranked 6
YearRankTypeTitle / Venue / Authors
2025 J jnl
J. Chem. Inf. Model.
Ying Cao, Yuchen Zhou, Xiaodan Liu, Dazhou Li
2025 J jnl
CoRR
Mingyu Cao, Huajie Tan, Yuheng Ji, Minglan Lin, Zhiyu Li, Zhou Cao, Pengwei Wang, Enshen Zhou, Yi Han, Yingbo Tang, Xiangqi Xu, Wei Guo, Yaoxu Lyu, Yijie Xu, Jiayu Shi, Mengfei Du, Cheng Chi, Mengdi Zhao, Xiaoshuai Hao, Junkai Zhao, Xiaojie Zhang, Shanyu Rong, Huaihai Lyu, Zhengliang Cai, Yankai Fu, Ning Chen, Bolun Zhang, Lingfeng Zhang, Shuyi Zhang, Dong Liu, Xi Feng, Songjing Wang, Xiaodan Liu, Yance Jiao, Mengsi Lyu, Zhuo Chen, Chenrui He, Yulong Ao, Xue Sun, Zheqi He, Jingshu Zheng, Xi Yang, Donghai Shi, Kunchang Xie, Bochao Zhang, Shaokai Nie, Chunlei Men, Yonghua Lin, Zhongyuan Wang, Tiejun Huang, Shanghang Zhang
2025 J jnl
Behav. Inf. Technol.
Xuequn Wang, Jinghan Wang, Xiaodan Liu, Zilong Liu
2024 J jnl
Remote. Sens.
Huiqiang Xu, Shengcheng Cui, Zhi Qiao, Xiaodan Liu, Shizhi Yang, Heli Wei
2024 J jnl
Comput. Electron. Agric.
Jiahua Wang, Yuqing Lin, Qiaocong Li, Zelin Lu, Jiangjin Qian, Huang Dai, Fuwei Pi, Xiaodan Liu, Yong He
2024 J jnl
Int. J. Hum. Comput. Interact.
Wen Liu, Nalanying Pulie, Liting Tan, Xiaodan Liu, Xue Zhang
2023 J jnl
Sensors
Yonghui Yu, Chanchan Jia, Jiahua Wang, Fuwei Pi, Huang Dai, Xiaodan Liu
2023 conf
CRC
Xiaodan Liu, Yang Li, Jing Liao, Yuanfu Tang, Binkun Xu, Sheng Xiang, Wei Meng, Ke Meng
2023 conf
CRC
Xiaodan Liu, Yuanfu Tang, Yang Li, Jing Liao, Binkun Xu, Sheng Xiang, Yuqing Liu, Ke Meng
2022 J jnl
IEEE J. Sel. Top. Appl. Earth Obs. Remote. Sens.
Xiangfeng Liu, Xiaodan Liu, Zhenhua Wang, Genghua Huang, Rong Shu
2022 J jnl
Remote. Sens.
Xiaodan Liu, Li Wang, Xueru Bai
2021 conf
ICEIT
Lei Liu, Xiaodan Liu, Fei Xu
2020 J jnl
Inf. Manag.
Xiaodan Liu, Qingfei Min, Dezhi Wu, Zilong Liu
2020 J jnl
Behav. Inf. Technol.
Xiaodan Liu, Qingfei Min, Shengnan Han
2019 J jnl
J. Intell. Fuzzy Syst.
Xiaodan Liu, Chunliang Li
2019 J jnl
Int. J. Inf. Syst. Chang. Manag.
Xiaodan Liu, Chunhui Yuan, Muhammad Hafeez
2019 J jnl
Int. J. Inf. Syst. Chang. Manag.
Xiaodan Liu, Chunhui Yuan, Muhammad Hafeez
2018 J jnl
Sensors
Jiyu Peng, Fei Liu, Tingting Shen, Lanhan Ye, Wenwen Kong, Wei Wang, Xiaodan Liu, Yong He
2018 J jnl
Sensors
Yong He, Xiaodan Liu, Yangyang Lv, Fei Liu, Jiyu Peng, Tingting Shen, Yun Zhao, Yu Tang, Shaoming Luo
2017 conf
PAAP
Zhenpeng Liu, Xiaodan Liu, Yawei Dong, Xuan Zhao, Bin Zhang
2010 conf
MVHI
Xiaodan Liu, Ruoxing Luan, Cuicui Huang
2008 conf
TRECVID
Zan Gao, Zhi-Cheng Zhao, Tao Liu, Xiaoming Nan, Mei Mei, Bin Zhang, Xiaodan Liu, Xu Peng, Hui Zheng, Yanyun Zhao, Anni Cai
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