From 9b6c91a12ef24e8d59ba9488eb9cb6b342b54d5a Mon Sep 17 00:00:00 2001 From: KeybadeBlox Date: Fri, 20 Feb 2026 21:44:43 -0500 Subject: [PATCH] Prevent repeated name mangling A symbol could be encountered more than once in headless mode if it appeared in the body of a function. The mangler script now tracks which symbols have been seen to avoid this. --- ghidra/ghidra_scripts/MSVC7Mangle.java | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/ghidra/ghidra_scripts/MSVC7Mangle.java b/ghidra/ghidra_scripts/MSVC7Mangle.java index 3192ecc..f913567 100644 --- a/ghidra/ghidra_scripts/MSVC7Mangle.java +++ b/ghidra/ghidra_scripts/MSVC7Mangle.java @@ -66,8 +66,10 @@ import ghidra.program.model.symbol.Symbol; import java.util.Arrays; import java.util.ArrayList; import java.util.Collections; +import java.util.HashSet; import java.util.List; import java.util.Optional; +import java.util.Set; import java.util.stream.Collectors; import java.util.stream.IntStream; import java.util.zip.CRC32; @@ -88,28 +90,35 @@ public class MSVC7Mangle extends GhidraScript { setCurrentSelection(addr); } + final HashSet seenSymbols = new HashSet<>(1024); for (final Symbol s : currentProgram.getSymbolTable() .getPrimarySymbolIterator(currentSelection, true)) { - mangle(s); + mangle(s, seenSymbols); // Also mangle everything referenced inside functions // if headless if ( isRunningHeadless() && s.getObject() instanceof Function f - ) mangleRefs(f); + ) mangleRefs(f, seenSymbols); } } - private void mangle(final Symbol s) throws Exception { + private void mangle( + final Symbol s, + final Set seenSymbols + ) throws Exception { /* Set the given symbol's name to its mangled version */ // Skip if already mangled; skip jump tables final String name = s.getName(true); if ( + seenSymbols.contains(s) || name.charAt(0) == '?' || name.startsWith("switchD_") ) return; + seenSymbols.add(s); + // Get mangled name final String mangled = switch (s.getObject()) { case Function f -> mangleFn (f); @@ -622,7 +631,10 @@ public class MSVC7Mangle extends GhidraScript { return (int)crc.getValue() ^ 0xFFFFFFFF; } - private void mangleRefs(final Function f) throws Exception { + private void mangleRefs( + final Function f, + final Set seenSymbols + ) throws Exception { /* Mangle all symbols referenced in the body of a function */ for ( Instruction ins = getFirstInstruction(f); @@ -650,7 +662,7 @@ public class MSVC7Mangle extends GhidraScript { continue; } - mangle(symbol); + mangle(symbol, seenSymbols); } } }