mirror of
https://github.com/NationalSecurityAgency/ghidra.git
synced 2026-06-04 07:45:36 +08:00
GP-3952 Updated the script categories to simplify and reduce the number of folders.
This commit is contained in:
@@ -19,7 +19,7 @@
|
|||||||
//script is more for diagnostic and demonstration purposes, since the application of unwind
|
//script is more for diagnostic and demonstration purposes, since the application of unwind
|
||||||
//information is already integrated into the Debugger.
|
//information is already integrated into the Debugger.
|
||||||
//@author
|
//@author
|
||||||
//@category Stack
|
//@category
|
||||||
//@keybinding
|
//@keybinding
|
||||||
//@menupath
|
//@menupath
|
||||||
//@toolbar
|
//@toolbar
|
||||||
|
|||||||
@@ -14,7 +14,7 @@
|
|||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
//Example script for training random forests to find function starts
|
//Example script for training random forests to find function starts
|
||||||
//@category machineLearning
|
//@category Training
|
||||||
|
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
import java.util.Map.Entry;
|
import java.util.Map.Entry;
|
||||||
|
|||||||
@@ -15,7 +15,7 @@
|
|||||||
*/
|
*/
|
||||||
// Turns off function start searching (intended for use with the
|
// Turns off function start searching (intended for use with the
|
||||||
// headless analyzer as a prescript)
|
// headless analyzer as a prescript)
|
||||||
//@category machineLearning
|
//@category Search
|
||||||
|
|
||||||
import ghidra.app.script.GhidraScript;
|
import ghidra.app.script.GhidraScript;
|
||||||
|
|
||||||
|
|||||||
@@ -15,7 +15,7 @@
|
|||||||
##
|
##
|
||||||
# Generate the BSim signature for the function at the current address,
|
# Generate the BSim signature for the function at the current address,
|
||||||
# then dump the signature hashes and debug information to the console
|
# then dump the signature hashes and debug information to the console
|
||||||
# @category: BSim.python
|
# @category: BSim.Python
|
||||||
# @runtime Jython
|
# @runtime Jython
|
||||||
|
|
||||||
import ghidra.app.decompiler.DecompInterface as DecompInterface
|
import ghidra.app.decompiler.DecompInterface as DecompInterface
|
||||||
|
|||||||
@@ -15,7 +15,7 @@
|
|||||||
##
|
##
|
||||||
# Generate the BSim signature for the function at the current address, then dump the
|
# Generate the BSim signature for the function at the current address, then dump the
|
||||||
# signature hashes to the console
|
# signature hashes to the console
|
||||||
# @category: BSim.python
|
# @category: BSim.Python
|
||||||
# @runtime Jython
|
# @runtime Jython
|
||||||
|
|
||||||
import ghidra.app.decompiler.DecompInterface as DecompInterface
|
import ghidra.app.decompiler.DecompInterface as DecompInterface
|
||||||
|
|||||||
@@ -14,7 +14,7 @@
|
|||||||
# limitations under the License.
|
# limitations under the License.
|
||||||
##
|
##
|
||||||
# Example of how to perform an overview query in a script
|
# Example of how to perform an overview query in a script
|
||||||
# @category BSim.python
|
# @category BSim.Python
|
||||||
# @runtime Jython
|
# @runtime Jython
|
||||||
|
|
||||||
import ghidra.features.bsim.query.facade.SFOverviewInfo as SFOverviewInfo
|
import ghidra.features.bsim.query.facade.SFOverviewInfo as SFOverviewInfo
|
||||||
|
|||||||
@@ -14,7 +14,7 @@
|
|||||||
# limitations under the License.
|
# limitations under the License.
|
||||||
##
|
##
|
||||||
#Generate signatures for every function in the current program and write them to an XML file in a user-specified directory
|
#Generate signatures for every function in the current program and write them to an XML file in a user-specified directory
|
||||||
#@category BSim.python
|
#@category BSim.Python
|
||||||
#@runtime Jython
|
#@runtime Jython
|
||||||
|
|
||||||
import java.lang.System as System
|
import java.lang.System as System
|
||||||
|
|||||||
@@ -14,7 +14,7 @@
|
|||||||
# limitations under the License.
|
# limitations under the License.
|
||||||
##
|
##
|
||||||
# Example of performing a BSim query on a single function
|
# Example of performing a BSim query on a single function
|
||||||
# @category BSim.python
|
# @category BSim.Python
|
||||||
# @runtime Jython
|
# @runtime Jython
|
||||||
|
|
||||||
import ghidra.features.bsim.query.BSimClientFactory as BSimClientFactory
|
import ghidra.features.bsim.query.BSimClientFactory as BSimClientFactory
|
||||||
|
|||||||
@@ -14,7 +14,7 @@
|
|||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
// Build ResultState for current function
|
// Build ResultState for current function
|
||||||
// @category Experimental
|
// @category
|
||||||
|
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
|
||||||
|
|||||||
@@ -14,12 +14,12 @@
|
|||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
//Converts an ascii hex file into binary file. Works for files with spaces and without. Assumes hex bytes are zero padded so all values are two bytes long.
|
//Converts an ascii hex file into binary file. Works for files with spaces and without. Assumes hex bytes are zero padded so all values are two bytes long.
|
||||||
//@category Conversion
|
//@category
|
||||||
|
|
||||||
import ghidra.app.script.GhidraScript;
|
|
||||||
|
|
||||||
import java.io.*;
|
import java.io.*;
|
||||||
|
|
||||||
|
import ghidra.app.script.GhidraScript;
|
||||||
|
|
||||||
public class AsciiToBinaryScript extends GhidraScript {
|
public class AsciiToBinaryScript extends GhidraScript {
|
||||||
|
|
||||||
private static final String EMPTY_STRING = "";
|
private static final String EMPTY_STRING = "";
|
||||||
@@ -37,7 +37,8 @@ public class AsciiToBinaryScript extends GhidraScript {
|
|||||||
File outBinaryFile = askFile("Select Binary File", "Binary File");
|
File outBinaryFile = askFile("Select Binary File", "Binary File");
|
||||||
|
|
||||||
if (outBinaryFile.equals(inAsciiFile)) {
|
if (outBinaryFile.equals(inAsciiFile)) {
|
||||||
popup("Input file and output file are the same. Please choose a different file for the output." +
|
popup(
|
||||||
|
"Input file and output file are the same. Please choose a different file for the output." +
|
||||||
inAsciiFile.getAbsolutePath());
|
inAsciiFile.getAbsolutePath());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,7 +14,7 @@
|
|||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
//Recursively finds a folder that matches a string and renames it to a new name.
|
//Recursively finds a folder that matches a string and renames it to a new name.
|
||||||
//@category Project
|
//@category Program
|
||||||
//@menupath
|
//@menupath
|
||||||
|
|
||||||
import ghidra.app.script.GhidraScript;
|
import ghidra.app.script.GhidraScript;
|
||||||
@@ -26,7 +26,6 @@ public class BatchRename extends GhidraScript {
|
|||||||
public BatchRename() {
|
public BatchRename() {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void run() throws Exception {
|
public void run() throws Exception {
|
||||||
|
|
||||||
|
|||||||
@@ -14,7 +14,7 @@
|
|||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
//Separates co-mingled n-bit and 64-bit binaries into two folder trees.
|
//Separates co-mingled n-bit and 64-bit binaries into two folder trees.
|
||||||
//@category Project
|
//@category Program
|
||||||
//@menupath
|
//@menupath
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
/* ###
|
/* ###
|
||||||
* IP: GHIDRA
|
* IP: GHIDRA
|
||||||
* REVIEWED: YES
|
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@@ -15,13 +14,12 @@
|
|||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
//Converts a binary file into an ascii hex file.
|
//Converts a binary file into an ascii hex file.
|
||||||
//@category Conversion
|
//@category
|
||||||
|
|
||||||
import ghidra.app.script.GhidraScript;
|
|
||||||
import ghidra.util.Conv;
|
|
||||||
|
|
||||||
import java.io.*;
|
import java.io.*;
|
||||||
|
|
||||||
|
import ghidra.app.script.GhidraScript;
|
||||||
|
import ghidra.util.Conv;
|
||||||
|
|
||||||
public class BinaryToAsciiScript extends GhidraScript {
|
public class BinaryToAsciiScript extends GhidraScript {
|
||||||
|
|
||||||
@@ -42,7 +40,8 @@ public class BinaryToAsciiScript extends GhidraScript {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (outAsciiFile.exists()) {
|
if (outAsciiFile.exists()) {
|
||||||
if (!askYesNo("Ascii File Already Exists", "The ascii file already exists.\nDo you want to overwrite it?")) {
|
if (!askYesNo("Ascii File Already Exists",
|
||||||
|
"The ascii file already exists.\nDo you want to overwrite it?")) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -16,7 +16,7 @@
|
|||||||
// Produces a list of instructions whose pcode contains a CALLOTHER pcode op. The list is
|
// Produces a list of instructions whose pcode contains a CALLOTHER pcode op. The list is
|
||||||
// sorted by number of occurrences of an instruction. When run headlessly, the list is displayed
|
// sorted by number of occurrences of an instruction. When run headlessly, the list is displayed
|
||||||
// each time a program is processed and the counts are cumulative.
|
// each time a program is processed and the counts are cumulative.
|
||||||
// @category sleigh
|
// @category Sleigh
|
||||||
|
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|||||||
@@ -17,12 +17,12 @@
|
|||||||
//and saves the results to a file.
|
//and saves the results to a file.
|
||||||
//@category Customer Submission.Strings
|
//@category Customer Submission.Strings
|
||||||
|
|
||||||
|
import java.io.*;
|
||||||
|
|
||||||
import ghidra.app.script.GhidraScript;
|
import ghidra.app.script.GhidraScript;
|
||||||
import ghidra.program.model.listing.*;
|
import ghidra.program.model.listing.*;
|
||||||
import ghidra.program.util.ProgramSelection;
|
import ghidra.program.util.ProgramSelection;
|
||||||
|
|
||||||
import java.io.*;
|
|
||||||
|
|
||||||
public class CountAndSaveStrings extends GhidraScript {
|
public class CountAndSaveStrings extends GhidraScript {
|
||||||
private Listing listing;
|
private Listing listing;
|
||||||
private File saveFile;
|
private File saveFile;
|
||||||
@@ -46,8 +46,8 @@ public class CountAndSaveStrings extends GhidraScript {
|
|||||||
private File getSaveFile() throws Exception {
|
private File getSaveFile() throws Exception {
|
||||||
File file = askFile("Choose File Location", "Save");
|
File file = askFile("Choose File Location", "Save");
|
||||||
if (file.exists()) {
|
if (file.exists()) {
|
||||||
if (!askYesNo("File Already Exists", "A file already exists with the name you "
|
if (!askYesNo("File Already Exists", "A file already exists with the name you " +
|
||||||
+ "chose.\nDo you want to overwrite it?")) {
|
"chose.\nDo you want to overwrite it?")) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -21,7 +21,7 @@
|
|||||||
//
|
//
|
||||||
// The name of the .exports file will be printed when the script finishes.
|
// The name of the .exports file will be printed when the script finishes.
|
||||||
//
|
//
|
||||||
//@category Windows
|
//@category
|
||||||
//@keybinding
|
//@keybinding
|
||||||
//@menupath
|
//@menupath
|
||||||
//@toolbar
|
//@toolbar
|
||||||
|
|||||||
@@ -14,7 +14,7 @@
|
|||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
//finds and creates strings that end with '\n'
|
//finds and creates strings that end with '\n'
|
||||||
//@category Memory
|
//@category Data Types
|
||||||
|
|
||||||
import ghidra.app.script.GhidraScript;
|
import ghidra.app.script.GhidraScript;
|
||||||
import ghidra.program.model.address.Address;
|
import ghidra.program.model.address.Address;
|
||||||
|
|||||||
@@ -15,13 +15,12 @@
|
|||||||
*/
|
*/
|
||||||
// Attempt to parse single instruction from memory bytes at current location.
|
// Attempt to parse single instruction from memory bytes at current location.
|
||||||
// Parse trace output written to Tool Console.
|
// Parse trace output written to Tool Console.
|
||||||
// @category sleigh
|
// @category Sleigh
|
||||||
import ghidra.app.plugin.processors.sleigh.SleighDebugLogger;
|
import ghidra.app.plugin.processors.sleigh.SleighDebugLogger;
|
||||||
import ghidra.app.plugin.processors.sleigh.SleighDebugLogger.SleighDebugMode;
|
import ghidra.app.plugin.processors.sleigh.SleighDebugLogger.SleighDebugMode;
|
||||||
import ghidra.app.script.GhidraScript;
|
import ghidra.app.script.GhidraScript;
|
||||||
import ghidra.util.StringUtilities;
|
import ghidra.util.StringUtilities;
|
||||||
|
|
||||||
|
|
||||||
public class DebugSleighInstructionParse extends GhidraScript {
|
public class DebugSleighInstructionParse extends GhidraScript {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -32,7 +31,8 @@ public class DebugSleighInstructionParse extends GhidraScript {
|
|||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
SleighDebugLogger logger = new SleighDebugLogger(currentProgram, currentAddress, SleighDebugMode.VERBOSE);
|
SleighDebugLogger logger =
|
||||||
|
new SleighDebugLogger(currentProgram, currentAddress, SleighDebugMode.VERBOSE);
|
||||||
|
|
||||||
if (!logger.parseFailed()) {
|
if (!logger.parseFailed()) {
|
||||||
logger.append("\n");
|
logger.append("\n");
|
||||||
@@ -48,12 +48,14 @@ public class DebugSleighInstructionParse extends GhidraScript {
|
|||||||
for (int i = 0; i < logger.getNumOperands(); i++) {
|
for (int i = 0; i < logger.getNumOperands(); i++) {
|
||||||
mask = logger.getOperandValueMask(i);
|
mask = logger.getOperandValueMask(i);
|
||||||
logger.append("\nOp-" + i + " Mask: " + getFormattedBytes(mask));
|
logger.append("\nOp-" + i + " Mask: " + getFormattedBytes(mask));
|
||||||
logger.append("\nOp-" + i + " Value: " + getFormattedBytes(logger.getMaskedBytes(mask)));
|
logger.append(
|
||||||
|
"\nOp-" + i + " Value: " + getFormattedBytes(logger.getMaskedBytes(mask)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
println(logger.toString());
|
println(logger.toString());
|
||||||
|
|
||||||
} catch (Exception e) {
|
}
|
||||||
|
catch (Exception e) {
|
||||||
println(e.getMessage());
|
println(e.getMessage());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -14,7 +14,7 @@
|
|||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
//Convenience script to quickly clear, edit, and recreate the code or data at the current cursor location.
|
//Convenience script to quickly clear, edit, and recreate the code or data at the current cursor location.
|
||||||
//@category Memory
|
//@category Update
|
||||||
//@keybinding
|
//@keybinding
|
||||||
//@menupath
|
//@menupath
|
||||||
//@toolbar
|
//@toolbar
|
||||||
|
|||||||
@@ -15,7 +15,7 @@
|
|||||||
*/
|
*/
|
||||||
//Looks for already defined graphic image data in the program
|
//Looks for already defined graphic image data in the program
|
||||||
//and writes all selected images to a directory.
|
//and writes all selected images to a directory.
|
||||||
//@category Images
|
//@category
|
||||||
|
|
||||||
import java.awt.image.BufferedImage;
|
import java.awt.image.BufferedImage;
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
|
|||||||
@@ -14,15 +14,15 @@
|
|||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
//Rid us of those pesky FF's that become bad instructions
|
//Rid us of those pesky FF's that become bad instructions
|
||||||
//@category Cleanup
|
//@category
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
|
||||||
import ghidra.app.script.GhidraScript;
|
import ghidra.app.script.GhidraScript;
|
||||||
import ghidra.program.model.address.Address;
|
import ghidra.program.model.address.Address;
|
||||||
import ghidra.program.model.data.CategoryPath;
|
import ghidra.program.model.data.CategoryPath;
|
||||||
import ghidra.program.model.data.DataType;
|
import ghidra.program.model.data.DataType;
|
||||||
|
|
||||||
import java.util.Arrays;
|
|
||||||
|
|
||||||
public class FFsBeGoneScript extends GhidraScript {
|
public class FFsBeGoneScript extends GhidraScript {
|
||||||
private Address addr;
|
private Address addr;
|
||||||
byte[] bytes = new byte[10];
|
byte[] bytes = new byte[10];
|
||||||
@@ -83,11 +83,17 @@ public class FFsBeGoneScript extends GhidraScript {
|
|||||||
if (!isUndefinedData(addr)) {
|
if (!isUndefinedData(addr)) {
|
||||||
if (currentProgram.getListing().getInstructionContaining(addr) != null) {
|
if (currentProgram.getListing().getInstructionContaining(addr) != null) {
|
||||||
addr =
|
addr =
|
||||||
currentProgram.getListing().getInstructionContaining(addr).getMaxAddress().next();
|
currentProgram.getListing()
|
||||||
|
.getInstructionContaining(addr)
|
||||||
|
.getMaxAddress()
|
||||||
|
.next();
|
||||||
}
|
}
|
||||||
else if (currentProgram.getListing().getDefinedDataContaining(addr) != null) {
|
else if (currentProgram.getListing().getDefinedDataContaining(addr) != null) {
|
||||||
addr =
|
addr =
|
||||||
currentProgram.getListing().getDefinedDataContaining(addr).getMaxAddress().next();
|
currentProgram.getListing()
|
||||||
|
.getDefinedDataContaining(addr)
|
||||||
|
.getMaxAddress()
|
||||||
|
.next();
|
||||||
}
|
}
|
||||||
advance();
|
advance();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,7 +14,7 @@
|
|||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
//Finds programs containing various audio resources such as WAV's
|
//Finds programs containing various audio resources such as WAV's
|
||||||
//@category Resources
|
//@category Search
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@@ -109,7 +109,8 @@ public class FindAudioInProgramScript extends GhidraScript {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
found =
|
found =
|
||||||
memory.findBytes(start, blocks[i].getEnd(), imageBytes, mask, true, monitor);
|
memory.findBytes(start, blocks[i].getEnd(), imageBytes, mask, true,
|
||||||
|
monitor);
|
||||||
if (found != null) {
|
if (found != null) {
|
||||||
foundImages.add(found);
|
foundImages.add(found);
|
||||||
start = found.add(1);
|
start = found.add(1);
|
||||||
|
|||||||
@@ -14,7 +14,10 @@
|
|||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
//Finds PNG and GIF images and applies data type if not already applied
|
//Finds PNG and GIF images and applies data type if not already applied
|
||||||
//@category Images
|
//@category Search
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
import ghidra.app.script.GhidraScript;
|
import ghidra.app.script.GhidraScript;
|
||||||
import ghidra.program.model.address.Address;
|
import ghidra.program.model.address.Address;
|
||||||
import ghidra.program.model.data.GifDataType;
|
import ghidra.program.model.data.GifDataType;
|
||||||
@@ -23,9 +26,6 @@ import ghidra.program.model.listing.Data;
|
|||||||
import ghidra.program.model.mem.Memory;
|
import ghidra.program.model.mem.Memory;
|
||||||
import ghidra.program.model.mem.MemoryBlock;
|
import ghidra.program.model.mem.MemoryBlock;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
public class FindImagesScript extends GhidraScript {
|
public class FindImagesScript extends GhidraScript {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
/* ###
|
/* ###
|
||||||
* IP: GHIDRA
|
* IP: GHIDRA
|
||||||
* REVIEWED: YES
|
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
|||||||
@@ -27,7 +27,7 @@
|
|||||||
//
|
//
|
||||||
// Script may be constrained by a selection.
|
// Script may be constrained by a selection.
|
||||||
//
|
//
|
||||||
//@category ELF Relocations
|
//@category DWARF
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
|
|
||||||
import ghidra.app.script.GhidraScript;
|
import ghidra.app.script.GhidraScript;
|
||||||
@@ -82,7 +82,8 @@ public class FixElfExternalOffsetDataRelocationScript extends GhidraScript {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean updateExternalDataRelocation(Bookmark relocErrorBookmark, MessageLog log) throws Exception {
|
private boolean updateExternalDataRelocation(Bookmark relocErrorBookmark, MessageLog log)
|
||||||
|
throws Exception {
|
||||||
|
|
||||||
Address address = relocErrorBookmark.getAddress();
|
Address address = relocErrorBookmark.getAddress();
|
||||||
String bookmarkComment = relocErrorBookmark.getComment();
|
String bookmarkComment = relocErrorBookmark.getComment();
|
||||||
@@ -112,12 +113,14 @@ public class FixElfExternalOffsetDataRelocationScript extends GhidraScript {
|
|||||||
Memory memory = currentProgram.getMemory();
|
Memory memory = currentProgram.getMemory();
|
||||||
DumbMemBufferImpl buf = new DumbMemBufferImpl(memory, address);
|
DumbMemBufferImpl buf = new DumbMemBufferImpl(memory, address);
|
||||||
|
|
||||||
Address symbolAddr = PointerDataType.getAddressValue(buf, byteSize, address.getAddressSpace());
|
Address symbolAddr =
|
||||||
|
PointerDataType.getAddressValue(buf, byteSize, address.getAddressSpace());
|
||||||
if (symbolAddr == null) {
|
if (symbolAddr == null) {
|
||||||
return false; // invalid pointer data
|
return false; // invalid pointer data
|
||||||
}
|
}
|
||||||
|
|
||||||
String symbolName = bookmarkComment.substring(EXT_RELO_BOOKMARK_TEXT_PREFIX.length(), index - 1).trim();
|
String symbolName =
|
||||||
|
bookmarkComment.substring(EXT_RELO_BOOKMARK_TEXT_PREFIX.length(), index - 1).trim();
|
||||||
if (currentProgram.getSymbolTable().getSymbol(symbolName, symbolAddr, null) == null) {
|
if (currentProgram.getSymbolTable().getSymbol(symbolName, symbolAddr, null) == null) {
|
||||||
return false; // EXTERNAL block symbol not found at stored address
|
return false; // EXTERNAL block symbol not found at stored address
|
||||||
}
|
}
|
||||||
@@ -146,7 +149,8 @@ public class FixElfExternalOffsetDataRelocationScript extends GhidraScript {
|
|||||||
|
|
||||||
currentProgram.getBookmarkManager().removeBookmark(relocErrorBookmark);
|
currentProgram.getBookmarkManager().removeBookmark(relocErrorBookmark);
|
||||||
|
|
||||||
ElfRelocationHandler.warnExternalOffsetRelocation(currentProgram, address, symbolAddr, symbolName, offset, log);
|
ElfRelocationHandler.warnExternalOffsetRelocation(currentProgram, address, symbolAddr,
|
||||||
|
symbolName, offset, log);
|
||||||
|
|
||||||
DataType offsetPtrDt =
|
DataType offsetPtrDt =
|
||||||
currentProgram.getDataTypeManager()
|
currentProgram.getDataTypeManager()
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
/* ###
|
/* ###
|
||||||
* IP: GHIDRA
|
* IP: GHIDRA
|
||||||
* REVIEWED: YES
|
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@@ -15,7 +14,7 @@
|
|||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
//Iterates over all defined data in the current program.
|
//Iterates over all defined data in the current program.
|
||||||
//@category Iteration
|
//@category Examples
|
||||||
|
|
||||||
import ghidra.app.script.GhidraScript;
|
import ghidra.app.script.GhidraScript;
|
||||||
import ghidra.program.model.listing.Data;
|
import ghidra.program.model.listing.Data;
|
||||||
|
|||||||
@@ -16,7 +16,7 @@
|
|||||||
//Iterates over all functions in the current program
|
//Iterates over all functions in the current program
|
||||||
//starting at the minimum address of the program.
|
//starting at the minimum address of the program.
|
||||||
//
|
//
|
||||||
//@category Iteration
|
//@category Examples
|
||||||
|
|
||||||
import ghidra.app.script.GhidraScript;
|
import ghidra.app.script.GhidraScript;
|
||||||
import ghidra.program.model.address.Address;
|
import ghidra.program.model.address.Address;
|
||||||
@@ -29,7 +29,8 @@ public class IterateFunctionsByAddressScript extends GhidraScript {
|
|||||||
public void run() throws Exception {
|
public void run() throws Exception {
|
||||||
|
|
||||||
boolean forward =
|
boolean forward =
|
||||||
askYesNo("Iterate Function", "Do you want to iterate from low address to high address?");
|
askYesNo("Iterate Function",
|
||||||
|
"Do you want to iterate from low address to high address?");
|
||||||
|
|
||||||
if (forward) {
|
if (forward) {
|
||||||
iterateForward();
|
iterateForward();
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
/* ###
|
/* ###
|
||||||
* IP: GHIDRA
|
* IP: GHIDRA
|
||||||
* REVIEWED: YES
|
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@@ -15,7 +14,7 @@
|
|||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
//Iterates over all functions in the current program.
|
//Iterates over all functions in the current program.
|
||||||
//@category Iteration
|
//@category Examples
|
||||||
|
|
||||||
import ghidra.app.script.GhidraScript;
|
import ghidra.app.script.GhidraScript;
|
||||||
import ghidra.program.model.listing.Function;
|
import ghidra.program.model.listing.Function;
|
||||||
@@ -26,7 +25,8 @@ public class IterateFunctionsScript extends GhidraScript {
|
|||||||
public void run() throws Exception {
|
public void run() throws Exception {
|
||||||
|
|
||||||
boolean forward =
|
boolean forward =
|
||||||
askYesNo("Iterate Function", "Do you want to iterate from low address to high address?");
|
askYesNo("Iterate Function",
|
||||||
|
"Do you want to iterate from low address to high address?");
|
||||||
|
|
||||||
if (forward) {
|
if (forward) {
|
||||||
iterateForward();
|
iterateForward();
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
/* ###
|
/* ###
|
||||||
* IP: GHIDRA
|
* IP: GHIDRA
|
||||||
* REVIEWED: YES
|
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@@ -15,7 +14,7 @@
|
|||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
//Iterates over all instructions in the current program.
|
//Iterates over all instructions in the current program.
|
||||||
//@category Iteration
|
//@category Examples
|
||||||
|
|
||||||
import ghidra.app.script.GhidraScript;
|
import ghidra.app.script.GhidraScript;
|
||||||
import ghidra.program.model.listing.Instruction;
|
import ghidra.program.model.listing.Instruction;
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
/* ###
|
/* ###
|
||||||
* IP: GHIDRA
|
* IP: GHIDRA
|
||||||
* REVIEWED: YES
|
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
|||||||
@@ -16,7 +16,7 @@
|
|||||||
// Generate WARNING Bookmarks at instructions whose pcode contains a CALLOTHER op.
|
// Generate WARNING Bookmarks at instructions whose pcode contains a CALLOTHER op.
|
||||||
// This is useful to find PseudoOps that need to be implemented to yield better
|
// This is useful to find PseudoOps that need to be implemented to yield better
|
||||||
// emulation or decompilation.
|
// emulation or decompilation.
|
||||||
// @category sleigh
|
// @category Sleigh
|
||||||
|
|
||||||
import ghidra.app.script.GhidraScript;
|
import ghidra.app.script.GhidraScript;
|
||||||
import ghidra.program.disassemble.Disassembler;
|
import ghidra.program.disassemble.Disassembler;
|
||||||
|
|||||||
@@ -16,7 +16,7 @@
|
|||||||
// Generate WARNING Bookmarks on instructions which have unimplemented pcode.
|
// Generate WARNING Bookmarks on instructions which have unimplemented pcode.
|
||||||
// Similar to disassembler's built-in marking but allows for refresh after
|
// Similar to disassembler's built-in marking but allows for refresh after
|
||||||
// language update.
|
// language update.
|
||||||
// @category sleigh
|
// @category Sleigh
|
||||||
import ghidra.app.script.GhidraScript;
|
import ghidra.app.script.GhidraScript;
|
||||||
import ghidra.program.disassemble.Disassembler;
|
import ghidra.program.disassemble.Disassembler;
|
||||||
import ghidra.program.model.address.AddressSetView;
|
import ghidra.program.model.address.AddressSetView;
|
||||||
@@ -60,7 +60,8 @@ public class MarkUnimplementedPcode extends GhidraScript {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void markUnimplementedPcode(Instruction instr) {
|
private void markUnimplementedPcode(Instruction instr) {
|
||||||
currentProgram.getBookmarkManager().setBookmark(instr.getAddress(), BookmarkType.WARNING,
|
currentProgram.getBookmarkManager()
|
||||||
|
.setBookmark(instr.getAddress(), BookmarkType.WARNING,
|
||||||
Disassembler.UNIMPL_BOOKMARK_CATEGORY,
|
Disassembler.UNIMPL_BOOKMARK_CATEGORY,
|
||||||
"Instruction pcode is unimplemented: " + instr.getMnemonicString());
|
"Instruction pcode is unimplemented: " + instr.getMnemonicString());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -16,33 +16,23 @@
|
|||||||
//This script applies labels and comments to the WallaceSrc.exe program for use with GhidraClass exercises
|
//This script applies labels and comments to the WallaceSrc.exe program for use with GhidraClass exercises
|
||||||
//@category Training.Ghidra Class
|
//@category Training.Ghidra Class
|
||||||
|
|
||||||
|
|
||||||
import ghidra.app.script.GhidraScript;
|
import ghidra.app.script.GhidraScript;
|
||||||
import ghidra.program.model.address.Address;
|
import ghidra.program.model.address.Address;
|
||||||
import ghidra.program.model.data.ArrayDataType;
|
import ghidra.program.model.data.*;
|
||||||
import ghidra.program.model.data.BooleanDataType;
|
import ghidra.program.model.listing.*;
|
||||||
import ghidra.program.model.data.CharDataType;
|
|
||||||
import ghidra.program.model.data.IntegerDataType;
|
|
||||||
import ghidra.program.model.data.PointerDataType;
|
|
||||||
import ghidra.program.model.data.Structure;
|
|
||||||
import ghidra.program.model.data.StructureDataType;
|
|
||||||
import ghidra.program.model.listing.Function;
|
|
||||||
import ghidra.program.model.listing.Function.FunctionUpdateType;
|
import ghidra.program.model.listing.Function.FunctionUpdateType;
|
||||||
import ghidra.program.model.listing.Parameter;
|
import ghidra.program.model.symbol.*;
|
||||||
import ghidra.program.model.listing.ParameterImpl;
|
|
||||||
import ghidra.program.model.symbol.Namespace;
|
|
||||||
import ghidra.program.model.symbol.SourceType;
|
|
||||||
import ghidra.program.model.symbol.SymbolTable;
|
|
||||||
import ghidra.util.exception.InvalidInputException;
|
import ghidra.util.exception.InvalidInputException;
|
||||||
|
|
||||||
public class MarkupWallaceSrcScript extends GhidraScript {
|
public class MarkupWallaceSrcScript extends GhidraScript {
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void run() throws Exception {
|
public void run() throws Exception {
|
||||||
|
|
||||||
if(!currentProgram.getName().contains("WallaceSrc") || (!currentProgram.getExecutableMD5().equals("2527c463a079c81af7b3bc1d26bd3b5d"))) {
|
if (!currentProgram.getName().contains("WallaceSrc") ||
|
||||||
println("This script is only meant to work on the WallaceSrc executable with md5 hash 2527c463a079c81af7b3bc1d26bd3b5d.");
|
(!currentProgram.getExecutableMD5().equals("2527c463a079c81af7b3bc1d26bd3b5d"))) {
|
||||||
|
println(
|
||||||
|
"This script is only meant to work on the WallaceSrc executable with md5 hash 2527c463a079c81af7b3bc1d26bd3b5d.");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -68,49 +58,63 @@ public class MarkupWallaceSrcScript extends GhidraScript {
|
|||||||
//Gadget::Gadget(Gadget * this, undefined4 param_1)
|
//Gadget::Gadget(Gadget * this, undefined4 param_1)
|
||||||
Function gadgetFunction = getFunctionAt(toAddr(0x00411440));
|
Function gadgetFunction = getFunctionAt(toAddr(0x00411440));
|
||||||
Parameter[] parameters = gadgetFunction.getParameters();
|
Parameter[] parameters = gadgetFunction.getParameters();
|
||||||
parameters[0] = new ParameterImpl("this", new PointerDataType(gadgetStruct), currentProgram);
|
parameters[0] =
|
||||||
gadgetFunction.replaceParameters(FunctionUpdateType.DYNAMIC_STORAGE_ALL_PARAMS,true, SourceType.USER_DEFINED, parameters);
|
new ParameterImpl("this", new PointerDataType(gadgetStruct), currentProgram);
|
||||||
|
gadgetFunction.replaceParameters(FunctionUpdateType.DYNAMIC_STORAGE_ALL_PARAMS, true,
|
||||||
|
SourceType.USER_DEFINED, parameters);
|
||||||
|
|
||||||
//deployGadget - return type = Gadget *
|
//deployGadget - return type = Gadget *
|
||||||
Function deployGadgetFunction = getFunctionAt(toAddr(0x004118f0));
|
Function deployGadgetFunction = getFunctionAt(toAddr(0x004118f0));
|
||||||
deployGadgetFunction.setReturnType(new PointerDataType(gadgetStruct), SourceType.USER_DEFINED);
|
deployGadgetFunction.setReturnType(new PointerDataType(gadgetStruct),
|
||||||
|
SourceType.USER_DEFINED);
|
||||||
|
|
||||||
//initializePeople(Person *)
|
//initializePeople(Person *)
|
||||||
Function initPeopleFunction = getFunctionAt(toAddr(0x004117c0));
|
Function initPeopleFunction = getFunctionAt(toAddr(0x004117c0));
|
||||||
parameters = initPeopleFunction.getParameters();
|
parameters = initPeopleFunction.getParameters();
|
||||||
parameters[0] = new ParameterImpl("people", new PointerDataType(personStruct), currentProgram);
|
parameters[0] =
|
||||||
initPeopleFunction.replaceParameters(FunctionUpdateType.DYNAMIC_STORAGE_ALL_PARAMS,true, SourceType.USER_DEFINED, parameters);
|
new ParameterImpl("people", new PointerDataType(personStruct), currentProgram);
|
||||||
|
initPeopleFunction.replaceParameters(FunctionUpdateType.DYNAMIC_STORAGE_ALL_PARAMS, true,
|
||||||
|
SourceType.USER_DEFINED, parameters);
|
||||||
|
|
||||||
//use(Gadget *this, Person *person)
|
//use(Gadget *this, Person *person)
|
||||||
Function useFunction = getFunctionAt(toAddr(0x00411570));
|
Function useFunction = getFunctionAt(toAddr(0x00411570));
|
||||||
parameters = useFunction.getParameters();
|
parameters = useFunction.getParameters();
|
||||||
parameters[0] = new ParameterImpl("this", new PointerDataType(gadgetStruct), currentProgram);
|
parameters[0] =
|
||||||
parameters[1] = new ParameterImpl("person", new PointerDataType(personStruct), currentProgram);
|
new ParameterImpl("this", new PointerDataType(gadgetStruct), currentProgram);
|
||||||
useFunction.replaceParameters(FunctionUpdateType.DYNAMIC_STORAGE_ALL_PARAMS,true, SourceType.USER_DEFINED, parameters);
|
parameters[1] =
|
||||||
|
new ParameterImpl("person", new PointerDataType(personStruct), currentProgram);
|
||||||
|
useFunction.replaceParameters(FunctionUpdateType.DYNAMIC_STORAGE_ALL_PARAMS, true,
|
||||||
|
SourceType.USER_DEFINED, parameters);
|
||||||
|
|
||||||
//addPerson(Person ** list, char * name)
|
//addPerson(Person ** list, char * name)
|
||||||
Function addPersonFunction = getFunctionAt(toAddr(0x00411860));
|
Function addPersonFunction = getFunctionAt(toAddr(0x00411860));
|
||||||
parameters = addPersonFunction.getParameters();
|
parameters = addPersonFunction.getParameters();
|
||||||
parameters[0] = new ParameterImpl("list", new PointerDataType(new PointerDataType(personStruct)), currentProgram);
|
parameters[0] = new ParameterImpl("list",
|
||||||
parameters[1] = new ParameterImpl("name", new PointerDataType(new CharDataType()), currentProgram);
|
new PointerDataType(new PointerDataType(personStruct)), currentProgram);
|
||||||
addPersonFunction.replaceParameters(FunctionUpdateType.DYNAMIC_STORAGE_ALL_PARAMS,true, SourceType.USER_DEFINED, parameters);
|
parameters[1] =
|
||||||
|
new ParameterImpl("name", new PointerDataType(new CharDataType()), currentProgram);
|
||||||
|
addPersonFunction.replaceParameters(FunctionUpdateType.DYNAMIC_STORAGE_ALL_PARAMS, true,
|
||||||
|
SourceType.USER_DEFINED, parameters);
|
||||||
|
|
||||||
//addPeople(Person ** list)
|
//addPeople(Person ** list)
|
||||||
Function addPeopleFunction = getFunctionAt(toAddr(0x00411700));
|
Function addPeopleFunction = getFunctionAt(toAddr(0x00411700));
|
||||||
parameters = addPeopleFunction.getParameters();
|
parameters = addPeopleFunction.getParameters();
|
||||||
parameters[0] = new ParameterImpl("list", new PointerDataType(new PointerDataType(personStruct)), currentProgram);
|
parameters[0] = new ParameterImpl("list",
|
||||||
addPeopleFunction.replaceParameters(FunctionUpdateType.DYNAMIC_STORAGE_ALL_PARAMS,true, SourceType.USER_DEFINED, parameters);
|
new PointerDataType(new PointerDataType(personStruct)), currentProgram);
|
||||||
|
addPeopleFunction.replaceParameters(FunctionUpdateType.DYNAMIC_STORAGE_ALL_PARAMS, true,
|
||||||
|
SourceType.USER_DEFINED, parameters);
|
||||||
|
|
||||||
//print(Gadget * pGadget)
|
//print(Gadget * pGadget)
|
||||||
Function printFunction = getFunctionAt(toAddr(0x004115d0));
|
Function printFunction = getFunctionAt(toAddr(0x004115d0));
|
||||||
parameters = printFunction.getParameters();
|
parameters = printFunction.getParameters();
|
||||||
parameters[0] = new ParameterImpl("this", new PointerDataType(gadgetStruct), currentProgram);
|
parameters[0] =
|
||||||
printFunction.replaceParameters(FunctionUpdateType.DYNAMIC_STORAGE_ALL_PARAMS,true, SourceType.USER_DEFINED, parameters);
|
new ParameterImpl("this", new PointerDataType(gadgetStruct), currentProgram);
|
||||||
|
printFunction.replaceParameters(FunctionUpdateType.DYNAMIC_STORAGE_ALL_PARAMS, true,
|
||||||
|
SourceType.USER_DEFINED, parameters);
|
||||||
|
|
||||||
// Create labels for some of the functions
|
// Create labels for some of the functions
|
||||||
SymbolTable symbolTable = currentProgram.getSymbolTable();
|
SymbolTable symbolTable = currentProgram.getSymbolTable();
|
||||||
|
|
||||||
|
|
||||||
//create the Class "Gadget" to put most function symbols in
|
//create the Class "Gadget" to put most function symbols in
|
||||||
Namespace namespace = null;
|
Namespace namespace = null;
|
||||||
namespace = symbolTable.getNamespace("Gadget", null);
|
namespace = symbolTable.getNamespace("Gadget", null);
|
||||||
@@ -140,12 +144,17 @@ public class MarkupWallaceSrcScript extends GhidraScript {
|
|||||||
|
|
||||||
// Add comments
|
// Add comments
|
||||||
setPlateComment(toAddr(0x00411440), "This is the init method for the Gadget class");
|
setPlateComment(toAddr(0x00411440), "This is the init method for the Gadget class");
|
||||||
setPlateComment(toAddr(0x004115d0), "This method prints the status of a Person -- whether they are deployed or not and who they are deployed on. ");
|
setPlateComment(toAddr(0x004115d0),
|
||||||
setPlateComment(toAddr(0x00411700), "This function adds all the people to the Person list.");
|
"This method prints the status of a Person -- whether they are deployed or not and who they are deployed on. ");
|
||||||
setPlateComment(toAddr(0x004117c0), "This function initializes each person's record with whether or not they like cheese, their id, and a pointer to the next person.");
|
setPlateComment(toAddr(0x00411700),
|
||||||
|
"This function adds all the people to the Person list.");
|
||||||
|
setPlateComment(toAddr(0x004117c0),
|
||||||
|
"This function initializes each person's record with whether or not they like cheese, their id, and a pointer to the next person.");
|
||||||
setPlateComment(toAddr(0x00411860), "This function adds a person to the Person list.");
|
setPlateComment(toAddr(0x00411860), "This function adds a person to the Person list.");
|
||||||
setPlateComment(toAddr(0x004118f0), "This function checks to see if the person on the list is Wallace and if so, it deploys the Infrared Garden Gnome.");
|
setPlateComment(toAddr(0x004118f0),
|
||||||
setEOLComment(toAddr(0x004117e7), "Randomly assign whether each person likes cheese or not.");
|
"This function checks to see if the person on the list is Wallace and if so, it deploys the Infrared Garden Gnome.");
|
||||||
|
setEOLComment(toAddr(0x004117e7),
|
||||||
|
"Randomly assign whether each person likes cheese or not.");
|
||||||
}
|
}
|
||||||
|
|
||||||
void createNewLabel(Address address, String name, Namespace namespace, SourceType sourceType) {
|
void createNewLabel(Address address, String name, Namespace namespace, SourceType sourceType) {
|
||||||
@@ -153,10 +162,10 @@ public class MarkupWallaceSrcScript extends GhidraScript {
|
|||||||
if (getSymbolAt(address).getSource().equals(SourceType.DEFAULT)) {
|
if (getSymbolAt(address).getSource().equals(SourceType.DEFAULT)) {
|
||||||
try {
|
try {
|
||||||
symbolTable.createLabel(address, name, namespace, sourceType);
|
symbolTable.createLabel(address, name, namespace, sourceType);
|
||||||
} catch (InvalidInputException e) {
|
}
|
||||||
|
catch (InvalidInputException e) {
|
||||||
println("Invalid input to create label.");
|
println("Invalid input to create label.");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -16,7 +16,7 @@
|
|||||||
// This script displays data about Microsoft development tools (compilers, linkers, etc.)
|
// This script displays data about Microsoft development tools (compilers, linkers, etc.)
|
||||||
// used to build objects within program as stored in the Rich header and table.
|
// used to build objects within program as stored in the Rich header and table.
|
||||||
//
|
//
|
||||||
//@category Windows
|
//@category
|
||||||
//@keybinding
|
//@keybinding
|
||||||
//@menupath
|
//@menupath
|
||||||
//@toolbar
|
//@toolbar
|
||||||
@@ -81,7 +81,11 @@ public class PortableExecutableRichPrintScript extends GhidraScript {
|
|||||||
MSProductType prodType = prod == null ? MSProductType.Unknown : prod.getProductType();
|
MSProductType prodType = prod == null ? MSProductType.Unknown : prod.getProductType();
|
||||||
|
|
||||||
if (prodType != MSProductType.Unknown) {
|
if (prodType != MSProductType.Unknown) {
|
||||||
sb.append(prodType).append(" from ").append(prodVersion).append(", build ").append(
|
sb.append(prodType)
|
||||||
|
.append(" from ")
|
||||||
|
.append(prodVersion)
|
||||||
|
.append(", build ")
|
||||||
|
.append(
|
||||||
compid.getBuildNumber());
|
compid.getBuildNumber());
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
|||||||
@@ -14,7 +14,7 @@
|
|||||||
# limitations under the License.
|
# limitations under the License.
|
||||||
##
|
##
|
||||||
#Given a function, find all strings used within all called funtions.
|
#Given a function, find all strings used within all called funtions.
|
||||||
# @category: Strings
|
# @category: Functions
|
||||||
# @runtime Jython
|
# @runtime Jython
|
||||||
|
|
||||||
# Handles only functions, not subroutines, as of now. Hopefully this will change later
|
# Handles only functions, not subroutines, as of now. Hopefully this will change later
|
||||||
|
|||||||
@@ -14,7 +14,7 @@
|
|||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
// Reloads the language specification associated with a program at runtime.
|
// Reloads the language specification associated with a program at runtime.
|
||||||
// @category sleigh
|
// @category Sleigh
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
|
||||||
import ghidra.app.script.GhidraScript;
|
import ghidra.app.script.GhidraScript;
|
||||||
|
|||||||
@@ -14,7 +14,7 @@
|
|||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
//Script to allow repository admins the ability to terminate multiple file checkouts belonging to a single user.
|
//Script to allow repository admins the ability to terminate multiple file checkouts belonging to a single user.
|
||||||
//@category MultiUser
|
//@category Update
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
|
||||||
@@ -61,13 +61,15 @@ public class RemoveUserCheckoutsScript extends GhidraScript {
|
|||||||
}
|
}
|
||||||
if (!found) {
|
if (!found) {
|
||||||
if (OptionDialog.showYesNoDialogWithNoAsDefaultButton(null, "User Name Confirmation",
|
if (OptionDialog.showYesNoDialogWithNoAsDefaultButton(null, "User Name Confirmation",
|
||||||
"User '" + uname + "' not a registered server user.\nDo you still want to search for and remove checkouts for this user?") != OptionDialog.YES_OPTION) {
|
"User '" + uname +
|
||||||
|
"' not a registered server user.\nDo you still want to search for and remove checkouts for this user?") != OptionDialog.YES_OPTION) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (projectData.getFileCount() > 1000) {
|
if (projectData.getFileCount() > 1000) {
|
||||||
if (OptionDialog.showYesNoDialogWithNoAsDefaultButton(null, "Large Repository Confirmation",
|
if (OptionDialog.showYesNoDialogWithNoAsDefaultButton(null,
|
||||||
|
"Large Repository Confirmation",
|
||||||
"Repository contains a large number of failes and could be slow to search.\nDo you still want to search for and remove checkouts?") != OptionDialog.YES_OPTION) {
|
"Repository contains a large number of failes and could be slow to search.\nDo you still want to search for and remove checkouts?") != OptionDialog.YES_OPTION) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -85,7 +87,8 @@ public class RemoveUserCheckoutsScript extends GhidraScript {
|
|||||||
return folderPath + childName;
|
return folderPath + childName;
|
||||||
}
|
}
|
||||||
|
|
||||||
private int removeCheckouts(RepositoryAdapter repository, String folderPath, String uid, TaskMonitor monitor) throws IOException, CancelledException {
|
private int removeCheckouts(RepositoryAdapter repository, String folderPath, String uid,
|
||||||
|
TaskMonitor monitor) throws IOException, CancelledException {
|
||||||
int count = 0;
|
int count = 0;
|
||||||
for (RepositoryItem item : repository.getItemList(folderPath)) {
|
for (RepositoryItem item : repository.getItemList(folderPath)) {
|
||||||
monitor.checkCancelled();
|
monitor.checkCancelled();
|
||||||
@@ -97,15 +100,19 @@ public class RemoveUserCheckoutsScript extends GhidraScript {
|
|||||||
return count;
|
return count;
|
||||||
}
|
}
|
||||||
|
|
||||||
private int removeCheckouts(RepositoryAdapter repository, RepositoryItem item, String uid) throws IOException {
|
private int removeCheckouts(RepositoryAdapter repository, RepositoryItem item, String uid)
|
||||||
|
throws IOException {
|
||||||
int count = 0;
|
int count = 0;
|
||||||
ItemCheckoutStatus[] checkouts = repository.getCheckouts(item.getParentPath(), item.getName());
|
ItemCheckoutStatus[] checkouts =
|
||||||
|
repository.getCheckouts(item.getParentPath(), item.getName());
|
||||||
for (ItemCheckoutStatus checkout : checkouts) {
|
for (ItemCheckoutStatus checkout : checkouts) {
|
||||||
if (uid.equals(checkout.getUser())) {
|
if (uid.equals(checkout.getUser())) {
|
||||||
try {
|
try {
|
||||||
repository.terminateCheckout(item.getParentPath(), item.getName(), checkout.getCheckoutId(), false);
|
repository.terminateCheckout(item.getParentPath(), item.getName(),
|
||||||
|
checkout.getCheckoutId(), false);
|
||||||
++count;
|
++count;
|
||||||
} catch (IOException e) {
|
}
|
||||||
|
catch (IOException e) {
|
||||||
printerr("Failed to remove checkout: " + e.getMessage());
|
printerr("Failed to remove checkout: " + e.getMessage());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
/* ###
|
/* ###
|
||||||
* IP: GHIDRA
|
* IP: GHIDRA
|
||||||
* REVIEWED: YES
|
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@@ -25,12 +24,12 @@
|
|||||||
//
|
//
|
||||||
//@category Customer Submission.Search
|
//@category Customer Submission.Search
|
||||||
|
|
||||||
|
import java.util.Iterator;
|
||||||
|
|
||||||
import ghidra.app.script.GhidraScript;
|
import ghidra.app.script.GhidraScript;
|
||||||
import ghidra.program.model.data.DataTypeComponent;
|
import ghidra.program.model.data.DataTypeComponent;
|
||||||
import ghidra.program.model.data.Structure;
|
import ghidra.program.model.data.Structure;
|
||||||
|
|
||||||
import java.util.Iterator;
|
|
||||||
|
|
||||||
public class RenameStructMembers extends GhidraScript {
|
public class RenameStructMembers extends GhidraScript {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
/* ###
|
/* ###
|
||||||
* IP: GHIDRA
|
* IP: GHIDRA
|
||||||
* REVIEWED: YES
|
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@@ -23,9 +22,7 @@
|
|||||||
//@category Customer Submission.Search
|
//@category Customer Submission.Search
|
||||||
|
|
||||||
import ghidra.app.script.GhidraScript;
|
import ghidra.app.script.GhidraScript;
|
||||||
import ghidra.program.model.listing.Function;
|
import ghidra.program.model.listing.*;
|
||||||
import ghidra.program.model.listing.FunctionIterator;
|
|
||||||
import ghidra.program.model.listing.Variable;
|
|
||||||
import ghidra.program.model.symbol.SourceType;
|
import ghidra.program.model.symbol.SourceType;
|
||||||
|
|
||||||
public class RenameVariable extends GhidraScript {
|
public class RenameVariable extends GhidraScript {
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
/* ###
|
/* ###
|
||||||
* IP: GHIDRA
|
* IP: GHIDRA
|
||||||
* REVIEWED: YES
|
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@@ -19,7 +18,10 @@
|
|||||||
// Function Definition. This resolves variable size errors which
|
// Function Definition. This resolves variable size errors which
|
||||||
// result from this bad data state.
|
// result from this bad data state.
|
||||||
//
|
//
|
||||||
//@category Repair
|
//@category
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.Comparator;
|
||||||
|
|
||||||
import ghidra.app.script.GhidraScript;
|
import ghidra.app.script.GhidraScript;
|
||||||
import ghidra.program.model.address.Address;
|
import ghidra.program.model.address.Address;
|
||||||
import ghidra.program.model.data.*;
|
import ghidra.program.model.data.*;
|
||||||
@@ -28,9 +30,6 @@ import ghidra.program.model.symbol.SourceType;
|
|||||||
import ghidra.util.Msg;
|
import ghidra.util.Msg;
|
||||||
import ghidra.util.exception.InvalidInputException;
|
import ghidra.util.exception.InvalidInputException;
|
||||||
|
|
||||||
import java.util.Arrays;
|
|
||||||
import java.util.Comparator;
|
|
||||||
|
|
||||||
public class RepairFuncDefinitionUsageScript extends GhidraScript {
|
public class RepairFuncDefinitionUsageScript extends GhidraScript {
|
||||||
|
|
||||||
private static class MyVariableOffsetComparator implements Comparator<Variable> {
|
private static class MyVariableOffsetComparator implements Comparator<Variable> {
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
/* ###
|
/* ###
|
||||||
* IP: GHIDRA
|
* IP: GHIDRA
|
||||||
* REVIEWED: YES
|
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@@ -34,9 +33,7 @@
|
|||||||
|
|
||||||
import ghidra.app.script.GhidraScript;
|
import ghidra.app.script.GhidraScript;
|
||||||
import ghidra.program.model.address.Address;
|
import ghidra.program.model.address.Address;
|
||||||
import ghidra.program.model.listing.Function;
|
import ghidra.program.model.listing.*;
|
||||||
import ghidra.program.model.listing.FunctionIterator;
|
|
||||||
import ghidra.program.model.listing.Variable;
|
|
||||||
import ghidra.program.model.mem.MemoryBlock;
|
import ghidra.program.model.mem.MemoryBlock;
|
||||||
|
|
||||||
public class ReplaceInComments extends GhidraScript {
|
public class ReplaceInComments extends GhidraScript {
|
||||||
|
|||||||
@@ -18,7 +18,7 @@
|
|||||||
// the script will optionally list any existing checkouts prior to starting
|
// the script will optionally list any existing checkouts prior to starting
|
||||||
// the batch upgrade.
|
// the batch upgrade.
|
||||||
//
|
//
|
||||||
//@category Upgrade
|
//@category Program
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
|
||||||
import ghidra.app.script.GhidraScript;
|
import ghidra.app.script.GhidraScript;
|
||||||
|
|||||||
@@ -23,7 +23,7 @@
|
|||||||
# 2. The user has imported the file into Ghidra and the user has since deleted the file. This Ghidra script attempts to
|
# 2. The user has imported the file into Ghidra and the user has since deleted the file. This Ghidra script attempts to
|
||||||
# generate the original bytes of the imported file and asks the user to provide a filename to store the bytes. YARA then runs on that file.
|
# generate the original bytes of the imported file and asks the user to provide a filename to store the bytes. YARA then runs on that file.
|
||||||
|
|
||||||
#@category Memory.YARA
|
#@category Search.YARA
|
||||||
#@runtime Jython
|
#@runtime Jython
|
||||||
|
|
||||||
import os.path
|
import os.path
|
||||||
|
|||||||
@@ -56,10 +56,12 @@ public class SearchGuiSingle extends SearchBaseExtended {
|
|||||||
GroupLayout jPanel1Layout = new GroupLayout(jPanel1);
|
GroupLayout jPanel1Layout = new GroupLayout(jPanel1);
|
||||||
jPanel1.setLayout(jPanel1Layout);
|
jPanel1.setLayout(jPanel1Layout);
|
||||||
jPanel1Layout.setHorizontalGroup(
|
jPanel1Layout.setHorizontalGroup(
|
||||||
jPanel1Layout.createParallelGroup(GroupLayout.Alignment.LEADING).addGap(0, 100,
|
jPanel1Layout.createParallelGroup(GroupLayout.Alignment.LEADING)
|
||||||
|
.addGap(0, 100,
|
||||||
Short.MAX_VALUE));
|
Short.MAX_VALUE));
|
||||||
jPanel1Layout.setVerticalGroup(
|
jPanel1Layout.setVerticalGroup(
|
||||||
jPanel1Layout.createParallelGroup(GroupLayout.Alignment.LEADING).addGap(0, 100,
|
jPanel1Layout.createParallelGroup(GroupLayout.Alignment.LEADING)
|
||||||
|
.addGap(0, 100,
|
||||||
Short.MAX_VALUE));
|
Short.MAX_VALUE));
|
||||||
|
|
||||||
frame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
|
frame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
|
||||||
@@ -81,10 +83,15 @@ public class SearchGuiSingle extends SearchBaseExtended {
|
|||||||
.addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING) //
|
.addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING) //
|
||||||
.addGroup(layout.createSequentialGroup() //
|
.addGroup(layout.createSequentialGroup() //
|
||||||
.addContainerGap() //
|
.addContainerGap() //
|
||||||
.addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING) //
|
.addGroup(layout
|
||||||
.addGroup(layout.createParallelGroup(GroupLayout.Alignment.TRAILING) //
|
.createParallelGroup(GroupLayout.Alignment.LEADING) //
|
||||||
|
.addGroup(layout
|
||||||
|
.createParallelGroup(
|
||||||
|
GroupLayout.Alignment.TRAILING) //
|
||||||
.addComponent(opTwoCheckBox) //
|
.addComponent(opTwoCheckBox) //
|
||||||
.addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING) //
|
.addGroup(layout
|
||||||
|
.createParallelGroup(
|
||||||
|
GroupLayout.Alignment.LEADING) //
|
||||||
.addComponent(mnemonicCheckBox) //
|
.addComponent(mnemonicCheckBox) //
|
||||||
.addComponent(opOneCheckBox) //
|
.addComponent(opOneCheckBox) //
|
||||||
) //
|
) //
|
||||||
@@ -113,7 +120,8 @@ public class SearchGuiSingle extends SearchBaseExtended {
|
|||||||
.addComponent(opTwoCheckBox) //
|
.addComponent(opTwoCheckBox) //
|
||||||
.addPreferredGap(LayoutStyle.ComponentPlacement.UNRELATED) //
|
.addPreferredGap(LayoutStyle.ComponentPlacement.UNRELATED) //
|
||||||
.addComponent(constCheckBox) //
|
.addComponent(constCheckBox) //
|
||||||
.addGap(18, 18, 18).addComponent(searchButton) //
|
.addGap(18, 18, 18)
|
||||||
|
.addComponent(searchButton) //
|
||||||
.addContainerGap(27, Short.MAX_VALUE) //
|
.addContainerGap(27, Short.MAX_VALUE) //
|
||||||
) //
|
) //
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -15,7 +15,7 @@
|
|||||||
*/
|
*/
|
||||||
//Creates a selection in the current program consisting of the sum
|
//Creates a selection in the current program consisting of the sum
|
||||||
//of all function bodies.
|
//of all function bodies.
|
||||||
//@category Selection
|
//@category
|
||||||
|
|
||||||
import ghidra.app.script.GhidraScript;
|
import ghidra.app.script.GhidraScript;
|
||||||
import ghidra.program.model.address.AddressSet;
|
import ghidra.program.model.address.AddressSet;
|
||||||
|
|||||||
@@ -28,7 +28,6 @@ import ghidra.program.model.sourcemap.SourceMapEntry;
|
|||||||
import ghidra.program.model.sourcemap.SourceMapEntryIterator;
|
import ghidra.program.model.sourcemap.SourceMapEntryIterator;
|
||||||
import ghidra.util.datastruct.Counter;
|
import ghidra.util.datastruct.Counter;
|
||||||
|
|
||||||
|
|
||||||
public class ShowSourceMapEntryStartsScript extends GhidraScript {
|
public class ShowSourceMapEntryStartsScript extends GhidraScript {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -14,7 +14,7 @@
|
|||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
//Example skeleton script that iterates over all strings and sets the translation value for each
|
//Example skeleton script that iterates over all strings and sets the translation value for each
|
||||||
//@category Strings
|
//@category Data Types
|
||||||
|
|
||||||
import ghidra.app.script.GhidraScript;
|
import ghidra.app.script.GhidraScript;
|
||||||
import ghidra.program.model.data.StringDataInstance;
|
import ghidra.program.model.data.StringDataInstance;
|
||||||
|
|||||||
@@ -14,13 +14,10 @@
|
|||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
//XOR's the memory of the current program.
|
//XOR's the memory of the current program.
|
||||||
//@category Memory
|
//@category Analysis
|
||||||
|
|
||||||
import ghidra.app.script.GhidraScript;
|
import ghidra.app.script.GhidraScript;
|
||||||
import ghidra.program.model.address.Address;
|
import ghidra.program.model.address.*;
|
||||||
import ghidra.program.model.address.AddressIterator;
|
|
||||||
import ghidra.program.model.address.AddressSet;
|
|
||||||
import ghidra.program.model.address.AddressSetView;
|
|
||||||
import ghidra.program.model.mem.Memory;
|
import ghidra.program.model.mem.Memory;
|
||||||
import ghidra.program.model.mem.MemoryBlock;
|
import ghidra.program.model.mem.MemoryBlock;
|
||||||
|
|
||||||
|
|||||||
@@ -60,7 +60,8 @@ public class ZapBCTRScript extends GhidraScript {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// first try input as class and search for symbol "<class>::__vtbl"
|
// first try input as class and search for symbol "<class>::__vtbl"
|
||||||
List<Symbol> symbols = currentProgram.getSymbolTable().getSymbols("__vtbl",
|
List<Symbol> symbols = currentProgram.getSymbolTable()
|
||||||
|
.getSymbols("__vtbl",
|
||||||
getNamespace(null, classNameOrAddr));
|
getNamespace(null, classNameOrAddr));
|
||||||
// if symbol found, then vtblAddr is the symbol's address
|
// if symbol found, then vtblAddr is the symbol's address
|
||||||
if (symbols.size() == 1) {
|
if (symbols.size() == 1) {
|
||||||
@@ -100,7 +101,8 @@ public class ZapBCTRScript extends GhidraScript {
|
|||||||
// insert funcName as EOL comment and
|
// insert funcName as EOL comment and
|
||||||
// add a mnemonic ref from instAddr to funcAddr
|
// add a mnemonic ref from instAddr to funcAddr
|
||||||
listing.setComment(instAddr, CommentType.EOL, funcName);
|
listing.setComment(instAddr, CommentType.EOL, funcName);
|
||||||
listing.getInstructionAt(instAddr).addMnemonicReference(funcAddr, RefType.COMPUTED_CALL,
|
listing.getInstructionAt(instAddr)
|
||||||
|
.addMnemonicReference(funcAddr, RefType.COMPUTED_CALL,
|
||||||
SourceType.USER_DEFINED);
|
SourceType.USER_DEFINED);
|
||||||
|
|
||||||
/* old code that replaces the 'bctr' with a 'bl'
|
/* old code that replaces the 'bctr' with a 'bl'
|
||||||
|
|||||||
@@ -14,7 +14,7 @@
|
|||||||
# limitations under the License.
|
# limitations under the License.
|
||||||
##
|
##
|
||||||
# Sets up IOPORT IN/OUT references for the Program
|
# Sets up IOPORT IN/OUT references for the Program
|
||||||
#@category Instructions
|
#@category
|
||||||
#@runtime Jython
|
#@runtime Jython
|
||||||
# Before running this script, you should have created an OVERLAY memory
|
# Before running this script, you should have created an OVERLAY memory
|
||||||
# space called IOMEM, starting at address 0, size 0x10000.
|
# space called IOMEM, starting at address 0, size 0x10000.
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user