From bfc65888e05f56fde291eade2bd3857e7d77d384 Mon Sep 17 00:00:00 2001 From: Ryan Kurtz Date: Tue, 30 Nov 2021 18:38:37 -0500 Subject: [PATCH] GP-1548: Fixed a bug with recovering Objective-C method names --- .../ghidra/app/util/bin/format/objc2/ObjectiveC2_Class.java | 6 +++++- .../app/util/bin/format/objc2/ObjectiveC2_Method.java | 3 ++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/objc2/ObjectiveC2_Class.java b/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/objc2/ObjectiveC2_Class.java index c8569f6f41..8890b16d1d 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/objc2/ObjectiveC2_Class.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/objc2/ObjectiveC2_Class.java @@ -39,7 +39,7 @@ public class ObjectiveC2_Class implements StructConverter { private ObjectiveC2_Class superclass; private ObjectiveC2_Cache cache; private ObjectiveC2_Implementation vtable; - private ObjectiveC2_ClassRW data; + private ObjectiveC2_ClassRW data; // class_rw_t * plus custom rr/alloc flags public ObjectiveC2_Class(ObjectiveC2_State state, BinaryReader reader) { this._state = state; @@ -115,6 +115,10 @@ public class ObjectiveC2_Class implements StructConverter { //Trying to read uninitialized memory return; } + + // Fix pointer by applying Swift FAST_DATA_MASK (see objc-runtime-new.h for details) + index &= _state.is64bit ? ~0x7L : ~0x3L; + if (index != 0 && reader.isValidIndex(index)) { long originalIndex = reader.getPointerIndex(); reader.setPointerIndex(index); diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/objc2/ObjectiveC2_Method.java b/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/objc2/ObjectiveC2_Method.java index b074821c91..11ec241f45 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/objc2/ObjectiveC2_Method.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/objc2/ObjectiveC2_Method.java @@ -38,7 +38,8 @@ public class ObjectiveC2_Method extends ObjectiveC_Method { if (isSmallList) { int nameOffset = (int)ObjectiveC1_Utilities.readNextIndex(reader, true); int namePtr = reader.readInt(_index + nameOffset); - name = reader.readAsciiString(namePtr); + long imagebase = state.program.getImageBase().getOffset(); // When we support dyld_shared_cache, this base will likely have to change + name = reader.readAsciiString(imagebase + namePtr); int typesOffset = (int)ObjectiveC1_Utilities.readNextIndex(reader, true); types = reader.readAsciiString(_index + 4 + typesOffset);