mirror of
https://github.com/NationalSecurityAgency/ghidra.git
synced 2025-10-03 17:59:46 +02:00
GP-0: Adding a missing commit (cosmetic changes)
This commit is contained in:
parent
04bb0fa5a7
commit
a1b6084c88
5 changed files with 24 additions and 137 deletions
|
@ -16,70 +16,27 @@
|
||||||
//Decompile the function at the cursor and its callees, then output facts files corresponding to the pcodes
|
//Decompile the function at the cursor and its callees, then output facts files corresponding to the pcodes
|
||||||
//@category PCode
|
//@category PCode
|
||||||
|
|
||||||
import java.io.BufferedWriter;
|
import java.io.*;
|
||||||
import java.io.File;
|
import java.lang.Enum;
|
||||||
import java.io.FileWriter;
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.io.Writer;
|
|
||||||
import java.math.BigInteger;
|
import java.math.BigInteger;
|
||||||
import java.util.ArrayList;
|
import java.util.*;
|
||||||
import java.util.Arrays;
|
import java.util.concurrent.*;
|
||||||
import java.util.Collection;
|
|
||||||
import java.util.Collections;
|
|
||||||
import java.util.EnumMap;
|
|
||||||
import java.util.EnumSet;
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.HashSet;
|
|
||||||
import java.util.Iterator;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.concurrent.ConcurrentHashMap;
|
|
||||||
import java.util.concurrent.atomic.AtomicInteger;
|
import java.util.concurrent.atomic.AtomicInteger;
|
||||||
import java.util.Set;
|
|
||||||
import java.util.concurrent.ExecutorService;
|
|
||||||
import java.util.concurrent.Executors;
|
|
||||||
import java.util.concurrent.TimeUnit;
|
|
||||||
|
|
||||||
import ghidra.app.decompiler.DecompInterface;
|
import ghidra.app.decompiler.*;
|
||||||
import ghidra.app.decompiler.DecompileOptions;
|
import ghidra.app.decompiler.parallel.*;
|
||||||
import ghidra.app.decompiler.DecompileResults;
|
|
||||||
import ghidra.app.decompiler.parallel.DecompileConfigurer;
|
|
||||||
import ghidra.app.decompiler.parallel.DecompilerCallback;
|
|
||||||
import ghidra.app.decompiler.parallel.ParallelDecompiler;
|
|
||||||
import ghidra.app.script.GhidraScript;
|
import ghidra.app.script.GhidraScript;
|
||||||
import ghidra.framework.plugintool.PluginTool;
|
import ghidra.framework.plugintool.PluginTool;
|
||||||
import ghidra.graph.GDirectedGraph;
|
import ghidra.graph.*;
|
||||||
import ghidra.graph.GEdge;
|
|
||||||
import ghidra.graph.GVertex;
|
|
||||||
import ghidra.graph.GraphFactory;
|
|
||||||
import ghidra.graph.algo.DepthFirstSorter;
|
import ghidra.graph.algo.DepthFirstSorter;
|
||||||
import ghidra.program.database.symbol.FunctionSymbol;
|
import ghidra.program.database.symbol.FunctionSymbol;
|
||||||
import ghidra.program.model.address.Address;
|
import ghidra.program.model.address.Address;
|
||||||
import ghidra.program.model.address.AddressFactory;
|
import ghidra.program.model.address.AddressFactory;
|
||||||
import ghidra.program.model.data.AbstractFloatDataType;
|
import ghidra.program.model.data.*;
|
||||||
import ghidra.program.model.data.AbstractIntegerDataType;
|
import ghidra.program.model.listing.*;
|
||||||
import ghidra.program.model.data.Array;
|
|
||||||
import ghidra.program.model.data.BooleanDataType;
|
|
||||||
import ghidra.program.model.data.DataType;
|
|
||||||
import ghidra.program.model.data.DataTypeComponent;
|
|
||||||
import ghidra.program.model.data.FunctionDefinition;
|
|
||||||
import ghidra.program.model.data.ParameterDefinition;
|
|
||||||
import ghidra.program.model.data.Pointer;
|
|
||||||
import ghidra.program.model.data.Structure;
|
|
||||||
import ghidra.program.model.data.TypeDef;
|
|
||||||
import ghidra.program.model.data.Union;
|
|
||||||
import ghidra.program.model.listing.Data;
|
|
||||||
import ghidra.program.model.listing.DataIterator;
|
|
||||||
import ghidra.program.model.listing.Function;
|
|
||||||
import ghidra.program.model.listing.Program;
|
|
||||||
import ghidra.program.model.mem.MemoryAccessException;
|
import ghidra.program.model.mem.MemoryAccessException;
|
||||||
import ghidra.program.model.pcode.*;
|
import ghidra.program.model.pcode.*;
|
||||||
import ghidra.program.model.symbol.ExternalReference;
|
import ghidra.program.model.symbol.*;
|
||||||
import ghidra.program.model.symbol.Reference;
|
|
||||||
import ghidra.program.model.symbol.Symbol;
|
|
||||||
import ghidra.program.model.symbol.SymbolIterator;
|
|
||||||
import ghidra.program.model.symbol.SymbolTable;
|
|
||||||
import ghidra.program.model.symbol.ThunkReference;
|
|
||||||
import ghidra.util.task.TaskMonitor;
|
import ghidra.util.task.TaskMonitor;
|
||||||
|
|
||||||
class PcodeBlockBasicVertex implements GVertex {
|
class PcodeBlockBasicVertex implements GVertex {
|
||||||
|
@ -366,7 +323,7 @@ class HighFunctionExporter {
|
||||||
varnodes = new HashSet<String>();
|
varnodes = new HashSet<String>();
|
||||||
extraGlobals = new HashMap<HighVariable, VarnodeAST>();
|
extraGlobals = new HashMap<HighVariable, VarnodeAST>();
|
||||||
|
|
||||||
// TODO: This should only be done once if dumping the entire program
|
// NOTE: This should only be done once if dumping the entire program
|
||||||
SymbolIterator externalSymbols = f.getProgram().getSymbolTable().getSymbols(f.getName());
|
SymbolIterator externalSymbols = f.getProgram().getSymbolTable().getSymbols(f.getName());
|
||||||
while (externalSymbols.hasNext()) {
|
while (externalSymbols.hasNext()) {
|
||||||
Symbol next = externalSymbols.next();
|
Symbol next = externalSymbols.next();
|
||||||
|
@ -434,8 +391,6 @@ class HighFunctionExporter {
|
||||||
}
|
}
|
||||||
|
|
||||||
private BigInteger readInteger(Program program, Address addr, int size) {
|
private BigInteger readInteger(Program program, Address addr, int size) {
|
||||||
//AddressFactory addrFactory = program.getAddressFactory();
|
|
||||||
//int spaceID = addr.getAddressSpace().getSpaceID();
|
|
||||||
try {
|
try {
|
||||||
byte[] dest = new byte[size];
|
byte[] dest = new byte[size];
|
||||||
program.getMemory().getBytes(addr, dest, 0, size);
|
program.getMemory().getBytes(addr, dest, 0, size);
|
||||||
|
@ -524,15 +479,6 @@ class HighFunctionExporter {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// private void initializeSet(SymbolTable table) {
|
|
||||||
// vtables.clear();
|
|
||||||
// SymbolIterator iter = table.getSymbols("vtable");
|
|
||||||
// while (iter.hasNext()) {
|
|
||||||
// Symbol sym2 = iter.next();
|
|
||||||
// vtables.add(sym2.getAddress());
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
|
|
||||||
private HighFunction getHighFunction(DecompileResults res, Function func, DecompInterface decompiler) {
|
private HighFunction getHighFunction(DecompileResults res, Function func, DecompInterface decompiler) {
|
||||||
HighFunction high = res.getHighFunction();
|
HighFunction high = res.getHighFunction();
|
||||||
if (high == null) {
|
if (high == null) {
|
||||||
|
@ -701,10 +647,6 @@ class HighFunctionExporter {
|
||||||
if (hv.getSymbol() != null) {
|
if (hv.getSymbol() != null) {
|
||||||
String hsid = hsID(hfn, hv.getSymbol());
|
String hsid = hsID(hfn, hv.getSymbol());
|
||||||
export(PredicateFile.SYMBOL_HVAR, hsid, hvarID(hfn, hv));
|
export(PredicateFile.SYMBOL_HVAR, hsid, hvarID(hfn, hv));
|
||||||
// HighSymbol hs = hv.getSymbol();
|
|
||||||
// if (hs != null) {
|
|
||||||
// export(PredicateFile.HVAR_NAME, id, hs.getName());
|
|
||||||
// }
|
|
||||||
}
|
}
|
||||||
if (!dontDescend) {
|
if (!dontDescend) {
|
||||||
VarnodeAST representative = (VarnodeAST) hv.getRepresentative();
|
VarnodeAST representative = (VarnodeAST) hv.getRepresentative();
|
||||||
|
@ -1060,50 +1002,6 @@ class HighFunctionExporter {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//class ResultWriter implements Runnable {
|
|
||||||
// BlockingQueue<DecompileResults> q = new ArrayBlockingQueue<>(50);
|
|
||||||
//
|
|
||||||
// HighFunctionExporter ex;
|
|
||||||
// DecompilerConfigurer configurer;
|
|
||||||
//
|
|
||||||
// boolean shutDown = false;
|
|
||||||
//
|
|
||||||
// private TaskMonitor monitor;
|
|
||||||
//
|
|
||||||
// public ResultWriter(HighFunctionExporter ex, DecompilerConfigurer configurer, TaskMonitor tMonitor) {
|
|
||||||
// this.ex = ex;
|
|
||||||
// this.configurer = configurer;
|
|
||||||
// this.monitor = tMonitor;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// BlockingQueue<DecompileResults> getQueue() {
|
|
||||||
// return q;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// @Override
|
|
||||||
// public void run() {
|
|
||||||
// try {
|
|
||||||
// int count = 0;
|
|
||||||
// while(!(shutDown && q.isEmpty())){
|
|
||||||
// monitor.checkCancelled();
|
|
||||||
// DecompileResults results = q.take();
|
|
||||||
//
|
|
||||||
// ex.processFunction(results, results.getFunction(), configurer.getInteface());
|
|
||||||
//
|
|
||||||
// count++;
|
|
||||||
// if (count > 50) {
|
|
||||||
// ex.writeFacts();
|
|
||||||
// count = 0;
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// } catch (InterruptedException | IOException | CancelledException e) {}
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// public void done() {
|
|
||||||
// shutDown = true;
|
|
||||||
// }
|
|
||||||
//}
|
|
||||||
|
|
||||||
public class ExportPCodeForCTADL extends GhidraScript {
|
public class ExportPCodeForCTADL extends GhidraScript {
|
||||||
|
|
||||||
File outputDirectory;
|
File outputDirectory;
|
||||||
|
|
|
@ -29,7 +29,7 @@ import sarif.SarifUtils;
|
||||||
public record TaintQueryResult(String name,String fqname, Address iaddr, Address faddr, List<String> labels, boolean functionLevelResult) {
|
public record TaintQueryResult(String name,String fqname, Address iaddr, Address faddr, List<String> labels, boolean functionLevelResult) {
|
||||||
|
|
||||||
// NB: The constructors that follow depend on data generated at different phases in the processing.
|
// NB: The constructors that follow depend on data generated at different phases in the processing.
|
||||||
// At first blush, it seems obvious that you could combine then by using the location data, accessed
|
// At first blush, it seems obvious that you could combine them by using the location data, accessed
|
||||||
// in the first to derive the LogicalLocation via llocs in SarifUtils. llocs, however, is likely to
|
// in the first to derive the LogicalLocation via llocs in SarifUtils. llocs, however, is likely to
|
||||||
// be stale when applying the SARIF results.
|
// be stale when applying the SARIF results.
|
||||||
|
|
||||||
|
|
|
@ -52,12 +52,9 @@ public class CTADLTaintState extends AbstractTaintState {
|
||||||
if (!direction.equals(TaintDirection.DEFAULT)) {
|
if (!direction.equals(TaintDirection.DEFAULT)) {
|
||||||
paramList.add("--compute-slices");
|
paramList.add("--compute-slices");
|
||||||
switch (taintOptions.getTaintDirection()) {
|
switch (taintOptions.getTaintDirection()) {
|
||||||
case TaintDirection.BOTH ->
|
case TaintDirection.BOTH -> paramList.add("all");
|
||||||
paramList.add("all");
|
case TaintDirection.FORWARD -> paramList.add("fwd");
|
||||||
case TaintDirection.FORWARD ->
|
case TaintDirection.BACKWARD -> paramList.add("bwd");
|
||||||
paramList.add("fwd");
|
|
||||||
case TaintDirection.BACKWARD ->
|
|
||||||
paramList.add("bwd");
|
|
||||||
default -> {
|
default -> {
|
||||||
// No action
|
// No action
|
||||||
}
|
}
|
||||||
|
@ -106,7 +103,6 @@ public class CTADLTaintState extends AbstractTaintState {
|
||||||
return perFunction ? "ExportPCodeForSingleFunction.java" : "ExportPCodeForCTADL.java";
|
return perFunction ? "ExportPCodeForSingleFunction.java" : "ExportPCodeForCTADL.java";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void writeHeader(PrintWriter writer) {
|
protected void writeHeader(PrintWriter writer) {
|
||||||
writer.println("#include \"pcode/taintquery.dl\"");
|
writer.println("#include \"pcode/taintquery.dl\"");
|
||||||
|
@ -162,7 +158,8 @@ public class CTADLTaintState extends AbstractTaintState {
|
||||||
writer.println("\tVNODE_HVAR(vn, hv));");
|
writer.println("\tVNODE_HVAR(vn, hv));");
|
||||||
writer.println("\tCVar_SourceInfo(vn, SOURCE_INFO_NAME_KEY, \"" +
|
writer.println("\tCVar_SourceInfo(vn, SOURCE_INFO_NAME_KEY, \"" +
|
||||||
TaintState.varName(token, false) + "\")),");
|
TaintState.varName(token, false) + "\")),");
|
||||||
} else if (mark.bySymbol()) {
|
}
|
||||||
|
else if (mark.bySymbol()) {
|
||||||
writer.println("\tSYMBOL_NAME(sym, \"" + token.getText() + "\"),");
|
writer.println("\tSYMBOL_NAME(sym, \"" + token.getText() + "\"),");
|
||||||
writer.println("\tSYMBOL_HVAR(sym, hv),");
|
writer.println("\tSYMBOL_HVAR(sym, hv),");
|
||||||
writer.println("\tVNODE_HVAR(vn, hv),");
|
writer.println("\tVNODE_HVAR(vn, hv),");
|
||||||
|
@ -191,7 +188,7 @@ public class CTADLTaintState extends AbstractTaintState {
|
||||||
Boolean allAccess = taintOptions.getTaintUseAllAccess();
|
Boolean allAccess = taintOptions.getTaintUseAllAccess();
|
||||||
String method = "TaintSanitizeAll";
|
String method = "TaintSanitizeAll";
|
||||||
Address addr = mark.getAddress();
|
Address addr = mark.getAddress();
|
||||||
// TODO: verify setting entryPoint as addr doesn't break things
|
// NOTE: verify setting entryPoint as addr doesn't break things
|
||||||
|
|
||||||
if (mark.getFunctionName() == null) {
|
if (mark.getFunctionName() == null) {
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -120,10 +120,6 @@ public class SarifTaintResultHandler extends SarifResultHandler {
|
||||||
map.put("entry", faddr);
|
map.put("entry", faddr);
|
||||||
map.put("Address", faddr);
|
map.put("Address", faddr);
|
||||||
}
|
}
|
||||||
// Address addr = SarifUtils.getLocAddress(program, fqname);
|
|
||||||
// if (addr != null) {
|
|
||||||
// map.put("Address", addr);
|
|
||||||
// }
|
|
||||||
map.put("location", fqname);
|
map.put("location", fqname);
|
||||||
map.put("kind", ll.getKind());
|
map.put("kind", ll.getKind());
|
||||||
map.put("function", SarifUtils.extractFQNameFunction(fqname));
|
map.put("function", SarifUtils.extractFQNameFunction(fqname));
|
||||||
|
|
|
@ -202,11 +202,10 @@ public class DecompilerTaintTest extends AbstractGhidraHeadedIntegrationTest {
|
||||||
|
|
||||||
private void validateResult(ClangToken token, Map<Address, Set<TaintQueryResult>> map) {
|
private void validateResult(ClangToken token, Map<Address, Set<TaintQueryResult>> map) {
|
||||||
Set<TaintQueryResult> set = map.get(functionAddr);
|
Set<TaintQueryResult> set = map.get(functionAddr);
|
||||||
//System.err.println("VALIDATE: "+functionAddr);
|
|
||||||
if (set != null) {
|
if (set != null) {
|
||||||
int sz = taintService.getProvider().getTokenCount();
|
int sz = taintService.getProvider().getTokenCount();
|
||||||
//assertEquals(testSizes[testIndex], sz);
|
assertEquals(testSizes[testIndex], sz);
|
||||||
System.err.println(testSizes[testIndex] + " vs " + sz);
|
//System.err.println(testSizes[testIndex] + " vs " + sz);
|
||||||
}
|
}
|
||||||
//else {
|
//else {
|
||||||
// System.err.println("NULL for "+functionAddr);
|
// System.err.println("NULL for "+functionAddr);
|
||||||
|
@ -280,9 +279,6 @@ public class DecompilerTaintTest extends AbstractGhidraHeadedIntegrationTest {
|
||||||
indexTask.addTaskListener(listener);
|
indexTask.addTaskListener(listener);
|
||||||
new TaskLauncher(indexTask, tool.getActiveWindow());
|
new TaskLauncher(indexTask, tool.getActiveWindow());
|
||||||
waitForBusyTool(tool);
|
waitForBusyTool(tool);
|
||||||
// while (listener.executing) {
|
|
||||||
// Thread.sleep(100);
|
|
||||||
// }
|
|
||||||
|
|
||||||
for (String f : functionLabels) {
|
for (String f : functionLabels) {
|
||||||
decompilerProvider = taintService.getDecompilerProvider();
|
decompilerProvider = taintService.getDecompilerProvider();
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue