Last active
August 1, 2020 16:26
-
-
Save zeroward/6219317e3b095929376c0ef4e9d71712 to your computer and use it in GitHub Desktop.
Tired of installing ghidra manually? Use this.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import requests | |
import apt | |
import logging | |
import sys | |
import re | |
import argparse | |
import os | |
from zipfile import ZipFile | |
project_site = "https://www.ghidra-sre.org/" | |
jdk_name = "openjdk-11-jdk" # Hardcoded for now | |
dest_dir = "/opt/" | |
exec_dir = "/usr/bin" | |
class installer: | |
def ghidraInstall(self, dirname): | |
try: | |
log.info("Moving file to {}".format(dest_dir)) | |
os.rename("./{}".format(dirname), dest_dir + dirname) | |
os.chdir(dest_dir) | |
log.info("Extracting zip file...") | |
os.system("unzip {}".format(dirname)) | |
log.info("Extraced, Creating symlink") | |
dirlist = os.listdir() | |
print(dirlist) | |
reobj = re.findall("ghidra_\d*[.]\d*[.]\d*_PUBLIC", ",".join(dirlist)) | |
print(reobj) | |
os.symlink(dest_dir + reobj[0]+"/ghidraRun", exec_dir + "/ghidraRun") | |
log.info("Symlink Placed, Cleaning up") | |
os.remove(dirname) | |
log.info("Zip file deleted") | |
except Exception as e: | |
log.error(e) | |
def ghidraScrape(self): | |
try: | |
page = requests.get(project_site) | |
regex = b"ghidra_\d*[.]\d*[.]\d*_PUBLIC_\d*.zip" | |
log.info("Finding Newest Version") | |
regobj = re.findall(regex, page.content) | |
tgtfile = str(regobj[0].decode("utf-8")) | |
log.info("Newest Version - {}".format(tgtfile)) | |
log.info("Downloading...") | |
ghidraFile = requests.get(project_site + tgtfile) | |
with open(tgtfile, "wb") as f: | |
f.write(ghidraFile.content) | |
f.close() | |
return tgtfile | |
except Exception as e: | |
log.error(e) | |
def jdkInstall(self): | |
cache = apt.cache.Cache() | |
cache.update() | |
cache.open() | |
pkg = cache[jdk_name] | |
if pkg.is_installed: | |
log.info("JDK Already Installed...passing") | |
pass | |
else: | |
pkg.mark_install() | |
try: | |
cache.commit() | |
except Exception as e: | |
log.error(e) | |
sys.exit() | |
def run(self): | |
self.jdkInstall() | |
vername = self.ghidraScrape() | |
self.ghidraInstall(vername) | |
log.info("Done!") | |
sys.exit() | |
if __name__ == "__main__": | |
# Args | |
parser = argparse.ArgumentParser() | |
parser.add_argument("-v", dest="verbose", help="Verbose Mode", action='store_true') | |
args = parser.parse_args() | |
# Verbosity not yet implemented | |
# LOGGING | |
log = logging.getLogger('') | |
log.setLevel(logging.INFO) | |
if args.verbose: | |
log.setLevel(logging.DEBUG) | |
infofmt = logging.Formatter("[%(levelname)s] %(message)s") | |
ch = logging.StreamHandler(sys.stdout) | |
ch.setFormatter(infofmt) | |
log.addHandler(ch) | |
# Execution | |
if os.geteuid() != 0: | |
log.error("Must be root to run this") | |
sys.exit() | |
x = installer() | |
x.run() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment