Skip to content

Commit 7a0ee09

Browse files
committed
处理v27以上的metadataUsage
1 parent 82e6311 commit 7a0ee09

File tree

13 files changed

+279
-118
lines changed

13 files changed

+279
-118
lines changed

Il2CppDumper/ExecutableFormats/Elf.cs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,13 @@ public bool CheckSection()
7979
public override ulong MapVATR(ulong addr)
8080
{
8181
var phdr = programSegment.First(x => addr >= x.p_vaddr && addr <= x.p_vaddr + x.p_memsz);
82-
return addr - (phdr.p_vaddr - phdr.p_offset);
82+
return addr - phdr.p_vaddr + phdr.p_offset;
83+
}
84+
85+
public override ulong MapRTVA(ulong addr)
86+
{
87+
var phdr = programSegment.First(x => addr >= x.p_offset && addr <= x.p_offset + x.p_filesz);
88+
return addr - phdr.p_offset + phdr.p_vaddr;
8389
}
8490

8591
public override bool Search()

Il2CppDumper/ExecutableFormats/Elf64.cs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,13 @@ public bool CheckSection()
7070
public override ulong MapVATR(ulong addr)
7171
{
7272
var phdr = programSegment.First(x => addr >= x.p_vaddr && addr <= x.p_vaddr + x.p_memsz);
73-
return addr - (phdr.p_vaddr - phdr.p_offset);
73+
return addr - phdr.p_vaddr + phdr.p_offset;
74+
}
75+
76+
public override ulong MapRTVA(ulong addr)
77+
{
78+
var phdr = programSegment.First(x => addr >= x.p_offset && addr <= x.p_offset + x.p_filesz);
79+
return addr - phdr.p_offset + phdr.p_vaddr;
7480
}
7581

7682
public override bool Search()

Il2CppDumper/ExecutableFormats/Macho.cs

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,6 @@ public Macho(Stream stream) : base(stream)
5151
section.offset = ReadUInt32();
5252
Position += 12; //skip align, reloff, nreloc
5353
section.flags = ReadUInt32();
54-
section.end = section.addr + section.size;
5554
Position += 8; //skip reserved1, reserved2
5655
}
5756
break;
@@ -75,10 +74,16 @@ public override void Init(ulong codeRegistration, ulong metadataRegistration)
7574
customAttributeGenerators = customAttributeGenerators.Select(x => x - 1).ToArray();
7675
}
7776

78-
public override ulong MapVATR(ulong uiAddr)
77+
public override ulong MapVATR(ulong addr)
7978
{
80-
var section = sections.First(x => uiAddr >= x.addr && uiAddr <= x.end);
81-
return uiAddr - (section.addr - section.offset);
79+
var section = sections.First(x => addr >= x.addr && addr <= x.addr + x.size);
80+
return addr - section.addr + section.offset;
81+
}
82+
83+
public override ulong MapRTVA(ulong addr)
84+
{
85+
var section = sections.First(x => addr >= x.offset && addr <= x.offset + x.size);
86+
return addr - section.offset + section.addr;
8287
}
8388

8489
public override bool Search()

Il2CppDumper/ExecutableFormats/Macho64.cs

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,6 @@ public Macho64(Stream stream) : base(stream)
5050
section.offset = ReadUInt32();
5151
Position += 12; //skip align, reloff, nreloc
5252
section.flags = ReadUInt32();
53-
section.end = section.addr + section.size;
5453
Position += 12; //skip reserved1, reserved2, reserved3
5554
}
5655
break;
@@ -67,14 +66,24 @@ public Macho64(Stream stream) : base(stream)
6766
}
6867
}
6968

