use same metareg scanner for < v27 and > v27, implement TryMapVATR in PEReader for performance

This commit is contained in:
LukeFZ
2025-11-11 04:14:31 +01:00
parent 8b93dda191
commit 6d674ecc8c
2 changed files with 28 additions and 16 deletions

View File

@@ -198,6 +198,26 @@ namespace Il2CppInspector
return exports.Values; return exports.Values;
} }
public override bool TryMapVATR(ulong uiAddr, out uint fileOffset)
{
if (uiAddr == 0)
{
fileOffset = 0;
return true;
}
var section = sections.FirstOrDefault(x => uiAddr - pe.ImageBase >= x.VirtualAddress &&
uiAddr - pe.ImageBase < x.VirtualAddress + x.SizeOfRawData);
if (section == null)
{
fileOffset = 0;
return false;
}
fileOffset = (uint)(uiAddr - section.VirtualAddress - pe.ImageBase + section.PointerToRawData);
return true;
}
public override uint MapVATR(ulong uiAddr) { public override uint MapVATR(ulong uiAddr) {
if (uiAddr == 0) if (uiAddr == 0)
return 0; return 0;

View File

@@ -277,21 +277,12 @@ namespace Il2CppInspector
vas = FindAllMappedWords(imageBytes, typesLength).Select(a => a - mrSize + ptrSize * 4); vas = FindAllMappedWords(imageBytes, typesLength).Select(a => a - mrSize + ptrSize * 4);
// >= 19 && < 27 // >= 19
if (Image.Version < MetadataVersions.V270) // Luke: Previously, a check comparing MetadataUsagesCount was used here,
foreach (var va in vas) // but I know of at least one binary where this will break detection.
{ // Testing showed that we can just use the same heuristic used for v27+
var mr = Image.ReadMappedVersionedObject<Il2CppMetadataRegistration>(va); // on older versions as well, so we'll just use it for all cases.
if (mr.MetadataUsagesCount == (ulong) metadata.MetadataUsageLists.Length) if (Image.Version >= MetadataVersions.V190)
metadataRegistration = va;
}
// plagiarism. noun - https://www.lexico.com/en/definition/plagiarism
// the practice of taking someone else's work or ideas and passing them off as one's own.
// Synonyms: copying, piracy, theft, strealing, infringement of copyright
// >= 27
else
{ {
foreach (var va in vas) foreach (var va in vas)
{ {
@@ -304,6 +295,7 @@ namespace Il2CppInspector
} }
} }
} }
if (metadataRegistration == 0) if (metadataRegistration == 0)
return (0, 0); return (0, 0);