Cathy W. S. Chen

33 papers Journal 29Unranked 1
YearRankTypeTitle / Venue / Authors
2024 J jnl
Entropy
Feng-Chi Liu, Cathy W. S. Chen, Cheng-Ying Ho
2024 J jnl
Comput. Stat.
Cathy W. S. Chen, Rosaria Lombardo, Enrico Ripamonti
2023 J jnl
Comput. Stat. Data Anal.
Cathy W. S. Chen, Chun-Shu Chen, Mo-Hua Hsiung
2023 J jnl
Comput. Stat. Data Anal.
Kai Y. K. Wang, Cathy W. S. Chen, Mike K. P. So
2021 J jnl
Comput. Stat.
Cathy W. S. Chen, Sangyeol Lee, Khemmanant Khamthong
2021 J jnl
Entropy
Cathy W. S. Chen, L. M. Chiu
2019 ch.
Structural Changes and their Econometric Modeling
Hong Than-Thi, Manh Cuong Dong, Cathy W. S. Chen
2018 ch.
Predictive Econometrics and Big Data
Cathy W. S. Chen, Yu-Wen Sun
2017 ch.
Robustness in Econometrics
Cathy W. S. Chen, Khemmanant Khamthong, Sangyeol Lee
2016 J jnl
Comput. Stat. Data Anal.
Cathy W. S. Chen, Sangyeol Lee
2016 J jnl
Comput. Stat.
Cathy W. S. Chen, Sangyeol Lee, Shu-Yu Chen
2014 J jnl
Comput. Stat. Data Anal.
Cathy W. S. Chen, Richard Gerlach, Edward M. H. Lin
2014 J jnl
Comput. Stat. Data Anal.
Erricos John Kontoghiorghes, Herman K. van Dijk, David A. Belsley, Tim Bollerslev, Francis X. Diebold, Jean-Marie Dufour, Robert F. Engle, Andrew Harvey, Siem Jan Koopman, Hashem Pesaran, Peter C. B. Phillips, Richard J. Smith, Mike West, Qiwei Yao, Alessandra Amendola, Monica Billio, Cathy W. S. Chen, Carl Chiarella, Ana Colubi, Manfred Deistler, Christian Francq, Marc Hallin, Eric Jacquier, Kenneth Judd, Gary Koop, Helmut Lütkepohl, James G. MacKinnon, Stefan Mittnik, Yasuhiro Omori, D. S. G. Pollock, Tommaso Proietti, Jeroen V. K. Rombouts, Olivier Scaillet, Willi Semmler, Mike K. P. So, Mark F. J. Steel, Robert Taylor, Elias Tzavalis, Jean-Michel Zakoian, H. Peter Boswijk, Alessandra Luati, John M. Maheu
2014 conf
TES
Cathy W. S. Chen, Max Chen, Shu-Yu Chen
2014 J jnl
Comput. Stat. Data Anal.
Cathy W. S. Chen, David B. Dunson, Sylvia Frühwirth-Schnatter, Stephen G. Walker
2013 J jnl
Comput. Stat.
Cathy W. S. Chen, Richard Gerlach
2013 J jnl
Comput. Stat.
Cathy W. S. Chen, Feng-Chi Liu, Mike K. P. So
2012 J jnl
Comput. Stat. Data Anal.
Jennifer So-Kuen Chan, Connie P. Y. Lam, Philip L. H. Yu, S. T. Boris Choy, Cathy W. S. Chen
2012 J jnl
Adv. Decis. Sci.
Masanobu Taniguchi, Cathy W. S. Chen, Junichi Hirukawa, Hiroshi Shiraishi, Kenichiro Tamaki, David Veredas
2012 J jnl
Comput. Stat. Data Anal.
David A. Belsley, Erricos John Kontoghiorghes, Herman K. van Dijk, Luc Bauwens, Siem Jan Koopman, Michael McAleer, Alessandra Amendola, Monica Billio, Christophe Croux, Cathy W. S. Chen, Russell Davidson, Pierre Duchesne, Paolo Foschi, Christian Francq, Ana-María Fuertes, Gary Koop, Lynda Khalaf, Marc S. Paolella, D. S. G. Pollock, Esther Ruiz, Richard Paap, Tommaso Proietti, Peter Winker, Philip L. H. Yu, Jean-Michel Zakoian, Achim Zeileis
2012 J jnl
Comput. Stat. Data Anal.
David A. Belsley, Cathy W. S. Chen, Christian Francq, Giampiero M. Gallo, Lynda Khalaf, Erricos John Kontoghiorghes, Herman K. van Dijk
2011 J jnl
Stat. Comput.
Cathy W. S. Chen, Jennifer So-Kuen Chan, Richard Gerlach, William Y. L. Hsieh
2011 J jnl
Comput. Stat.
Cathy W. S. Chen, Feng-Chi Liu, Richard Gerlach
2011 J jnl
Comput. Stat. Data Anal.
Cathy W. S. Chen, Jennifer So-Kuen Chan, Mike K. P. So, Kevin K. M. Lee
2009 J jnl
Comput. Stat. Data Anal.
Cathy W. S. Chen, Richard Gerlach, D. C. M. Wei
2009 J jnl
Math. Comput. Simul.
YiHao Lai, Cathy W. S. Chen, Richard Gerlach
2009 J jnl
Math. Comput. Simul.
Cathy W. S. Chen, Richard Gerlach, Nick Y. P. Cheng, Y. L. Yang
2008 J jnl
Math. Comput. Simul.
Mike K. P. So, Cathy W. S. Chen, Jen-Yu Lee, Yi-Ping Chang
2008 J jnl
Stat. Comput.
Richard Gerlach, Cathy W. S. Chen
2008 J jnl
Math. Comput. Simul.
Cathy W. S. Chen, Richard Gerlach, Amanda P. J. Tai
2008 J jnl
Comput. Stat. Data Anal.
Cathy W. S. Chen, Richard Gerlach, Edward M. H. Lin
2006 J jnl
Comput. Stat. Data Anal.
Cathy W. S. Chen, Richard Gerlach, Mike K. P. So
2001 J jnl
Comput. Stat.
Cathy W. S. Chen, Tsai-Hung Cherng, Berlin Wu
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