70-
public override ulong MapVATR(ulong uiAddr)
69+
public override ulong MapVATR(ulong addr)
7170
{
72-
var section = sections.First(x => uiAddr >= x.addr && uiAddr <= x.end);
71+
var section = sections.First(x => addr >= x.addr && addr <= x.addr + x.size);
7372
if (section.sectname == "__bss")
7473
{
7574
throw new Exception();
7675
}
77-
return uiAddr - (section.addr - section.offset);
76+
return addr - section.addr + section.offset;
77+
}
78+
79+
public override ulong MapRTVA(ulong addr)
80+
{
81+
var section = sections.First(x => addr >= x.offset && addr <= x.offset + x.size);
82+
if (section.sectname == "__bss")
83+
{
84+
throw new Exception();
85+
}
86+
return addr - section.offset + section.addr;
7887
}
7988

8089
public override bool Search()

Il2CppDumper/ExecutableFormats/MachoClass.cs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ public class MachoSection
1212
public uint size;
1313
public uint offset;
1414
public uint flags;
15-
public uint end;
1615
}
1716

1817
public class MachoSection64Bit
@@ -22,7 +21,6 @@ public class MachoSection64Bit
2221
public ulong size;
2322
public ulong offset;
2423
public uint flags;
25-
public ulong end;
2624
}
2725

2826
public class Fat

Il2CppDumper/ExecutableFormats/NSO.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,12 @@ public override ulong MapVATR(ulong addr)
9696
return addr - segment.MemoryOffset + segment.FileOffset;
9797
}
9898

99+
public override ulong MapRTVA(ulong addr)
100+
{
101+
var segment = segments.First(x => addr >= x.FileOffset && addr <= x.FileOffset + x.DecompressedSize);
102+
return addr - segment.FileOffset + segment.MemoryOffset;
103+
}
104+
99105
public override bool Search()
100106
{
101107
return false;

Il2CppDumper/ExecutableFormats/PE.cs

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,17 @@ public override ulong MapVATR(ulong absAddr)
6464
{
6565
return 0ul;
6666
}
67-
return addr - (section.VirtualAddress - section.PointerToRawData);
67+
return addr - section.VirtualAddress + section.PointerToRawData;
68+
}
69+
70+
public override ulong MapRTVA(ulong addr)
71+
{
72+
var section = sections.FirstOrDefault(x => addr >= x.PointerToRawData && addr <= x.PointerToRawData + x.SizeOfRawData);
73+
if (section == null)
74+
{
75+
return 0ul;
76+
}
77+
return addr - section.PointerToRawData + section.VirtualAddress + imageBase;
6878
}
6979

7080
public override bool Search()

Il2CppDumper/ExecutableFormats/WebAssemblyMemory.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,11 @@ public override ulong MapVATR(ulong addr)
1414
return addr;
1515
}
1616

