Wei-Tsong Wang

54 papers Journal 43Unranked 11
YearRankTypeTitle / Venue / Authors
2025 J jnl
J. Comput. Assist. Learn.
Ying-Lien Lin, Wei-Tsong Wang, Shih-Ying Kuang
2025 J jnl
Educ. Inf. Technol.
Ying-Lien Lin, Wei-Tsong Wang, Zhi-Lun Lai
2025 conf
ICITL (1)
Yen-Wei Huang, Wei-Tsong Wang
2025 J jnl
J. Comput. Assist. Learn.
Ying-Lien Lin, Hann-Jang Huang, Wei-Tsong Wang
2025 J jnl
Educ. Inf. Technol.
Ying-Lien Lin, Wei-Tsong Wang, Chih-Chen Kuo, Pi-Hsin Chen
2024 J jnl
Int. J. Hum. Comput. Interact.
Ming Yuan Ding, Wei-Tsong Wang
2024 J jnl
Inf. Technol. People
Aditya Nugroho, Wei-Tsong Wang
2024 J jnl
Int. J. Hum. Comput. Interact.
Afifah Nurrosyidah, Wei-Tsong Wang
2024 J jnl
Int. J. Hum. Comput. Interact.
Shin-Horng Chen, Wei-Tsong Wang, Yi-Jen Wang
2024 J jnl
Educ. Inf. Technol.
Ying-Lien Lin, Wei-Tsong Wang
2024 J jnl
Behav. Inf. Technol.
Wei-Tsong Wang, Ling-Jiun Chen
2024 J jnl
Educ. Inf. Technol.
Ying-Lien Lin, Wei-Tsong Wang, Min-Ju Hsieh
2024 J jnl
Comput. Hum. Behav.
Xiaoqian Zhuo, Wei-Tsong Wang
2023 J jnl
J. Comput. Assist. Learn.
Ying-Lien Lin, Wei-Tsong Wang
2023 conf
ICITL
Ming Yuan Ding, Wei-Tsong Wang
2023 J jnl
Comput. Hum. Behav.
Aditya Nugroho, Wei-Tsong Wang
2023 J jnl
Educ. Inf. Technol.
Wei-Tsong Wang, Ying-Lien Lin, Hsin-En Lu
2023 J jnl
Decis. Support Syst.
Wei-Tsong Wang, Ying-Lien Lin, Ting-Jun Chen
2023 J jnl
Educ. Inf. Technol.
Yi-Chun Liu, Wei-Tsong Wang, Wen-Hsin Huang
2022 J jnl
Kybernetes
Su-Ying Wu, Wei-Tsong Wang, Yu-Han Hsieh
2022 J jnl
Kybernetes
Wei-Tsong Wang, Ying-Lien Lin
2022 J jnl
Inf. Syst. Manag.
Wei-Tsong Wang, Mei-Chun Luo, Yu-Ming Chang
2022 J jnl
Inf. Technol. People
Ying-Lien Lin, Wei-Tsong Wang
2021 J jnl
J. Organ. End User Comput.
Wei-Tsong Wang, Wei-Ming Ou, Wei-Chi Chiu
2021 conf
ICITL
Wei-Tsong Wang, Mega Kartika Sari
2019 J jnl
Inf. Resour. Manag. J.
Wei-Tsong Wang, Hui-Hsiang Hung
2019 conf
ICITL
Hann-Jang Hwang, Wei-Tsong Wang, Ying-Lien Lin
2019 J jnl
J. Knowl. Manag.
Wei-Tsong Wang, Yi-Shun Wang, Wan-Ting Chang
2019 J jnl
Int. J. Inf. Manag.
Wei-Tsong Wang, Wei-Ming Ou, Wen-Yin Chen
2017 conf
PACIS
Li-Hui Yu, Wei-Tsong Wang
2016 conf
HCI (11)
Wei-Tsong Wang, Wen-Yin Chen
2016 J jnl
Decis. Sci.
Wei-Tsong Wang
2016 conf
PACIS
Wei-Tsong Wang, Chia-Feng Chang
2016 J jnl
Inf. Manag.
Wei-Tsong Wang, Yi-Shun Wang, En-Ru Liu
2015 conf
PACIS
Wei-Tsong Wang, Wan-Ting Chang
2015 J jnl
J. Organ. Comput. Electron. Commer.
Mei-Ju Lin, Wei-Tsong Wang
2015 J jnl
J. Organ. End User Comput.
Mei-Ju Lin, Wei-Tsong Wang
2015 J jnl
Inf. Organ.
Wei-Tsong Wang, Ya-Pei Hou
2014 J jnl
Inf. Syst. Frontiers
Wei-Tsong Wang, Wen-Hung Chang
2014 J jnl
J. Organ. Comput. Electron. Commer.
Wei-Tsong Wang, Chia-Cheng Lu
2014 conf
PACIS
Wei-Tsong Wang, Bin Wang, Yu-Ting Wei
2014 J jnl
Comput. Hum. Behav.
Wei-Tsong Wang, Yi-Ju Lai
2014 J jnl
Decis. Support Syst.
Wei-Tsong Wang, Chiao-Pi Hsiao
2013 J jnl
Int. J. Hum. Comput. Interact.
Wei-Tsong Wang, Shih-Yu Cheng, Lin-Yo Huang
2013 conf
HICSS
Wei-Tsong Wang, Wen-Hung Chang
2012 J jnl
Internet Res.
Wei-Tsong Wang, Hui-Min Li
2012 J jnl
J. Inf. Sci.
Wei-Tsong Wang, Nai-Yuan Ko
2011 J jnl
J. Educ. Technol. Soc.
Hae-Deok Song, Wei-Tsong Wang, Chao-Yueh Liu
2011 J jnl
Online Inf. Rev.
Wei-Tsong Wang, Zu-Hao Wei
2010 J jnl
Expert Syst. Appl.
Wei-Tsong Wang, Yu-Cheng Lu
2009 J jnl
Comput. Educ.
Wei-Tsong Wang, Chun-Chieh Wang
2009 J jnl
Ind. Manag. Data Syst.
Wei-Tsong Wang
2009 J jnl
J. Inf. Sci.
Wei-Tsong Wang, Salvatore Belardo
2005 conf
HICSS
Wei-Tsong Wang, Salvatore Belardo
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