mirror of
https://github.com/NationalSecurityAgency/ghidra.git
synced 2026-09-28 17:11:11 -09:00
Merge remote-tracking branch
'origin/GP-4898_ghizard_MDMang_process_C_style_mangled_function_symbols--SQUASHED' (Closes #1514)
This commit is contained in:
@@ -4,9 +4,9 @@
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
@@ -19,6 +19,7 @@ import static org.junit.Assert.*;
|
||||
|
||||
import org.junit.*;
|
||||
|
||||
import ghidra.app.util.demangler.gnu.GnuDemangler;
|
||||
import ghidra.program.database.ProgramDB;
|
||||
import ghidra.program.model.address.Address;
|
||||
import ghidra.program.model.data.*;
|
||||
@@ -74,9 +75,10 @@ public class DemangledAddressTableTest extends AbstractGhidraHeadlessIntegration
|
||||
}
|
||||
|
||||
/**
|
||||
* Test that the DemangledAddressTable will properly create a sequence of data
|
||||
* Test that the DemangledAddressTable will properly create a sequence of data
|
||||
* pointers. This test deals with the simple case where no existing data
|
||||
* is present. End of block considered end of address table.
|
||||
* @throws Exception upon error
|
||||
*/
|
||||
@Test
|
||||
public void testApply_NoNextSymbol_NoData() throws Exception {
|
||||
@@ -88,10 +90,13 @@ public class DemangledAddressTableTest extends AbstractGhidraHeadlessIntegration
|
||||
SymbolTable symbolTable = program.getSymbolTable();
|
||||
symbolTable.createLabel(addr, mangled, SourceType.IMPORTED);
|
||||
|
||||
DemangledObject demangled = DemanglerUtil.demangle(mangled);
|
||||
GnuDemangler demangler = new GnuDemangler();
|
||||
MangledContext mangledContext =
|
||||
demangler.createMangledContext(mangled, null, program, addr);
|
||||
DemangledObject demangled = demangler.demangle(mangledContext);
|
||||
assertTrue(demangled instanceof DemangledAddressTable);
|
||||
|
||||
assertTrue(demangled.applyTo(program, addr, new DemanglerOptions(), TaskMonitor.DUMMY));
|
||||
assertTrue(demangled.getMangledContext() != null);
|
||||
assertTrue(demangled.applyUsingContext(TaskMonitor.DUMMY));
|
||||
|
||||
// expected: UniqueSpace::vtable
|
||||
Symbol[] symbols = symbolTable.getSymbols(addr);
|
||||
@@ -107,9 +112,10 @@ public class DemangledAddressTableTest extends AbstractGhidraHeadlessIntegration
|
||||
}
|
||||
|
||||
/**
|
||||
* Test that the DemangledAddressTable will not create a sequence of data
|
||||
* pointers due to a data collision. This test deals with the case where primitive types have been
|
||||
* Test that the DemangledAddressTable will not create a sequence of data
|
||||
* pointers due to a data collision. This test deals with the case where primitive types have been
|
||||
* previously created. End of block considered end of address table.
|
||||
* @throws Exception upon error
|
||||
*/
|
||||
@Test
|
||||
public void testApply_NoNextSymbol_DataCollision() throws Exception {
|
||||
@@ -126,10 +132,13 @@ public class DemangledAddressTableTest extends AbstractGhidraHeadlessIntegration
|
||||
listing.createData(addr("0x118"), Undefined4DataType.dataType);
|
||||
listing.createData(addr("0x120"), DWordDataType.dataType);
|
||||
|
||||
DemangledObject demangled = DemanglerUtil.demangle(mangled);
|
||||
GnuDemangler demangler = new GnuDemangler();
|
||||
MangledContext mangledContext =
|
||||
demangler.createMangledContext(mangled, null, program, addr);
|
||||
DemangledObject demangled = demangler.demangle(mangledContext);
|
||||
assertTrue(demangled instanceof DemangledAddressTable);
|
||||
|
||||
assertTrue(demangled.applyTo(program, addr, new DemanglerOptions(), TaskMonitor.DUMMY));
|
||||
assertTrue(demangled.getMangledContext() != null);
|
||||
assertTrue(demangled.applyUsingContext(TaskMonitor.DUMMY));
|
||||
|
||||
// expected: UniqueSpace::vtable
|
||||
Symbol[] symbols = symbolTable.getSymbols(addr);
|
||||
@@ -146,9 +155,10 @@ public class DemangledAddressTableTest extends AbstractGhidraHeadlessIntegration
|
||||
}
|
||||
|
||||
/**
|
||||
* Test that the DemangledAddressTable will properly create a sequence of data
|
||||
* pointers. This test deals with the case where primitive types have been
|
||||
* Test that the DemangledAddressTable will properly create a sequence of data
|
||||
* pointers. This test deals with the case where primitive types have been
|
||||
* previously created. Next label considered end of address table.
|
||||
* @throws Exception upon error
|
||||
*/
|
||||
@Test
|
||||
public void testApply_WithNextSymbol_UndefinedData() throws Exception {
|
||||
@@ -167,10 +177,13 @@ public class DemangledAddressTableTest extends AbstractGhidraHeadlessIntegration
|
||||
|
||||
symbolTable.createLabel(addr("0x120"), "NextLabel", SourceType.IMPORTED);
|
||||
|
||||
DemangledObject demangled = DemanglerUtil.demangle(mangled);
|
||||
GnuDemangler demangler = new GnuDemangler();
|
||||
MangledContext mangledContext =
|
||||
demangler.createMangledContext(mangled, null, program, addr);
|
||||
DemangledObject demangled = demangler.demangle(mangledContext);
|
||||
assertTrue(demangled instanceof DemangledAddressTable);
|
||||
|
||||
assertTrue(demangled.applyTo(program, addr, new DemanglerOptions(), TaskMonitor.DUMMY));
|
||||
assertTrue(demangled.getMangledContext() != null);
|
||||
assertTrue(demangled.applyUsingContext(TaskMonitor.DUMMY));
|
||||
|
||||
// expected: UniqueSpace::vtable
|
||||
Symbol[] symbols = symbolTable.getSymbols(addr);
|
||||
@@ -185,10 +198,11 @@ public class DemangledAddressTableTest extends AbstractGhidraHeadlessIntegration
|
||||
}
|
||||
|
||||
/**
|
||||
* Test that the DemangledAddressTable will properly create a sequence of data
|
||||
* pointers. This test deals with the case where primitive types have been
|
||||
* previously created where the first is an undefined array which dictates the
|
||||
* Test that the DemangledAddressTable will properly create a sequence of data
|
||||
* pointers. This test deals with the case where primitive types have been
|
||||
* previously created where the first is an undefined array which dictates the
|
||||
* extent of the address table. Next label beyond end of address table.
|
||||
* @throws Exception upon error
|
||||
*/
|
||||
@Test
|
||||
public void testApply_WithUndefinedArray() throws Exception {
|
||||
@@ -207,10 +221,13 @@ public class DemangledAddressTableTest extends AbstractGhidraHeadlessIntegration
|
||||
|
||||
symbolTable.createLabel(addr("0x120"), "NextLabel", SourceType.IMPORTED);
|
||||
|
||||
DemangledObject demangled = DemanglerUtil.demangle(mangled);
|
||||
GnuDemangler demangler = new GnuDemangler();
|
||||
MangledContext mangledContext =
|
||||
demangler.createMangledContext(mangled, null, program, addr);
|
||||
DemangledObject demangled = demangler.demangle(mangledContext);
|
||||
assertTrue(demangled instanceof DemangledAddressTable);
|
||||
|
||||
assertTrue(demangled.applyTo(program, addr, new DemanglerOptions(), TaskMonitor.DUMMY));
|
||||
assertTrue(demangled.getMangledContext() != null);
|
||||
assertTrue(demangled.applyUsingContext(TaskMonitor.DUMMY));
|
||||
|
||||
// expected: UniqueSpace::vtable
|
||||
Symbol[] symbols = symbolTable.getSymbols(addr);
|
||||
|
||||
@@ -4,9 +4,9 @@
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
@@ -21,6 +21,8 @@ import java.util.Arrays;
|
||||
|
||||
import org.junit.*;
|
||||
|
||||
import ghidra.app.util.demangler.gnu.GnuDemangler;
|
||||
import ghidra.app.util.demangler.microsoft.*;
|
||||
import ghidra.program.database.ProgramBuilder;
|
||||
import ghidra.program.database.ProgramDB;
|
||||
import ghidra.program.model.address.Address;
|
||||
@@ -62,11 +64,16 @@ public class DemangledFunctionTest extends AbstractGhidraHeadlessIntegrationTest
|
||||
|
||||
// this is: public long __thiscall ATL::CRegKey::Close(void)
|
||||
String mangled = "?CloseM@CRegKeyM@ATL@@QAEJXZ";
|
||||
DemangledObject demangled = DemanglerUtil.demangle(mangled);
|
||||
Address addr = addr("0x0101");
|
||||
MicrosoftDemangler demangler = new MicrosoftDemangler();
|
||||
MicrosoftDemanglerOptions options = demangler.createDefaultOptions();
|
||||
MicrosoftMangledContext mangledContext =
|
||||
demangler.createMangledContext(mangled, options, program, addr);
|
||||
options.setInterpretation(MsCInterpretation.FUNCTION);
|
||||
DemangledObject demangled = demangler.demangle(mangledContext);
|
||||
assertTrue(demangled instanceof DemangledFunction);
|
||||
|
||||
Address addr = addr("0x0101");
|
||||
assertTrue(demangled.applyTo(program, addr, new DemanglerOptions(), TaskMonitor.DUMMY));
|
||||
assertTrue(demangled.applyTo(program, addr, options, TaskMonitor.DUMMY));
|
||||
|
||||
assertFunction("CloseM", addr);
|
||||
|
||||
@@ -95,7 +102,14 @@ public class DemangledFunctionTest extends AbstractGhidraHeadlessIntegrationTest
|
||||
|
||||
// this is: public long __thiscall ATL::CRegKey::Close(void)
|
||||
String mangled = "?Close@CRegKey@ATL@@QAEJXZ";
|
||||
DemangledObject demangled = DemanglerUtil.demangle(mangled);
|
||||
Address addr = addr("0x0100");
|
||||
MicrosoftDemangler demangler = new MicrosoftDemangler();
|
||||
MangledContext mangledContext =
|
||||
demangler.createMangledContext(mangled, null, program, addr);
|
||||
DemanglerOptions options = mangledContext.getOptions();
|
||||
// TODO: need direct way to change "for function" vs. just address and program; which might mean MicrosoftDemanglerContext
|
||||
//mangledContext.setIsFunction(true);
|
||||
DemangledObject demangled = demangler.demangle(mangledContext);
|
||||
assertTrue(demangled instanceof DemangledFunction);
|
||||
|
||||
FunctionManager functionMgr = program.getFunctionManager();
|
||||
@@ -105,8 +119,7 @@ public class DemangledFunctionTest extends AbstractGhidraHeadlessIntegrationTest
|
||||
new AddressSet(addr("0x0100")), SourceType.IMPORTED);
|
||||
f2.setThunkedFunction(f1);
|
||||
|
||||
Address addr = addr("0x0100");
|
||||
demangled.applyTo(program, addr, new DemanglerOptions(), TaskMonitor.DUMMY);
|
||||
demangled.applyTo(program, addr, options, TaskMonitor.DUMMY);
|
||||
|
||||
assertFunction("Close", addr);
|
||||
assertNoBookmarkAt(addr);
|
||||
@@ -148,10 +161,16 @@ public class DemangledFunctionTest extends AbstractGhidraHeadlessIntegrationTest
|
||||
SymbolTable symbolTable = program.getSymbolTable();
|
||||
symbolTable.createLabel(addr, mangled, SourceType.IMPORTED);
|
||||
|
||||
DemangledObject demangled = DemanglerUtil.demangle(mangled);
|
||||
MicrosoftDemangler demangler = new MicrosoftDemangler();
|
||||
MangledContext mangledContext =
|
||||
demangler.createMangledContext(mangled, null, program, addr);
|
||||
DemanglerOptions options = mangledContext.getOptions();
|
||||
// TODO: need direct way to change "for function" vs. just address and program; which might mean MicrosoftDemanglerContext
|
||||
//mangledContext.setIsFunction(true);
|
||||
DemangledObject demangled = demangler.demangle(mangledContext);
|
||||
assertTrue(demangled instanceof DemangledFunction);
|
||||
|
||||
assertTrue(demangled.applyTo(program, addr, new DemanglerOptions(), TaskMonitor.DUMMY));
|
||||
assertTrue(demangled.applyTo(program, addr, options, TaskMonitor.DUMMY));
|
||||
|
||||
assertFunction("Close", addr);
|
||||
assertNoBookmarkAt(addr);
|
||||
@@ -185,10 +204,16 @@ public class DemangledFunctionTest extends AbstractGhidraHeadlessIntegrationTest
|
||||
String mangledWithAddr = SymbolUtilities.getAddressAppendedName(mangled, addr);
|
||||
symbolTable.createLabel(addr, mangledWithAddr, SourceType.IMPORTED);
|
||||
|
||||
DemangledObject demangled = DemanglerUtil.demangle(mangled);
|
||||
MicrosoftDemangler demangler = new MicrosoftDemangler();
|
||||
MangledContext mangledContext =
|
||||
demangler.createMangledContext(mangled, null, program, addr);
|
||||
DemanglerOptions options = mangledContext.getOptions();
|
||||
// TODO: need direct way to change "for function" vs. just address and program; which might mean MicrosoftDemanglerContext
|
||||
//mangledContext.setIsFunction(true);
|
||||
DemangledObject demangled = demangler.demangle(mangledContext);
|
||||
assertTrue(demangled instanceof DemangledFunction);
|
||||
|
||||
assertTrue(demangled.applyTo(program, addr, new DemanglerOptions(), TaskMonitor.DUMMY));
|
||||
assertTrue(demangled.applyTo(program, addr, options, TaskMonitor.DUMMY));
|
||||
|
||||
assertFunction("Close", addr);
|
||||
assertNoBookmarkAt(addr);
|
||||
@@ -223,10 +248,16 @@ public class DemangledFunctionTest extends AbstractGhidraHeadlessIntegrationTest
|
||||
symbolTable.createLabel(addr, "Close", SourceType.IMPORTED);
|
||||
symbolTable.createLabel(addr, mangled, SourceType.IMPORTED);
|
||||
|
||||
DemangledObject demangled = DemanglerUtil.demangle(mangled);
|
||||
MicrosoftDemangler demangler = new MicrosoftDemangler();
|
||||
MangledContext mangledContext =
|
||||
demangler.createMangledContext(mangled, null, program, addr);
|
||||
DemanglerOptions options = mangledContext.getOptions();
|
||||
// TODO: need direct way to change "for function" vs. just address and program; which might mean MicrosoftDemanglerContext
|
||||
//mangledContext.setIsFunction(true);
|
||||
DemangledObject demangled = demangler.demangle(mangledContext);
|
||||
assertTrue(demangled instanceof DemangledFunction);
|
||||
|
||||
assertTrue(demangled.applyTo(program, addr, new DemanglerOptions(), TaskMonitor.DUMMY));
|
||||
assertTrue(demangled.applyTo(program, addr, options, TaskMonitor.DUMMY));
|
||||
|
||||
assertFunction("Close", addr);
|
||||
assertNoBookmarkAt(addr);
|
||||
@@ -258,9 +289,15 @@ public class DemangledFunctionTest extends AbstractGhidraHeadlessIntegrationTest
|
||||
SymbolTable symbolTable = program.getSymbolTable();
|
||||
symbolTable.createLabel(addr, mangled, SourceType.IMPORTED);
|
||||
|
||||
DemangledObject demangled = DemanglerUtil.demangle(mangled);
|
||||
MicrosoftDemangler demangler = new MicrosoftDemangler();
|
||||
MangledContext mangledContext =
|
||||
demangler.createMangledContext(mangled, null, program, addr);
|
||||
DemanglerOptions options = mangledContext.getOptions();
|
||||
// TODO: need direct way to change "for function" vs. just address and program; which might mean MicrosoftDemanglerContext
|
||||
//mangledContext.setIsFunction(true);
|
||||
DemangledObject demangled = demangler.demangle(mangledContext);
|
||||
assertTrue(demangled instanceof DemangledFunction);
|
||||
assertTrue(demangled.applyTo(program, addr, new DemanglerOptions(), TaskMonitor.DUMMY));
|
||||
assertTrue(demangled.applyTo(program, addr, options, TaskMonitor.DUMMY));
|
||||
|
||||
String className =
|
||||
"F<class_E::D::G<struct_E::D::H<bool_(__cdecl*const)(enum_C::B_const&),0>,bool,enum_C::B_const&>_>";
|
||||
@@ -306,10 +343,16 @@ public class DemangledFunctionTest extends AbstractGhidraHeadlessIntegrationTest
|
||||
|
||||
Address addr = extLoc.getExternalSpaceAddress();
|
||||
|
||||
DemangledObject demangled = DemanglerUtil.demangle(mangled);
|
||||
MicrosoftDemangler demangler = new MicrosoftDemangler();
|
||||
MangledContext mangledContext =
|
||||
demangler.createMangledContext(mangled, null, program, addr);
|
||||
DemanglerOptions options = mangledContext.getOptions();
|
||||
// TODO: need direct way to change "for function" vs. just address and program; which might mean MicrosoftDemanglerContext
|
||||
//mangledContext.setIsFunction(true);
|
||||
DemangledObject demangled = demangler.demangle(mangledContext);
|
||||
assertTrue(demangled instanceof DemangledFunction);
|
||||
|
||||
assertTrue(demangled.applyTo(program, addr, new DemanglerOptions(), TaskMonitor.DUMMY));
|
||||
assertTrue(demangled.applyTo(program, addr, options, TaskMonitor.DUMMY));
|
||||
|
||||
assertFunction("Close", addr);
|
||||
assertNoBookmarkAt(addr);
|
||||
@@ -348,16 +391,20 @@ public class DemangledFunctionTest extends AbstractGhidraHeadlessIntegrationTest
|
||||
String functionName = "__gthread_active_p";
|
||||
programBuilder.createEmptyFunction(functionName, "0x0101", 10, new VoidDataType());
|
||||
|
||||
Address addr = addr("0x0103");
|
||||
programBuilder.createLabel("0x0103", mangled);
|
||||
|
||||
DemangledObject demangled = DemanglerUtil.demangle(program, mangled);
|
||||
GnuDemangler demangler = new GnuDemangler();
|
||||
MangledContext mangledContext =
|
||||
demangler.createMangledContext(mangled, null, program, addr);
|
||||
DemanglerOptions options = mangledContext.getOptions();
|
||||
DemangledObject demangled = demangler.demangle(mangledContext);
|
||||
assertNotNull(demangled);
|
||||
assertTrue(demangled instanceof DemangledVariable);
|
||||
|
||||
assertEquals("__gthread_active_p()::__gthread_active_ptr", demangled.getSignature(false));
|
||||
|
||||
Address addr = addr("0x0103");
|
||||
demangled.applyTo(program, addr, new DemanglerOptions(), TaskMonitor.DUMMY);
|
||||
demangled.applyTo(program, addr, options, TaskMonitor.DUMMY);
|
||||
|
||||
assertSimpleNamespaceExists("__gthread_active_p()");
|
||||
assertNoBookmarkAt(addr);
|
||||
@@ -376,14 +423,19 @@ public class DemangledFunctionTest extends AbstractGhidraHeadlessIntegrationTest
|
||||
public void testApply_Function_DoNotApplyCallingConvention() throws Exception {
|
||||
|
||||
String mangled = "?CloseM@CRegKeyM@ATL@@QAEJXZ";
|
||||
DemangledObject demangled = DemanglerUtil.demangle(mangled);
|
||||
Address addr = addr("0x0101");
|
||||
MicrosoftDemangler demangler = new MicrosoftDemangler();
|
||||
MangledContext mangledContext =
|
||||
demangler.createMangledContext(mangled, null, program, addr);
|
||||
DemanglerOptions options = mangledContext.getOptions();
|
||||
// TODO: need direct way to change "for function" vs. just address and program; which might mean MicrosoftDemanglerContext
|
||||
//mangledContext.setIsFunction(true);
|
||||
DemangledObject demangled = demangler.demangle(mangledContext);
|
||||
assertTrue(demangled instanceof DemangledFunction);
|
||||
|
||||
DemangledFunction demangledFunction = (DemangledFunction) demangled;
|
||||
demangledFunction.setCallingConvention(CompilerSpec.CALLING_CONVENTION_stdcall);
|
||||
|
||||
Address addr = addr("0x0101");
|
||||
DemanglerOptions options = new DemanglerOptions();
|
||||
options.setApplyCallingConvention(false);
|
||||
assertTrue(demangled.applyTo(program, addr, options, TaskMonitor.DUMMY));
|
||||
|
||||
|
||||
Reference in New Issue
Block a user