Jan C. Olivier

66 papers B 8C 15Misc 2Journal 36Unranked 5
YearRankTypeTitle / Venue / Authors
2023 J jnl
IET Signal Process.
Jan C. Olivier, Etienne Barnard
2020 J jnl
Adv. Eng. Softw.
Mohsen Mousavi, Damien S. Holloway, Jan C. Olivier, Amir H. Gandomi
2019 J jnl
IEEE J. Sel. Top. Appl. Earth Obs. Remote. Sens.
Willem C. Olding, Jan C. Olivier, Brian P. Salmon, Waldo Kleynhans
2019 J jnl
Trans. Emerg. Telecommun. Technol.
Mohammed Taha O. El Astal, Amr Ismail, Mohamed-Slim Alouini, Jan C. Olivier
2019 J jnl
CoRR
Alex R. Rigby, Jan C. Olivier, Peter Jarvis
2018 J jnl
Int. J. Appl. Earth Obs. Geoinformation
Brian P. Salmon, Waldo Kleynhans, Jan C. Olivier, Frans van den Bergh, Konrad J. Wessels
2018 J jnl
EURASIP J. Wirel. Commun. Netw.
Alex R. Rigby, Jan C. Olivier, Hermanus Carel Myburgh, Chengshan Xiao, Brian P. Salmon
2016 C conf
IGARSS
Brian P. Salmon, Waldo Kleynhans, Jan C. Olivier, Colin P. Schwegmann
2016 J jnl
Biomed. Signal Process. Control.
Omid Sadeghi Fathabadi, Timothy J. Gale, Jan C. Olivier, Peter A. Dargaville
2016 C conf
IGARSS
Brian Paxton Salmon, Waldo Kleynhans, Jan C. Olivier, Colin P. Schwegmann
2015 C conf
IGARSS
Willem C. Olding, Jan C. Olivier, Brian P. Salmon
2015 C conf
IGARSS
Brian P. Salmon, Waldo Kleynhans, Jan C. Olivier, Colin P. Schwegmann, Willem C. Olding
2015 J jnl
EURASIP J. Wirel. Commun. Netw.
Mohammed Taha O. El Astal, Ammar M. Abu-Hudrouss, Brian P. Salmon, Jan C. Olivier
2015 J jnl
Int. J. Appl. Earth Obs. Geoinformation
Waldo Kleynhans, Brian P. Salmon, Jan C. Olivier
2015 Misc conf
ICASSP
Jack F. Adolph, Jan C. Olivier, Brian P. Salmon
2015 J jnl
Wirel. Pers. Commun.
M.-T. O. El Astal, Ammar M. Abu-Hudrouss, Jan C. Olivier
2015 C conf
IGARSS
Brian P. Salmon, Waldo Kleynhans, Colin P. Schwegmann, Jan C. Olivier
2014 C conf
IGARSS
Brian P. Salmon, Waldo Kleynhans, Jan C. Olivier, Willem C. Olding, Konrad J. Wessels, Frans van den Bergh
2014 B conf
WCNC
M.-T. O. El Astal, Brian P. Salmon, Jan C. Olivier
2014 B conf
WCNC
M.-T. O. El Astal, Brian P. Salmon, Jan C. Olivier
2014 J jnl
IEEE Trans. Geosci. Remote. Sens.
Brian P. Salmon, Waldo Kleynhans, Frans van den Bergh, Jan C. Olivier, Willem J. Marais, Trienko L. Grobler, Konrad J. Wessels
2014 C conf
IGARSS
Brian P. Salmon, Jan C. Olivier, Waldo Kleynhans, Konrad J. Wessels
2013 J jnl
EURASIP J. Adv. Signal Process.
Hermanus Carel Myburgh, Jan C. Olivier
2013 J jnl
EURASIP J. Adv. Signal Process.
Hermanus Carel Myburgh, Jan C. Olivier
2013 J jnl
IEEE Geosci. Remote. Sens. Lett.
Trienko L. Grobler, Etienne R. Ackermann, Augustinus J. van Zyl, Jan C. Olivier, Waldo Kleynhans, Brian P. Salmon
2013 B conf
PIMRC
M.-T. O. El Astal, Jan C. Olivier
2013 J jnl
IEEE J. Sel. Top. Appl. Earth Obs. Remote. Sens.
Brian Paxton Salmon, Waldo Kleynhans, Frans van den Bergh, Jan C. Olivier, Trienko L. Grobler, Konrad J. Wessels
2013 J jnl
IEEE Geosci. Remote. Sens. Lett.
Trienko L. Grobler, Etienne R. Ackermann, Augustinus J. van Zyl, Jan C. Olivier, Waldo Kleynhans, Brian P. Salmon
2012 C conf
IGARSS
Brian P. Salmon, Waldo Kleynhans, Frans van den Bergh, Jan C. Olivier, Willem J. Marais, Trienko L. Grobler, Konrad J. Wessels
2012 J jnl
IET Commun.
Jacobus D. Vlok, Jan C. Olivier
2012 C conf
IGARSS
Brian P. Salmon, Waldo Kleynhans, Frans van den Bergh, Jan C. Olivier, Konrad J. Wessels
2012 C conf
IGARSS
Waldo Kleynhans, Brian P. Salmon, Jan C. Olivier, Frans van den Bergh, Konrad J. Wessels, Trienko L. Grobler
2012 J jnl
IEEE J. Sel. Top. Appl. Earth Obs. Remote. Sens.
Waldo Kleynhans, Brian P. Salmon, Jan C. Olivier, Frans van den Bergh, Konrad J. Wessels, Trienko L. Grobler, Karen C. Steenkamp
2012 J jnl
IEEE J. Sel. Top. Appl. Earth Obs. Remote. Sens.
Trienko L. Grobler, Etienne R. Ackermann, Jan C. Olivier, Augustinus J. van Zyl, Waldo Kleynhans
2012 J jnl
IET Commun.
Jacobus D. Vlok, Jan C. Olivier
2012 J jnl
EURASIP J. Adv. Signal Process.
Hermanus Carel Myburgh, Jan C. Olivier, Augustinus J. van Zyl
2012 C conf
IGARSS
Trienko L. Grobler, Etienne R. Ackermann, Augustinus J. van Zyl, Waldo Kleynhans, Brian P. Salmon, Jan C. Olivier
2011 C conf
IGARSS
Waldo Kleynhans, Brian P. Salmon, Jan C. Olivier, Konrad J. Wessels, Frans van den Bergh
2011 C conf
IGARSS
Waldo Kleynhans, Brian P. Salmon, Jan C. Olivier, Konrad J. Wessels, Frans van den Bergh
2011 conf
AFRICON
Etienne R. Ackermann, Trienko L. Grobler, Augustinus J. van Zyl, Jan C. Olivier
2011 J jnl
IEEE Geosci. Remote. Sens. Lett.
Waldo Kleynhans, Jan C. Olivier, Konrad J. Wessels, Brian P. Salmon, Frans van den Bergh, Karen C. Steenkamp
2011 C conf
IGARSS
Brian P. Salmon, Waldo Kleynhans, Frans van den Bergh, Jan C. Olivier, Willem J. Marais, Konrad J. Wessels
2011 conf
AFRICON
Trienko L. Grobler, Etienne R. Ackermann, Jan C. Olivier, Augustinus J. van Zyl
2011 J jnl
IEEE J. Sel. Top. Appl. Earth Obs. Remote. Sens.
Brian P. Salmon, Jan C. Olivier, Konrad J. Wessels, Waldo Kleynhans, Frans van den Bergh, Karen C. Steenkamp
2010 C conf
IGARSS
Brian P. Salmon, Jan C. Olivier, Waldo Kleynhans, Konrad J. Wessels, Frans van den Bergh
2010 J jnl
EURASIP J. Adv. Signal Process.
Hermanus Carel Myburgh, Jan C. Olivier
2009 conf
IGARSS (4)
Brian P. Salmon, Jan C. Olivier, Waldo Kleynhans, Konrad J. Wessels, Frans van den Bergh
2008 conf
IGARSS (4)
Jan C. Olivier, Konrad J. Wessels, Seare Araya
2008 J jnl
IEEE Trans. Wirel. Commun.
Jingxian Wu, Sang-Yick Leong, Kah-Ping Lee, Chengshan Xiao, Jan C. Olivier
2008 B conf
WCNC
Hermanus Carel Myburgh, Jan C. Olivier
2007 B conf
WCNC
Andre M. Mc Donald, Jan C. Olivier
2007 J jnl
Digit. Signal Process.
Jan C. Olivier
2007 B conf
WCNC
Brian P. Salmon, Jan C. Olivier
2007 J jnl
IET Commun.
Jan C. Olivier, Waldo Kleynhans
2006 J jnl
IEEE Trans. Veh. Technol.
Sang-Yick Leong, Jingxian Wu, Chengshan Xiao, Jan C. Olivier
2006 J jnl
IEEE Trans. Educ.
Jan C. Olivier, Waldo Kleynhans, Simeon Miteff
2005 J jnl
Int. J. Wirel. Inf. Networks
Jingxian Wu, Jyhchau Henry Horng, Jinyun Zhang, Chengshan Xiao, Jan C. Olivier
2004 B conf
GLOBECOM
Jingxian Wu, Jyhchau Henry Horng, Jinyun Zhang, Jan C. Olivier, Chengshan Xiao
2004 J jnl
Int. J. Wirel. Inf. Networks
Jingxian Wu, Chengshan Xiao, Jan C. Olivier
2003 J jnl
IEEE Trans. Veh. Technol.
Jan C. Olivier, Sang-Yick Leong, Chengshan Xiao, Karl D. Mann
2003 B conf
GLOBECOM
Sang-Yick Leong, Jingxian Wu, Jan C. Olivier, Chengshan Xiao
2003 conf
ICASSP (4)
Jingxian Wu, Chengshan Xiao, Jan C. Olivier
2002 J jnl
IEEE Trans. Commun.
Jan C. Olivier, Chengshan Xiao
2001 Misc conf
ICASSP
Chengshan Xiao, Jan C. Olivier, Panajotis Agathoklis
2001 J jnl
IEEE Trans. Veh. Technol.
Chengshan Xiao, Karl D. Mann, Jan C. Olivier
2000 J jnl
Int. J. Wirel. Inf. Networks
Chengshan Xiao, Jan C. Olivier
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