Nathan Self

32 papers A* 9A 1B 6Misc 2Journal 12Unranked 2
YearRankTypeTitle / Venue / Authors
2025 J jnl
CoRR
Sha Li, Ayush Sadekar, Nathan Self, Yiqi Su, Lars Andersland, Mira Chaplin, Annabel Zhang, Hyoju Yang, James B. Henderson, Krista Wigginton, Linsey Marr, T. M. Murali, Naren Ramakrishnan
2024 J jnl
ACM Trans. Knowl. Discov. Data
Taoran Ji, Nathan Self, Kaiqun Fu, Zhiqian Chen, Naren Ramakrishnan, Chang-Tien Lu
2024 B conf
IEEE Big Data
Raquib Bin Yousuf, Shengzhe Xu, Patrick Butler, Brian Mayer, Nathan Self, David Mares, Naren Ramakrishnan
2024 J jnl
Proc. ACM Hum. Comput. Interact.
Andreea Sistrunk, Nathan Self, Subhodip Biswas, Kurt Luther, Nervo Verdezoto, Naren Ramakrishnan
2023 A conf
Conference on Designing Interactive Systems (Companion Volume)
Andreea Sistrunk, Nathan Self, Subhodip Biswas, Kurt Luther, Nervo Verdezoto, Naren Ramakrishnan
2023 J jnl
Inf. Vis.
Debanjan Datta, Nathan Self, John Simeone, Amelia Meadows, Willow Outhwaite, Linda Walker, Niklas Elmqvist, Naren Ramakrishnan
2022 J jnl
CoRR
Raquib Bin Yousuf, Subhodip Biswas, Kulendra Kumar Kaushal, James Dunham, Rebecca Gelles, Sathappan Muthiah, Nathan Self, Patrick Butler, Naren Ramakrishnan
2022 B conf
ECSCW
Andreea Sistrunk, Subhodip Biswas, Nathan Self, Kurt Luther, Naren Ramakrishnan
2021 conf
IEEE BigData
Kaiqun Fu, Taoran Ji, Nathan Self, Zhiqian Chen, Chang-Tien Lu
2021 A* conf
AAAI
Taoran Ji, Nathan Self, Kaiqun Fu, Zhiqian Chen, Naren Ramakrishnan, Chang-Tien Lu
2020 A* conf
AAAI
Debanjan Datta, Mohammad Raihanul Islam, Nathan Self, Amelia Meadows, John Simeone, Willow Outhwaite, Chen Hin Keong, Amy Smith, Linda Walker, Naren Ramakrishnan
2020 A* conf
AAAI
Subhodip Biswas, Fanglan Chen, Andreea Sistrunk, Sathappan Muthiah, Zhiqian Chen, Nathan Self, Chang-Tien Lu, Naren Ramakrishnan
2020 J jnl
Soc. Netw. Anal. Min.
Vanessa Cedeno-Mieles, Zhihao Hu, Yihui Ren, Xinwei Deng, Abhijin Adiga, Christopher L. Barrett, Noshir Contractor, Saliya Ekanayake, Joshua M. Epstein, Brian J. Goode, Gizem Korkmaz, Chris J. Kuhlman, Dustin Machi, Michael W. Macy, Madhav V. Marathe, Naren Ramakrishnan, S. S. Ravi, Parang Saraf, Nathan Self
2019 B conf
ASONAM
Taoran Ji, Xuchao Zhang, Nathan Self, Kaiqun Fu, Chang-Tien Lu, Naren Ramakrishnan
2019 B conf
ASONAM
Vanessa Cedeno-Mieles, Zhihao Hu, Xinwei Deng, Yihui Ren, Abhijin Adiga, Christopher L. Barrett, Saliya Ekanayake, Gizem Korkmaz, Chris J. Kuhlman, Dustin Machi, Madhav V. Marathe, S. S. Ravi, Brian J. Goode, Naren Ramakrishnan, Parang Saraf, Nathan Self, Noshir Contractor, Joshua M. Epstein, Michael W. Macy
2019 Misc conf
WSC
Zhihao Hu, Dustin Machi, Madhav V. Marathe, S. S. Ravi, Yihui Ren, Vanessa Cedeno-Mieles, Saliya Ekanayake, Xinwei Deng, Brian J. Goode, Naren Ramakrishnan, Parang Saraf, Nathan Self, Abhijin Adiga, Gizem Korkmaz, Chris J. Kuhlman
2019 A* conf
IJCAI
Taoran Ji, Zhiqian Chen, Nathan Self, Kaiqun Fu, Chang-Tien Lu, Naren Ramakrishnan
2019 J jnl
CoRR
Taoran Ji, Zhiqian Chen, Nathan Self, Kaiqun Fu, Chang-Tien Lu, Naren Ramakrishnan
2019 conf
SIGSPATIAL/GIS
Subhodip Biswas, Fanglan Chen, Zhiqian Chen, Andreea Sistrunk, Nathan Self, Chang-Tien Lu, Naren Ramakrishnan
2018 J jnl
J. Comput. Sci. Coll.
Jessica Zeitz, Nathan Self, Leanna House, Jane Robertson Evia, Scotland Leman, Chris North
2018 B conf
ASONAM
Yihui Ren, Vanessa Cedeno-Mieles, Zhihao Hu, Xinwei Deng, Abhijin Adiga, Christopher L. Barrett, Saliya Ekanayake, Brian J. Goode, Gizem Korkmaz, Chris J. Kuhlman, Dustin Machi, Madhav V. Marathe, Naren Ramakrishnan, S. S. Ravi, Parang Saraf, Nathan Self, Noshir Contractor, Joshua M. Epstein, Michael W. Macy
2018 B conf
ASONAM
Taoran Ji, Kaiqun Fu, Nathan Self, Chang-Tien Lu, Naren Ramakrishnan
2018 Misc conf
WSC
Vanessa Cedeno-Mieles, Yihui Ren, Saliya Ekanayake, Brian J. Goode, Chris J. Kuhlman, Dustin Machi, Madhav V. Marathe, Henning S. Mortveit, Zhihao Hu, Xinwei Deng, Naren Ramakrishnan, Parang Saraf, Nathan Self, Noshir Contractor, Joshua M. Epstein, Michael W. Macy
2018 J jnl
ACM Trans. Intell. Syst. Technol.
Nikhil Muralidhar, Chen Wang, Nathan Self, Marjan Momtazpour, Kiyoshi Nakayama, Ratnesh Sharma, Naren Ramakrishnan
2017 A* conf
ICDM
Fang Jin, Wei Wang, Prithwish Chakraborty, Nathan Self, Feng Chen, Naren Ramakrishnan
2016 A* conf
KDD
Sathappan Muthiah, Patrick Butler, Rupinder Paul Khandpur, Parang Saraf, Nathan Self, Alla Rozovskaya, Liang Zhao, Jose Cadena, Chang-Tien Lu, Anil Vullikanti, Achla Marathe, Kristen Maria Summers, Graham Katz, Andy Doyle, Jaime Arredondo, Dipak K. Gupta, David Mares, Naren Ramakrishnan
2016 J jnl
CoRR
Sathappan Muthiah, Patrick Butler, Rupinder Paul Khandpur, Parang Saraf, Nathan Self, Alla Rozovskaya, Liang Zhao, Jose Cadena, Chang-Tien Lu, Anil Vullikanti, Achla Marathe, Kristen Maria Summers, Graham Katz, Andy Doyle, Jaime Arredondo, Dipak Gupta, David Mares, Naren Ramakrishnan
2014 J jnl
CoRR
Naren Ramakrishnan, Patrick Butler, Sathappan Muthiah, Nathan Self, Rupinder Paul Khandpur, Parang Saraf, Wei Wang, Jose Cadena, Anil Vullikanti, Gizem Korkmaz, Chris J. Kuhlman, Achla Marathe, Liang Zhao, Ting Hua, Feng Chen, Chang-Tien Lu, Bert Huang, Aravind Srinivasan, Khoa Trinh, Lise Getoor, Graham Katz, Andy Doyle, Chris Ackermann, Ilya Zavorin, Jim Ford, Kristen Maria Summers, Youssef Fayed, Jaime Arredondo, Dipak Gupta, David Mares
2014 A* conf
KDD
Naren Ramakrishnan, Patrick Butler, Sathappan Muthiah, Nathan Self, Rupinder Paul Khandpur, Parang Saraf, Wei Wang, Jose Cadena, Anil Vullikanti, Gizem Korkmaz, Chris J. Kuhlman, Achla Marathe, Liang Zhao, Ting Hua, Feng Chen, Chang-Tien Lu, Bert Huang, Aravind Srinivasan, Khoa Trinh, Lise Getoor, Graham Katz, Andy Doyle, Chris Ackermann, Ilya Zavorin, Jim Ford, Kristen Maria Summers, Youssef Fayed, Jaime Arredondo, Dipak Gupta, David Mares
2014 J jnl
Big Data
Andy Doyle, Graham Katz, Kristen Maria Summers, Chris Ackermann, Ilya Zavorin, Zunsik Lim, Sathappan Muthiah, Patrick Butler, Nathan Self, Liang Zhao, Chang-Tien Lu, Rupinder Paul Khandpur, Youssef Fayed, Naren Ramakrishnan
2014 A* conf
KDD
Fang Jin, Rupinder Paul Khandpur, Nathan Self, Edward R. Dougherty, Sheng Guo, Feng Chen, B. Aditya Prakash, Naren Ramakrishnan
2013 A* conf
KDD
Fang Jin, Nathan Self, Parang Saraf, Patrick Butler, Wei Wang, Naren Ramakrishnan
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