Merge remote-tracking branch

'origin/GP-4898_ghizard_MDMang_process_C_style_mangled_function_symbols--SQUASHED'
(Closes #1514)
This commit is contained in:
Ryan Kurtz
2024-09-19 09:45:47 -04:00
53 changed files with 3016 additions and 1460 deletions

View File

@@ -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);

View File

@@ -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));