Skip to content

Commit

Permalink
Fixed #59
Browse files Browse the repository at this point in the history
  • Loading branch information
Perfare committed Jul 17, 2018
1 parent 3e66166 commit 2e89a81
Showing 1 changed file with 64 additions and 8 deletions.
72 changes: 64 additions & 8 deletions Il2CppDumper/PE.cs
Original file line number Diff line number Diff line change
Expand Up @@ -86,13 +86,25 @@ public override bool PlusSearch(int methodCount, int typeDefinitionsCount)
ulong metadataRegistration;
if (is32Bit)
{
codeRegistration = FindCodeRegistration(methodCount, rdata, text);
metadataRegistration = FindMetadataRegistration(typeDefinitionsCount, rdata, data);
codeRegistration = FindCodeRegistration(methodCount, rdata, data, text);
if (codeRegistration == 0)
codeRegistration = FindCodeRegistration(methodCount, data, rdata, text);
metadataRegistration = FindMetadataRegistration(typeDefinitionsCount, rdata, data, data);
if (metadataRegistration == 0)
metadataRegistration = FindMetadataRegistration(typeDefinitionsCount, data, rdata, data);
}
else
{
codeRegistration = FindCodeRegistration64(methodCount, rdata, text);
metadataRegistration = FindMetadataRegistration64(typeDefinitionsCount, rdata, data);
codeRegistration = FindCodeRegistration64(methodCount, rdata, data, text);
if (codeRegistration == 0)
codeRegistration = FindCodeRegistration64(methodCount, data, rdata, text);
metadataRegistration = FindMetadataRegistration64(typeDefinitionsCount, rdata, data, data);
if (metadataRegistration == 0)
metadataRegistration = FindMetadataRegistration64(typeDefinitionsCount, data, rdata, data);
/*if (metadataRegistration == 0)
metadataRegistration = FindMetadataRegistration64(typeDefinitionsCount, rdata, data, rdata);
if (metadataRegistration == 0)
metadataRegistration = FindMetadataRegistration64(typeDefinitionsCount, data, rdata, rdata);*/
}
if (codeRegistration != 0 && metadataRegistration != 0)
{
Expand All @@ -109,9 +121,10 @@ public override bool PlusSearch(int methodCount, int typeDefinitionsCount)
return false;
}

private ulong FindCodeRegistration(int count, SectionHeader search, SectionHeader range)
private ulong FindCodeRegistration(int count, SectionHeader search, SectionHeader search2, SectionHeader range)
{
var searchend = search.PointerToRawData + search.SizeOfRawData;
var search2end = search2.PointerToRawData + search2.SizeOfRawData;
var rangeend = range.VirtualAddress + range.VirtualSize;
Position = search.PointerToRawData;
while (Position < searchend)
Expand All @@ -133,6 +146,17 @@ private ulong FindCodeRegistration(int count, SectionHeader search, SectionHeade
}
Position = np;
}
else if (pointers >= search2.PointerToRawData && pointers <= search2end)
{
var np = Position;
var temp = ReadClassArray<uint>(pointers, count);
var r = Array.FindIndex(temp, x => x - imageBase < range.VirtualAddress || x - imageBase > rangeend);
if (r == -1)
{
return (ulong)add - search.PointerToRawData + search.VirtualAddress + imageBase; //VirtualAddress
}
Position = np;
}
}
catch
{
Expand All @@ -143,9 +167,10 @@ private ulong FindCodeRegistration(int count, SectionHeader search, SectionHeade
return 0;
}

private ulong FindMetadataRegistration(int typeDefinitionsCount, SectionHeader search, SectionHeader range)
private ulong FindMetadataRegistration(int typeDefinitionsCount, SectionHeader search, SectionHeader search2, SectionHeader range)
{
var searchend = search.PointerToRawData + search.SizeOfRawData;
var search2end = search2.PointerToRawData + search2.SizeOfRawData;
var rangeend = range.VirtualAddress + range.VirtualSize;
Position = search.PointerToRawData;
while (Position < searchend)
Expand All @@ -167,6 +192,15 @@ private ulong FindMetadataRegistration(int typeDefinitionsCount, SectionHeader s
return (ulong)add - 48ul - search.PointerToRawData + search.VirtualAddress + imageBase; //VirtualAddress
}
}
else if (pointers >= search2.PointerToRawData && pointers <= search2end)
{
var temp = ReadClassArray<uint>(pointers, maxMetadataUsages);
var r = Array.FindIndex(temp, x => x - imageBase < range.VirtualAddress || x - imageBase > rangeend);
if (r == -1)
{
return (ulong)add - 48ul - search.PointerToRawData + search.VirtualAddress + imageBase; //VirtualAddress
}
}
Position = np;
}
catch
Expand All @@ -178,9 +212,10 @@ private ulong FindMetadataRegistration(int typeDefinitionsCount, SectionHeader s
return 0;
}

private ulong FindCodeRegistration64(int count, SectionHeader search, SectionHeader range)
private ulong FindCodeRegistration64(int count, SectionHeader search, SectionHeader search2, SectionHeader range)
{
var searchend = search.PointerToRawData + search.SizeOfRawData;
var search2end = search2.PointerToRawData + search2.SizeOfRawData;
var rangeend = range.VirtualAddress + range.VirtualSize;
Position = search.PointerToRawData;
while (Position < searchend)
Expand All @@ -202,6 +237,17 @@ private ulong FindCodeRegistration64(int count, SectionHeader search, SectionHea
}
Position = np;
}
else if (pointers >= search2.PointerToRawData && pointers <= search2end)
{
var np = Position;
var temp = ReadClassArray<ulong>(pointers, count);
var r = Array.FindIndex(temp, x => x - imageBase < range.VirtualAddress || x - imageBase > rangeend);
if (r == -1)
{
return (ulong)add - search.PointerToRawData + search.VirtualAddress + imageBase; //VirtualAddress
}
Position = np;
}
}
catch
{
Expand All @@ -212,9 +258,10 @@ private ulong FindCodeRegistration64(int count, SectionHeader search, SectionHea
return 0;
}

private ulong FindMetadataRegistration64(int typeDefinitionsCount, SectionHeader search, SectionHeader range)
private ulong FindMetadataRegistration64(int typeDefinitionsCount, SectionHeader search, SectionHeader search2, SectionHeader range)
{
var searchend = search.PointerToRawData + search.SizeOfRawData;
var search2end = search2.PointerToRawData + search2.SizeOfRawData;
var rangeend = range.VirtualAddress + range.VirtualSize;
Position = search.PointerToRawData;
while (Position < searchend)
Expand All @@ -236,6 +283,15 @@ private ulong FindMetadataRegistration64(int typeDefinitionsCount, SectionHeader
return (ulong)add - 96ul - search.PointerToRawData + search.VirtualAddress + imageBase; //VirtualAddress
}
}
else if (pointers >= search2.PointerToRawData && pointers <= search2end)
{
var temp = ReadClassArray<ulong>(pointers, maxMetadataUsages);
var r = Array.FindIndex(temp, x => x - imageBase < range.VirtualAddress || x - imageBase > rangeend);
if (r == -1)
{
return (ulong)add - 96ul - search.PointerToRawData + search.VirtualAddress + imageBase; //VirtualAddress
}
}
Position = np;
}
catch
Expand Down

0 comments on commit 2e89a81

Please sign in to comment.