Skip to content

Instantly share code, notes, and snippets.

@zeroward
Last active August 1, 2020 16:26
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save zeroward/6219317e3b095929376c0ef4e9d71712 to your computer and use it in GitHub Desktop.
Save zeroward/6219317e3b095929376c0ef4e9d71712 to your computer and use it in GitHub Desktop.
Tired of installing ghidra manually? Use this.
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