mirror of
https://github.com/NationalSecurityAgency/ghidra.git
synced 2026-09-28 17:11:11 -09:00
GP-6927 added search for mangled class names starting with __
This commit is contained in:
@@ -55,9 +55,9 @@ public class RTTIGccClassRecoverer extends RTTIClassRecoverer {
|
|||||||
"N10__cxxabiv120__si_class_type_infoE";
|
"N10__cxxabiv120__si_class_type_infoE";
|
||||||
private static final String MANGLED_VMI_CLASS_TYPEINFO_NAMESPACE =
|
private static final String MANGLED_VMI_CLASS_TYPEINFO_NAMESPACE =
|
||||||
"N10__cxxabiv121__vmi_class_type_infoE";
|
"N10__cxxabiv121__vmi_class_type_infoE";
|
||||||
private static final String MANGLED_VTABLE_PREFIX = "_ZTV";
|
private static final String MANGLED_VTABLE_PREFIX = "ZTV";
|
||||||
private static final String MANGLED_STRING_PREFIX = "_ZTS";
|
private static final String MANGLED_STRING_PREFIX = "ZTS";
|
||||||
private static final String MANGLED_TYPEINFO_PREFIX = "_ZTI";
|
private static final String MANGLED_TYPEINFO_PREFIX = "ZTI";
|
||||||
|
|
||||||
private static final String VMI_CLASS_TYPE_INFO_STRUCTURE = "VmiClassTypeInfoStructure";
|
private static final String VMI_CLASS_TYPE_INFO_STRUCTURE = "VmiClassTypeInfoStructure";
|
||||||
private static final String BASE_CLASS_TYPE_INFO_STRUCTURE = "BaseClassTypeInfoStructure";
|
private static final String BASE_CLASS_TYPE_INFO_STRUCTURE = "BaseClassTypeInfoStructure";
|
||||||
@@ -430,10 +430,17 @@ public class RTTIGccClassRecoverer extends RTTIClassRecoverer {
|
|||||||
private Symbol findAndReturnDemangledSymbol(String mangledSymbolName,
|
private Symbol findAndReturnDemangledSymbol(String mangledSymbolName,
|
||||||
String specialClassNamespaceName, String classNamespaceName, String label) {
|
String specialClassNamespaceName, String classNamespaceName, String label) {
|
||||||
|
|
||||||
SymbolIterator symbolIterator = symbolTable.getSymbolIterator(mangledSymbolName, true);
|
// check for both _ and __ prefixed mangled names
|
||||||
if (symbolIterator.hasNext()) {
|
List<Symbol> mangledSymbols = getSymbols("_" + mangledSymbolName, true);
|
||||||
|
if (mangledSymbols.isEmpty()) {
|
||||||
|
mangledSymbols = getSymbols("__" + mangledSymbolName, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (Symbol mangledSymbol : mangledSymbols) {
|
||||||
|
if (monitor.isCancelled()) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
Symbol mangledSymbol = symbolIterator.next();
|
|
||||||
Address symbolAddress = mangledSymbol.getAddress();
|
Address symbolAddress = mangledSymbol.getAddress();
|
||||||
Namespace specialClassNamespace =
|
Namespace specialClassNamespace =
|
||||||
getOrCreateNamespace(specialClassNamespaceName, globalNamespace);
|
getOrCreateNamespace(specialClassNamespaceName, globalNamespace);
|
||||||
@@ -460,6 +467,20 @@ public class RTTIGccClassRecoverer extends RTTIClassRecoverer {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private List<Symbol> getSymbols(String name, boolean caseSensitive) {
|
||||||
|
|
||||||
|
List<Symbol> symbols = new ArrayList<>();
|
||||||
|
SymbolIterator symbolIterator = symbolTable.getSymbolIterator(name, caseSensitive);
|
||||||
|
if (symbolIterator.hasNext()) {
|
||||||
|
if (monitor.isCancelled()) {
|
||||||
|
return new ArrayList<>();
|
||||||
|
}
|
||||||
|
Symbol symbol = symbolIterator.next();
|
||||||
|
symbols.add(symbol);
|
||||||
|
}
|
||||||
|
return symbols;
|
||||||
|
}
|
||||||
|
|
||||||
private Symbol findTypeinfoSymbolUsingMangledNamespaceString(String mangledNamespace,
|
private Symbol findTypeinfoSymbolUsingMangledNamespaceString(String mangledNamespace,
|
||||||
String namespaceName) throws CancelledException {
|
String namespaceName) throws CancelledException {
|
||||||
|
|
||||||
@@ -3960,7 +3981,9 @@ public class RTTIGccClassRecoverer extends RTTIClassRecoverer {
|
|||||||
|
|
||||||
Address typeinfoAddress = typeinfoNameRef.subtract(defaultPointerSize);
|
Address typeinfoAddress = typeinfoNameRef.subtract(defaultPointerSize);
|
||||||
|
|
||||||
mangledNamespaceString = MANGLED_STRING_PREFIX + mangledNamespaceString;
|
// Doesn't matter if _ or __ is prefixed because gets same result and this is manufacturing
|
||||||
|
// not searching for
|
||||||
|
mangledNamespaceString = "_" + MANGLED_STRING_PREFIX + mangledNamespaceString;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
symbolTable.createLabel(findSingleMangledString, mangledNamespaceString,
|
symbolTable.createLabel(findSingleMangledString, mangledNamespaceString,
|
||||||
|
|||||||
Reference in New Issue
Block a user