remove dependency on a section being named .text in loaded pe files
This commit is contained in:
@@ -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;
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user