17+
public override ulong MapRTVA(ulong addr)
18+
{
19+
return addr;
20+
}
21+
1722
public override bool PlusSearch(int methodCount, int typeDefinitionsCount, int imageCount)
1823
{
1924
var exec = new SearchSection

Il2CppDumper/Il2Cpp/Il2Cpp.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,8 @@ public abstract class Il2Cpp : BinaryStream
3131
public Dictionary<string, ulong[]> codeGenModuleMethodPointers;
3232
public Dictionary<string, Dictionary<uint, Il2CppRGCTXDefinition[]>> rgctxsDictionary;
3333

34-
public abstract ulong MapVATR(ulong uiAddr);
34+
public abstract ulong MapVATR(ulong addr);
35+
public abstract ulong MapRTVA(ulong addr);
3536
public abstract bool Search();
3637
public abstract bool PlusSearch(int methodCount, int typeDefinitionsCount, int imageCount);
3738
public abstract bool SymbolSearch();

Il2CppDumper/Il2Cpp/Metadata.cs

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,12 @@ public sealed class Metadata : BinaryStream
1919
public Il2CppPropertyDefinition[] propertyDefs;
2020
public Il2CppCustomAttributeTypeRange[] attributeTypeRanges;
2121
private Dictionary<Il2CppImageDefinition, Dictionary<uint, int>> attributeTypeRangesDic;
22-
private Il2CppStringLiteral[] stringLiterals;
22+
public Il2CppStringLiteral[] stringLiterals;
2323
private Il2CppMetadataUsageList[] metadataUsageLists;
2424
private Il2CppMetadataUsagePair[] metadataUsagePairs;
2525
public int[] attributeTypes;
2626
public int[] interfaceIndices;
27-
public Dictionary<uint, SortedDictionary<uint, uint>> metadataUsageDic;
27+
public Dictionary<Il2CppMetadataUsage, SortedDictionary<uint, uint>> metadataUsageDic;
2828
public long maxMetadataUsages;
2929
public int[] nestedTypeIndices;
3030
public Il2CppEventDefinition[] eventDefs;
@@ -85,15 +85,17 @@ public Metadata(Stream stream) : base(stream)
8585
genericParameters = ReadMetadataClassArray<Il2CppGenericParameter>(header.genericParametersOffset, header.genericParametersCount);
8686
constraintIndices = ReadClassArray<int>(header.genericParameterConstraintsOffset, header.genericParameterConstraintsCount / 4);
8787
vtableMethods = ReadClassArray<uint>(header.vtableMethodsOffset, header.vtableMethodsCount / 4);
88-
if (Version > 16 && Version < 27) //TODO
88+
stringLiterals = ReadMetadataClassArray<Il2CppStringLiteral>(header.stringLiteralOffset, header.stringLiteralCount);
89+
if (Version > 16)
8990
{
90-
stringLiterals = ReadMetadataClassArray<Il2CppStringLiteral>(header.stringLiteralOffset, header.stringLiteralCount);
91-
metadataUsageLists = ReadMetadataClassArray<Il2CppMetadataUsageList>(header.metadataUsageListsOffset, header.metadataUsageListsCount);
92-
metadataUsagePairs = ReadMetadataClassArray<Il2CppMetadataUsagePair>(header.metadataUsagePairsOffset, header.metadataUsagePairsCount);
93-
94-
ProcessingMetadataUsage();
95-
9691
fieldRefs = ReadMetadataClassArray<Il2CppFieldRef>(header.fieldRefsOffset, header.fieldRefsCount);
92+
if (Version < 27)
93+
{
94+
metadataUsageLists = ReadMetadataClassArray<Il2CppMetadataUsageList>(header.metadataUsageListsOffset, header.metadataUsageListsCount);
95+
metadataUsagePairs = ReadMetadataClassArray<Il2CppMetadataUsagePair>(header.metadataUsagePairsOffset, header.metadataUsagePairsCount);
96+
97+
ProcessingMetadataUsage();
98+
}
9799
}
98100
if (Version > 20)
99101
{
@@ -178,10 +180,10 @@ public string GetStringLiteralFromIndex(uint index)
178180

179181
private void ProcessingMetadataUsage()
180182
{
181-
metadataUsageDic = new Dictionary<uint, SortedDictionary<uint, uint>>();
182-
for (uint i = 1; i <= 6u; i++)
183+
metadataUsageDic = new Dictionary<Il2CppMetadataUsage, SortedDictionary<uint, uint>>();
184+
for (uint i = 1; i <= 6; i++)
183185
{
184-
metadataUsageDic[i] = new SortedDictionary<uint, uint>();
186+
metadataUsageDic[(Il2CppMetadataUsage)i] = new SortedDictionary<uint, uint>();
185187
}
186188
foreach (var metadataUsageList in metadataUsageLists)
187189
{
@@ -191,7 +193,7 @@ private void ProcessingMetadataUsage()
191193
var metadataUsagePair = metadataUsagePairs[offset];
192194
var usage = GetEncodedIndexType(metadataUsagePair.encodedSourceIndex);
193195
var decodedIndex = GetDecodedMethodIndex(metadataUsagePair.encodedSourceIndex);
194-
metadataUsageDic[usage][metadataUsagePair.destinationIndex] = decodedIndex;
196+
metadataUsageDic[(Il2CppMetadataUsage)usage][metadataUsagePair.destinationIndex] = decodedIndex;
195197
}
196198
}
197199
maxMetadataUsages = metadataUsageDic.Max(x => x.Value.Max(y => y.Key)) + 1;

0 commit comments

Comments
 (0)