From 3ec43cc1dedff46d1c28e1d37e0f19510951bf3f Mon Sep 17 00:00:00 2001 From: Ryan Kurtz Date: Thu, 28 Sep 2023 07:05:18 -0400 Subject: [PATCH 1/2] GP-3885: GNU demangler now parses the original mangled string, fixing an issue with demangling thunks --- .../main/java/ghidra/app/util/demangler/gnu/GnuDemangler.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Ghidra/Features/GnuDemangler/src/main/java/ghidra/app/util/demangler/gnu/GnuDemangler.java b/Ghidra/Features/GnuDemangler/src/main/java/ghidra/app/util/demangler/gnu/GnuDemangler.java index 0298e76bc7..26f8c47551 100644 --- a/Ghidra/Features/GnuDemangler/src/main/java/ghidra/app/util/demangler/gnu/GnuDemangler.java +++ b/Ghidra/Features/GnuDemangler/src/main/java/ghidra/app/util/demangler/gnu/GnuDemangler.java @@ -112,7 +112,8 @@ public class GnuDemangler implements Demangler { } boolean onlyKnownPatterns = options.demangleOnlyKnownPatterns(); - DemangledObject demangledObject = parse(mangled, process, demangled, onlyKnownPatterns); + DemangledObject demangledObject = + parse(originalMangled, process, demangled, onlyKnownPatterns); if (demangledObject == null) { return demangledObject; } From 6769e73c1d1bc31e3dc164cc5534225fe3ce502f Mon Sep 17 00:00:00 2001 From: dragonmacher <48328597+dragonmacher@users.noreply.github.com> Date: Thu, 28 Sep 2023 20:25:31 -0400 Subject: [PATCH 2/2] Minor clarifications to demangled object fields --- .../util/demangler/DemangledAddressTable.java | 2 +- .../app/util/demangler/DemangledObject.java | 42 +++++++++++++++++-- .../app/util/demangler/DemangledUnknown.java | 2 +- .../app/util/demangler/DemangledVariable.java | 2 +- .../app/util/demangler/gnu/GnuDemangler.java | 8 ++-- .../demangler/gnu/GnuDemanglerParser.java | 4 +- 6 files changed, 48 insertions(+), 12 deletions(-) diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/util/demangler/DemangledAddressTable.java b/Ghidra/Features/Base/src/main/java/ghidra/app/util/demangler/DemangledAddressTable.java index b63a923c56..1a48517322 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/util/demangler/DemangledAddressTable.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/util/demangler/DemangledAddressTable.java @@ -35,7 +35,7 @@ public class DemangledAddressTable extends DemangledObject { * @param mangled the source mangled string * @param originalDemangled the original demangled string * @param name the name of the address table - * @param calculateLength true if the length of this address table should be calculdated at + * @param calculateLength true if the length of this address table should be calculated at * analysis time */ public DemangledAddressTable(String mangled, String originalDemangled, String name, diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/util/demangler/DemangledObject.java b/Ghidra/Features/Base/src/main/java/ghidra/app/util/demangler/DemangledObject.java index b7ad71907a..f0951ab1a4 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/util/demangler/DemangledObject.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/util/demangler/DemangledObject.java @@ -41,8 +41,45 @@ public abstract class DemangledObject implements Demangled { protected static final String NAMESPACE_SEPARATOR = Namespace.DELIMITER; protected static final String EMPTY_STRING = ""; + /* + The following names probably need to be refactored. Until then, this is how the following + fields are used. + + mangled - + Source: The original mangled string as seen in the program + Usage: Can be used to see if a program symbol has already been demangled + + originalDemangled - + Source: The raw demangled string returned from the demangler + Usage: for display + + demangledName - + Source: The name as created by the parser which may transform or even replace the + string returned from the demangler + Usage: for display + + name - + Source: This is derived from the 'demangledName' This is updated to be suitable + for use as a symbol name. This may be null while building, but is + expected to be non-null when applyTo() is called + Usage: The name that will be applied when applyTo() is called. + + + + Future: These variables should be refactored and renamed to be clearer and more cohesive, + something like: + + mangled + rawDemangled + escapedDemangled + symbolName + + */ protected final String mangled; // original mangled string - protected final String originalDemangled; + protected final String originalDemangled; // raw demangled string + private String demangledName; // updated demangled string + private String name; // version of demangled name suitable for symbols + protected String specialPrefix; protected Demangled namespace; protected String visibility;//public, protected, etc. @@ -56,8 +93,7 @@ public abstract class DemangledObject implements Demangled { //TODO: determine what type of keyword this is (not type qualifier or storage class). protected boolean isVirtual; - private String demangledName; - private String name; + private boolean isConst; private boolean isVolatile; private boolean isPointer64; diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/util/demangler/DemangledUnknown.java b/Ghidra/Features/Base/src/main/java/ghidra/app/util/demangler/DemangledUnknown.java index e630bb45ca..88f01d7c14 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/util/demangler/DemangledUnknown.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/util/demangler/DemangledUnknown.java @@ -40,7 +40,7 @@ public class DemangledUnknown extends DemangledObject { public String getName() { //These items likely do not have names or data types, so return the signature. String myName = super.getName(); - if (!myName.isEmpty()) { + if (myName != null && !myName.isEmpty()) { return myName; } diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/util/demangler/DemangledVariable.java b/Ghidra/Features/Base/src/main/java/ghidra/app/util/demangler/DemangledVariable.java index c589faae8b..69efc65f8e 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/util/demangler/DemangledVariable.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/util/demangler/DemangledVariable.java @@ -260,7 +260,7 @@ public class DemangledVariable extends DemangledObject { @Override public String getName() { String myName = super.getName(); - if (!myName.isEmpty()) { + if (myName != null && !myName.isEmpty()) { return myName; } diff --git a/Ghidra/Features/GnuDemangler/src/main/java/ghidra/app/util/demangler/gnu/GnuDemangler.java b/Ghidra/Features/GnuDemangler/src/main/java/ghidra/app/util/demangler/gnu/GnuDemangler.java index 26f8c47551..f3f5cce55c 100644 --- a/Ghidra/Features/GnuDemangler/src/main/java/ghidra/app/util/demangler/gnu/GnuDemangler.java +++ b/Ghidra/Features/GnuDemangler/src/main/java/ghidra/app/util/demangler/gnu/GnuDemangler.java @@ -50,9 +50,9 @@ public class GnuDemangler implements Demangler { if (isELF(executableFormat) || isMacho(executableFormat)) { return true; } - - String compiler = program.getCompiler(); - if(compiler != null && compiler.contains("gcc")) { + + String compiler = program.getCompiler(); + if (compiler != null && compiler.contains("gcc")) { return true; } @@ -93,7 +93,7 @@ public class GnuDemangler implements Demangler { } } else if (mangled.startsWith("__Z")) { - mangled = mangled.substring(1);//removed first underscore.... + mangled = mangled.substring(1); } boolean isDwarf = false; diff --git a/Ghidra/Features/GnuDemangler/src/main/java/ghidra/app/util/demangler/gnu/GnuDemanglerParser.java b/Ghidra/Features/GnuDemangler/src/main/java/ghidra/app/util/demangler/gnu/GnuDemanglerParser.java index d1930ff6e0..3906bd28b6 100644 --- a/Ghidra/Features/GnuDemangler/src/main/java/ghidra/app/util/demangler/gnu/GnuDemanglerParser.java +++ b/Ghidra/Features/GnuDemangler/src/main/java/ghidra/app/util/demangler/gnu/GnuDemanglerParser.java @@ -354,7 +354,7 @@ public class GnuDemanglerParser { // operator text. Since the 'special handlers' perform more specific checks, it is // safe to do those first. // - DemangledObjectBuilder handler = getSpecialPrefixHandler(mangledSource, demangled); + DemangledObjectBuilder handler = getSpecialPrefixHandler(demangled); if (handler != null) { return handler; } @@ -394,7 +394,7 @@ public class GnuDemanglerParser { return null; } - private SpecialPrefixHandler getSpecialPrefixHandler(String mangled, String demangled) { + private SpecialPrefixHandler getSpecialPrefixHandler(String demangled) { Matcher matcher = DESCRIPTIVE_PREFIX_PATTERN.matcher(demangled); if (matcher.matches()) {