mirror of
https://github.com/NationalSecurityAgency/ghidra.git
synced 2026-05-26 05:37:32 +08:00
Merge remote-tracking branch 'origin/GP-5173_ghidra007_updateRTTIAnalyzer_and_script_with_new_demangler--SQUASHED' into patch
This commit is contained in:
@@ -25,8 +25,7 @@ import ghidra.app.cmd.label.DemanglerCmd;
|
||||
import ghidra.app.plugin.core.analysis.ReferenceAddressPair;
|
||||
import ghidra.app.util.NamespaceUtils;
|
||||
import ghidra.app.util.PseudoDisassembler;
|
||||
import ghidra.app.util.demangler.DemangledObject;
|
||||
import ghidra.app.util.demangler.DemanglerUtil;
|
||||
import ghidra.app.util.demangler.*;
|
||||
import ghidra.framework.plugintool.ServiceProvider;
|
||||
import ghidra.program.flatapi.FlatProgramAPI;
|
||||
import ghidra.program.model.address.*;
|
||||
@@ -2859,7 +2858,7 @@ public class RTTIGccClassRecoverer extends RTTIClassRecoverer {
|
||||
}
|
||||
mangledLabel = "_ZTS" + mangledLabel;
|
||||
|
||||
if (!isTypeinfoNameString(mangledLabel)) {
|
||||
if (!isTypeinfoNameString(mangledLabel, typeinfoNameAddress)) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@@ -3029,15 +3028,27 @@ public class RTTIGccClassRecoverer extends RTTIClassRecoverer {
|
||||
return true;
|
||||
}
|
||||
|
||||
private boolean isTypeinfoNameString(String string) {
|
||||
private boolean isTypeinfoNameString(String string, Address address) {
|
||||
|
||||
DemangledObject demangledObject = DemanglerUtil.demangle(string);
|
||||
if (demangledObject == null) {
|
||||
List<DemangledObject> demangledObjects = DemanglerUtil.demangle(program, string, address);
|
||||
if (demangledObjects == null || demangledObjects.isEmpty()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (demangledObject.getName().equals("typeinfo-name")) {
|
||||
return true;
|
||||
for (DemangledObject demangledObject : demangledObjects) {
|
||||
|
||||
DemanglerOptions options = demangledObject.getMangledContext().getOptions();
|
||||
|
||||
// Currently no good way to do this since this is in Decompiler package and GnuDemangler
|
||||
// is in its own package. Once no longer a script but an analyzer in Base, update to
|
||||
// do !(options instanceof GnuDemanglerOptions)
|
||||
if (!options.toString().contains("gnu")) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (demangledObject.getName().equals("typeinfo-name")) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
+15
-7
@@ -23,8 +23,10 @@ import ghidra.app.cmd.data.TypeDescriptorModel;
|
||||
import ghidra.app.util.NamespaceUtils;
|
||||
import ghidra.app.util.PseudoDisassembler;
|
||||
import ghidra.app.util.datatype.microsoft.MSDataTypeUtils;
|
||||
import ghidra.app.util.demangler.DemangledException;
|
||||
import ghidra.app.util.demangler.DemangledObject;
|
||||
import ghidra.app.util.demangler.DemanglerUtil;
|
||||
import ghidra.app.util.demangler.microsoft.MicrosoftDemangler;
|
||||
import ghidra.app.util.demangler.microsoft.MicrosoftMangledContext;
|
||||
import ghidra.program.model.address.Address;
|
||||
import ghidra.program.model.address.AddressSetView;
|
||||
import ghidra.program.model.listing.*;
|
||||
@@ -82,16 +84,22 @@ public class RttiUtil {
|
||||
}
|
||||
|
||||
// check for similar symbol
|
||||
MicrosoftDemangler demangler = new MicrosoftDemangler();
|
||||
DemangledObject matchingDemangledObject = null;
|
||||
SymbolIterator symbols = symbolTable.getSymbolsAsIterator(rttiAddress);
|
||||
for (Symbol symbol : symbols) {
|
||||
String name = symbol.getName();
|
||||
|
||||
// if mangled get the matching demangled object if there is one and save for after loop
|
||||
// in case symbols are not demangled yet
|
||||
DemangledObject demangledObject = DemanglerUtil.demangle(name);
|
||||
if (demangledObject != null && demangledObject.getName().contains(rttiSuffix)) {
|
||||
matchingDemangledObject = demangledObject;
|
||||
try {
|
||||
MicrosoftMangledContext mangledContext =
|
||||
demangler.createMangledContext(name, null, program, symbol.getAddress());
|
||||
DemangledObject demangledObject = demangler.demangle(mangledContext);
|
||||
if (demangledObject != null && demangledObject.getName().contains(rttiSuffix)) {
|
||||
matchingDemangledObject = demangledObject;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
catch (DemangledException e) {
|
||||
// Couldn't demangle.
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user