Summarize unrecognized types in EnhancedImport

Helps a little to debug things.
This commit is contained in:
KeybadeBlox 2026-03-20 20:10:16 -04:00
parent 98d88cc212
commit 69d5bd1dbe

View file

@ -22,23 +22,25 @@ import ghidra.util.StringUtilities;
import java.nio.file.Files; import java.nio.file.Files;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections; import java.util.Collections;
import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Optional; import java.util.Optional;
import java.util.Set;
public class EnhancedImport extends GhidraScript { public class EnhancedImport extends GhidraScript {
@Override @Override
public void run() throws Exception { public void run() throws Exception {
final List<String> lines = Files.readAllLines(askFile("Select input file", "OK").toPath()); final List<String> lines = Files.readAllLines(askFile("Select input file", "OK").toPath());
final Set<String> unknownTypes = new HashSet<>(256);
for (int i = 0; i < lines.size(); i++) { for (int i = 0; i < lines.size(); i++) {
final String[] parts = lines.get(i).split("\t");; final String[] parts = lines.get(i).split("\t");;
final Address addr = toAddr(parts[0]); final Address addr = toAddr(parts[0]);
switch (parts[1]) { switch (parts[1]) {
case "data": importData(addr, parts); break; case "data": importData(addr, parts, unknownTypes); break;
case "func": importFunc(addr, parts); break; case "func": importFunc(addr, parts, unknownTypes); break;
default: throw new Exception( default: throw new Exception(
"Symbol type \"" + parts[1] + "Symbol type \"" + parts[1] +
"\" on line " + String.valueOf(i) + "\" on line " + String.valueOf(i) +
@ -46,11 +48,18 @@ public class EnhancedImport extends GhidraScript {
); );
} }
} }
if (unknownTypes.size() > 0)
println(
"\nWarning: following types were unrecognized:\n" +
String.join(", ", unknownTypes)
);
} }
private void importData( private void importData(
final Address addr, final Address addr,
final String[] parts final String[] parts,
final Set<String> unknownTypes
) throws Exception { ) throws Exception {
print("Importing data symbol \"" + parts[3] + "\"..."); print("Importing data symbol \"" + parts[3] + "\"...");
@ -66,7 +75,7 @@ public class EnhancedImport extends GhidraScript {
)); ));
// Create data // Create data
if (makeType(parts[2]).orElse(null) instanceof DataType t) { if (makeType(parts[2], unknownTypes).orElse(null) instanceof DataType t) {
clearListing(addr, addr.add(Math.max(t.getLength(), 1) - 1)); clearListing(addr, addr.add(Math.max(t.getLength(), 1) - 1));
currentProgram.getListing().createData(addr, t); currentProgram.getListing().createData(addr, t);
@ -97,7 +106,10 @@ public class EnhancedImport extends GhidraScript {
) : null; ) : null;
} }
private Optional<DataType> makeType(final String type) throws Exception { private Optional<DataType> makeType(
final String type,
final Set<String> unknownTypes
) throws Exception {
/* Attempt to create the described type from a known base type */ /* Attempt to create the described type from a known base type */
final String baseName = StringUtilities.findWord(type, 0); final String baseName = StringUtilities.findWord(type, 0);
final List<DataType> foundTypes = state.getTool() final List<DataType> foundTypes = state.getTool()
@ -105,6 +117,7 @@ public class EnhancedImport extends GhidraScript {
.findDataTypes(baseName, null); .findDataTypes(baseName, null);
if (foundTypes.size() == 0) { if (foundTypes.size() == 0) {
print(" can't find data type \"" + baseName + "\","); print(" can't find data type \"" + baseName + "\",");
unknownTypes.add(type);
return Optional.empty(); return Optional.empty();
} }
@ -156,16 +169,19 @@ public class EnhancedImport extends GhidraScript {
} }
private void importFunc( private void importFunc(
final Address addr, final Address addr,
final String[] parts final String[] parts,
final Set<String> unknownTypes
) throws Exception { ) throws Exception {
print("Importing function symbol \"" + parts[6] + "\"..."); print("Importing function symbol \"" + parts[6] + "\"...");
final Function f = Optional.ofNullable(getFunctionAt(addr)) final Function f = Optional.ofNullable(getFunctionAt(addr))
.orElse(createFunction(addr, parts[6])); .orElse(createFunction(addr, parts[6]));
if (makeType(parts[2]).orElse(null) instanceof DataType t) f.setReturnType(
f.setReturnType(t, SourceType.USER_DEFINED); makeType(parts[2], unknownTypes).orElse(Undefined4DataType.dataType),
SourceType.USER_DEFINED
);
f.setInline(parts[4].equals("inline")); f.setInline(parts[4].equals("inline"));
f.setCallFixup(parts[5].equals("nofixup") ? null : parts[5]); f.setCallFixup(parts[5].equals("nofixup") ? null : parts[5]);
f.setName(unqualified(parts[6]), SourceType.USER_DEFINED); f.setName(unqualified(parts[6]), SourceType.USER_DEFINED);
@ -176,7 +192,7 @@ public class EnhancedImport extends GhidraScript {
for (int i = 7; i < parts.length - 1; i += 2) for (int i = 7; i < parts.length - 1; i += 2)
args.add(new ParameterImpl( args.add(new ParameterImpl(
parts[i+1], parts[i+1],
makeType(parts[i]).orElse(Undefined4DataType.dataType), makeType(parts[i], unknownTypes).orElse(Undefined4DataType.dataType),
currentProgram currentProgram
)); ));