Haitao Yang

24 papers A 1B 3C 4Misc 3Journal 12Unranked 1
YearRankTypeTitle / Venue / Authors
2024 J jnl
IEEE Trans. Circuits Syst. Video Technol.
Huiwen Ren, Zetian Song, Liang Wei, Danni Wang, Yi Luo, Dongping Pan, Yucheng Sun, Haitao Yang, Fangdong Chen, Shanshe Wang, Siwei Ma, Wen Gao
2022 C conf
PCS
Chen Wang, Xin Jin, Huanbang Chen, Haitao Yang, Kedeng Tong, Yuqing Yang
2021 J jnl
IEEE Trans. Circuits Syst. Video Technol.
Haitao Yang, Huanbang Chen, Jianle Chen, Semih Esenlik, Sriram Sethuraman, Xiaoyu Xiu, Elena Alshina, Jiancong Luo
2020 J jnl
IEEE Trans. Image Process.
Xinfeng Zhang, Chao Yang, Xiaoguang Li, Shan Liu, Haitao Yang, Ioannis Katsavounidis, Shawmin Lei, C.-C. Jay Kuo
2020 J jnl
IEEE Trans. Circuits Syst. Video Technol.
Kiho Choi, Jianle Chen, Min Woo Park, Haitao Yang, Woongil Choi, Sergey Ikonin, Yinji Piao, Semih Esenlik, Minsoo Park, Ye-Kui Wang, Narae Choi, Yin Zhao, Seungsoo Jeong, H. Chen, Anish Tamse, Alexey Filippov, Heechul Yang, Xiang Ma, Junghye Min, Roman Chernyak, Bora Jin, Anand Meher Kotra, Sunil Lee, Han Gao, Chanyul Kim, Timofey Solovyev, Kwang Pyo Choi, Vasily Rufitskiy, Maxim Sychev, Weiwei Xu, Tian Wang, Jeonghoon Park
2019 J jnl
IEEE Trans. Image Process.
Li Li, Zhu Li, Xiang Ma, Haitao Yang, Houqiang Li
2019 J jnl
IEEE Trans. Circuits Syst. Video Technol.
Jianping Lin, Dong Liu, Haitao Yang, Houqiang Li, Feng Wu
2019 B conf
DCC
Kiho Choi, Jianle Chen, Anish Tamse, Haitao Yang, Min Woo Park, Sergey Ikonin, Woongil Choi, Semih Esenlik
2018 J jnl
IEEE Trans. Circuits Syst. Video Technol.
Li Li, Houqiang Li, Dong Liu, Zhu Li, Haitao Yang, Sixin Lin, Huanbang Chen, Feng Wu
2018 J jnl
IEEE Trans. Circuits Syst. Video Technol.
Yue Li, Dong Liu, Houqiang Li, Li Li, Feng Wu, Hong Zhang, Haitao Yang
2017 J jnl
CoRR
Li Li, Houqiang Li, Dong Liu, Haitao Yang, Sixin Lin, Huanbang Chen, Feng Wu
2017 A conf
ICME
Li Li, Zhu Li, Xiang Ma, Haitao Yang, Houqiang Li
2017 J jnl
CoRR
Li Li, Zhu Li, Xiang Ma, Haitao Yang, Houqiang Li
2017 conf
EUSIPCO
Itsik Dvir, Amiram Allouche, David Drezner, Ady Ecker, Dror Irony, Natan Peterfreund, Haitao Yang, Jiantong Zhou
2016 J jnl
IEEE Trans. Circuits Syst. Video Technol.
Amin Zheng, Yuan Yuan, Jiantao Zhou, Yuanfang Guo, Haitao Yang, Oscar C. Au
2015 C conf
ISCAS
Li Li, Houqiang Li, Zhuoyi Lv, Haitao Yang
2015 C conf
VCIP
Fangdong Chen, Li Li, Dong Liu, Houqiang Li, Zhuoyi Lv, Haitao Yang
2015 Misc conf
ICASSP
Yuan Yuan, Amin Zheng, Haitao Yang, Oscar C. Au
2015 B conf
ICIP
Amin Zheng, Yuan Yuan, Hong Zhang, Haitao Yang, Pengfei Wan, Oscar C. Au
2014 Misc conf
ICASSP
Yuan Yuan, Oscar C. Au, Amin Zheng, Haitao Yang, Ketan Tang, Wenxiu Sun
2014 B conf
ICIP
Amin Zheng, Oscar C. Au, Yuan Yuan, Haitao Yang, Jiahao Pang, Yonggen Ling
2014 Misc conf
ICASSP
Wenjing Zhu, Oscar C. Au, Wei Dai, Haitao Yang, Rui Ma, Luheng Jia, Jin Zeng, Pengfei Wan
2011 C conf
VCIP
Hongtao Wang, Meng Liu, Qian Li, Haitao Yang, Houqiang Li
2009 J jnl
IEEE Trans. Circuits Syst. Video Technol.
Haitao Yang, Yilin Chang, Junyan Huo
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