ghidra/Ghidra/Features/Python/ghidra_scripts/CallAnotherScriptForAllProg...

76 lines
2.8 KiB
Python

# Shows how to run a script on all of the programs within the current project.
# DISCLAIMER: This is a recreation of a Java Ghidra script for example
# use only. Please run the Java version in a production environment.
# NOTE: Script will only process unversioned and checked-out files.
#@category Examples.Python
from ghidra.app.script import GhidraState
from ghidra.framework.model import *
from ghidra.program.database import ProgramContentHandler
from ghidra.program.model.listing import Program
from ghidra.util.exception import CancelledException
from ghidra.util.exception import VersionException
from java.io import IOException
# The script referenced in the following line should be replaced with the script to be called
SUBSCRIPT_NAME = "AddCommentToProgramScript.java"
def recurseProjectFolder(domainFolder):
files = domainFolder.getFiles()
for domainFile in files:
processDomainFile(domainFile)
folders = domainFolder.getFolders()
for folder in folders:
recurseProjectFolder(folder)
def processDomainFile(domainFile):
if not ProgramContentHandler.PROGRAM_CONTENT_TYPE == domainFile.getContentType():
return # skip non-Program files
if domainFile.isVersioned() and not domainFile.isCheckedOut():
println("WARNING! Skipping versioned file - not checked-out: " + domainFile.getPathname())
program = None
consumer = java.lang.Object()
try:
program = domainFile.getDomainObject(consumer, True, False, monitor)
processProgram(program)
except VersionException:
println("ERROR! Failed to process file due to upgrade issue: " + domainFile.getPathname())
finally:
if program is not None:
program.release(consumer)
def processProgram(program):
"""Do you program work here """
println("Processing: " + program.getDomainFile().getPathname())
monitor.setMessage("Processing: " + program.getDomainFile().getName())
id = program.startTransaction("Batch Script Transaction")
try:
newState = GhidraState(state.getTool(), state.getProject(), program, None, None, None)
runScript(SUBSCRIPT_NAME, newState)
except Exception:
printerr("ERROR! Exception occurred while processing file: " + program.getDomainFile().getPathname())
printerr(" " + Exception.getMessage())
e.printStackTrace()
finally:
program.endTransaction(id, True)
# ...save any changes
program.save("Changes made by script: " + SUBSCRIPT_NAME, monitor)
if currentProgram is not None:
popup("This script should be run from a tool with no open programs")
exit()
project = state.getProject()
projectData = project.getProjectData()
rootFolder = projectData.getRootFolder()
recurseProjectFolder(rootFolder)