mirror of
https://github.com/NationalSecurityAgency/ghidra.git
synced 2026-05-29 06:16:13 +08:00
GP-5173 replaced deprecated demangler methods in rttiutil and rtti gnu script with new ones.
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.plugin.core.analysis.ReferenceAddressPair;
|
||||||
import ghidra.app.util.NamespaceUtils;
|
import ghidra.app.util.NamespaceUtils;
|
||||||
import ghidra.app.util.PseudoDisassembler;
|
import ghidra.app.util.PseudoDisassembler;
|
||||||
import ghidra.app.util.demangler.DemangledObject;
|
import ghidra.app.util.demangler.*;
|
||||||
import ghidra.app.util.demangler.DemanglerUtil;
|
|
||||||
import ghidra.framework.plugintool.ServiceProvider;
|
import ghidra.framework.plugintool.ServiceProvider;
|
||||||
import ghidra.program.flatapi.FlatProgramAPI;
|
import ghidra.program.flatapi.FlatProgramAPI;
|
||||||
import ghidra.program.model.address.*;
|
import ghidra.program.model.address.*;
|
||||||
@@ -2859,7 +2858,7 @@ public class RTTIGccClassRecoverer extends RTTIClassRecoverer {
|
|||||||
}
|
}
|
||||||
mangledLabel = "_ZTS" + mangledLabel;
|
mangledLabel = "_ZTS" + mangledLabel;
|
||||||
|
|
||||||
if (!isTypeinfoNameString(mangledLabel)) {
|
if (!isTypeinfoNameString(mangledLabel, typeinfoNameAddress)) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -3029,15 +3028,27 @@ public class RTTIGccClassRecoverer extends RTTIClassRecoverer {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean isTypeinfoNameString(String string) {
|
private boolean isTypeinfoNameString(String string, Address address) {
|
||||||
|
|
||||||
DemangledObject demangledObject = DemanglerUtil.demangle(string);
|
List<DemangledObject> demangledObjects = DemanglerUtil.demangle(program, string, address);
|
||||||
if (demangledObject == null) {
|
if (demangledObjects == null || demangledObjects.isEmpty()) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (demangledObject.getName().equals("typeinfo-name")) {
|
for (DemangledObject demangledObject : demangledObjects) {
|
||||||
return true;
|
|
||||||
|
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;
|
return false;
|
||||||
}
|
}
|
||||||
|
|||||||
+15
-7
@@ -23,8 +23,10 @@ import ghidra.app.cmd.data.TypeDescriptorModel;
|
|||||||
import ghidra.app.util.NamespaceUtils;
|
import ghidra.app.util.NamespaceUtils;
|
||||||
import ghidra.app.util.PseudoDisassembler;
|
import ghidra.app.util.PseudoDisassembler;
|
||||||
import ghidra.app.util.datatype.microsoft.MSDataTypeUtils;
|
import ghidra.app.util.datatype.microsoft.MSDataTypeUtils;
|
||||||
|
import ghidra.app.util.demangler.DemangledException;
|
||||||
import ghidra.app.util.demangler.DemangledObject;
|
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.Address;
|
||||||
import ghidra.program.model.address.AddressSetView;
|
import ghidra.program.model.address.AddressSetView;
|
||||||
import ghidra.program.model.listing.*;
|
import ghidra.program.model.listing.*;
|
||||||
@@ -82,16 +84,22 @@ public class RttiUtil {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// check for similar symbol
|
// check for similar symbol
|
||||||
|
MicrosoftDemangler demangler = new MicrosoftDemangler();
|
||||||
DemangledObject matchingDemangledObject = null;
|
DemangledObject matchingDemangledObject = null;
|
||||||
SymbolIterator symbols = symbolTable.getSymbolsAsIterator(rttiAddress);
|
SymbolIterator symbols = symbolTable.getSymbolsAsIterator(rttiAddress);
|
||||||
for (Symbol symbol : symbols) {
|
for (Symbol symbol : symbols) {
|
||||||
String name = symbol.getName();
|
String name = symbol.getName();
|
||||||
|
try {
|
||||||
// if mangled get the matching demangled object if there is one and save for after loop
|
MicrosoftMangledContext mangledContext =
|
||||||
// in case symbols are not demangled yet
|
demangler.createMangledContext(name, null, program, symbol.getAddress());
|
||||||
DemangledObject demangledObject = DemanglerUtil.demangle(name);
|
DemangledObject demangledObject = demangler.demangle(mangledContext);
|
||||||
if (demangledObject != null && demangledObject.getName().contains(rttiSuffix)) {
|
if (demangledObject != null && demangledObject.getName().contains(rttiSuffix)) {
|
||||||
matchingDemangledObject = demangledObject;
|
matchingDemangledObject = demangledObject;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (DemangledException e) {
|
||||||
|
// Couldn't demangle.
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user