remove dependency on a section being named .text in loaded pe files

This commit is contained in:
LukeFZ
2025-07-25 17:43:06 +02:00
parent 9c76271f6c
commit cb6f913bce
2 changed files with 21 additions and 16 deletions

View File

@@ -176,7 +176,7 @@ namespace Il2CppInspector
try { try {
if (type.GetMethod("Load", BindingFlags.FlattenHierarchy | BindingFlags.Static | BindingFlags.Public, if (type.GetMethod("Load", BindingFlags.FlattenHierarchy | BindingFlags.Static | BindingFlags.Public,
null, new[] { typeof(BinaryObjectStream), typeof(LoadOptions), typeof(EventHandler<string>) }, null) null, new[] { typeof(BinaryObjectStream), typeof(LoadOptions), typeof(EventHandler<string>) }, null)
.Invoke(null, new object[] { binaryObjectStream, loadOptions, statusCallback }) is IFileFormatStream loaded) { .Invoke(null, [binaryObjectStream, loadOptions, statusCallback]) is IFileFormatStream loaded) {
loaded.IsModified |= preProcessResult.IsStreamModified; loaded.IsModified |= preProcessResult.IsStreamModified;
return loaded; return loaded;

View File

@@ -114,26 +114,31 @@ namespace Il2CppInspector
section.Name = wantedSectionTypes[section.Characteristics]; section.Name = wantedSectionTypes[section.Characteristics];
// Get base of code // Get base of code
GlobalOffset = pe.ImageBase + pe.BaseOfCode - sections.First(x => x.Name == ".text").PointerToRawData; GlobalOffset = pe.ImageBase + pe.BaseOfCode - sections
.FirstOrDefault(x => x.Characteristics.HasFlag(PE.IMAGE_SCN_MEM_EXECUTE))?.PointerToRawData ?? 0;
// Confirm that .rdata section begins at same place as IAT // Confirm that .rdata section begins at same place as IAT
var rData = sections.First(x => x.Name == ".rdata"); var rData = sections.FirstOrDefault(x => x.Name == ".rdata");
mightBePacked |= rData.VirtualAddress != IATStart; mightBePacked |= rData == null || rData.VirtualAddress != IATStart;
if (rData != null)
{
// Calculate start of function pointer table
pFuncTable = rData.PointerToRawData + IATSize;
// Calculate start of function pointer table // Skip over __guard_check_icall_fptr and __guard_dispatch_icall_fptr if present, then the following zero offset
pFuncTable = rData.PointerToRawData + IATSize; Position = pFuncTable;
if (pe is PEOptHeader32)
// Skip over __guard_check_icall_fptr and __guard_dispatch_icall_fptr if present, then the following zero offset {
Position = pFuncTable; while (ReadUInt32() != 0)
if (pe is PEOptHeader32) { pFuncTable += 4;
while (ReadUInt32() != 0)
pFuncTable += 4; pFuncTable += 4;
pFuncTable += 4; }
} else
else { {
while (ReadUInt64() != 0) while (ReadUInt64() != 0)
pFuncTable += 8;
pFuncTable += 8; pFuncTable += 8;
pFuncTable += 8; }
} }
// In the fist go round, we signal that this is at least a valid PE file; we don't try to unpack yet // In the fist go round, we signal that this is at least a valid PE file; we don't try to unpack yet