mirror of
https://github.com/atom0s/Steamless.git
synced 2024-12-28 23:37:41 +01:00
API: PE32 - Fix SizeOfImage alignment.
API: PE64 - Fix SizeOfImage alignment. Unpacker: v20.x86 - Fix SizeOfImage alignment. Unpacker: v21.x86 - Fix SizeOfImage alignment. Unpacker: v30.x64 - Fix incorrect TlsOepRva being stored and used. Unpacker: v30.x64 - Fix incorrect TlsOepRva calculations when reading payload and SteamDRMP.dll. Unpacker: v31.x64 - Fix incorrect TlsOepRva being stored and used. Unpacker: v31.x64 - Fix incorrect TlsOepRva calculations when reading payload and SteamDRMP.dll.
This commit is contained in:
parent
079a086129
commit
0ad40aeabd
8 changed files with 16 additions and 16 deletions
|
@ -328,7 +328,7 @@ namespace Steamless.API.PE32
|
||||||
|
|
||||||
// Update the size of the image..
|
// Update the size of the image..
|
||||||
var ntHeaders = this.NtHeaders;
|
var ntHeaders = this.NtHeaders;
|
||||||
ntHeaders.OptionalHeader.SizeOfImage = this.Sections.Last().VirtualAddress + this.Sections.Last().VirtualSize;
|
ntHeaders.OptionalHeader.SizeOfImage = (uint)this.GetAlignment(this.Sections.Last().VirtualAddress + this.Sections.Last().VirtualSize, this.NtHeaders.OptionalHeader.SectionAlignment);
|
||||||
this.NtHeaders = ntHeaders;
|
this.NtHeaders = ntHeaders;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -331,7 +331,7 @@ namespace Steamless.API.PE64
|
||||||
|
|
||||||
// Update the size of the image..
|
// Update the size of the image..
|
||||||
var ntHeaders = this.NtHeaders;
|
var ntHeaders = this.NtHeaders;
|
||||||
ntHeaders.OptionalHeader.SizeOfImage = this.Sections.Last().VirtualAddress + this.Sections.Last().VirtualSize;
|
ntHeaders.OptionalHeader.SizeOfImage = (uint)this.GetAlignment(this.Sections.Last().VirtualAddress + this.Sections.Last().VirtualSize, this.NtHeaders.OptionalHeader.SectionAlignment);
|
||||||
this.NtHeaders = ntHeaders;
|
this.NtHeaders = ntHeaders;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -324,7 +324,7 @@ namespace Steamless.Unpacker.Variant20.x86
|
||||||
var ntHeaders = this.File.NtHeaders;
|
var ntHeaders = this.File.NtHeaders;
|
||||||
var lastSection = this.File.Sections[this.File.Sections.Count - 1];
|
var lastSection = this.File.Sections[this.File.Sections.Count - 1];
|
||||||
ntHeaders.OptionalHeader.AddressOfEntryPoint = this.File.GetRvaFromVa(this.StubHeader.OEP);
|
ntHeaders.OptionalHeader.AddressOfEntryPoint = this.File.GetRvaFromVa(this.StubHeader.OEP);
|
||||||
ntHeaders.OptionalHeader.SizeOfImage = lastSection.VirtualAddress + lastSection.VirtualSize;
|
ntHeaders.OptionalHeader.SizeOfImage = this.File.GetAlignment(lastSection.VirtualAddress + lastSection.VirtualSize, this.File.NtHeaders.OptionalHeader.SectionAlignment);
|
||||||
this.File.NtHeaders = ntHeaders;
|
this.File.NtHeaders = ntHeaders;
|
||||||
|
|
||||||
// Write the NT headers to the file..
|
// Write the NT headers to the file..
|
||||||
|
|
|
@ -451,7 +451,7 @@ namespace Steamless.Unpacker.Variant21.x86
|
||||||
var lastSection = this.File.Sections[this.File.Sections.Count - 1];
|
var lastSection = this.File.Sections[this.File.Sections.Count - 1];
|
||||||
var originalEntry = BitConverter.ToUInt32(this.PayloadData.Skip(this.SteamDrmpOffsets[2]).Take(4).ToArray(), 0);
|
var originalEntry = BitConverter.ToUInt32(this.PayloadData.Skip(this.SteamDrmpOffsets[2]).Take(4).ToArray(), 0);
|
||||||
ntHeaders.OptionalHeader.AddressOfEntryPoint = this.File.GetRvaFromVa(originalEntry);
|
ntHeaders.OptionalHeader.AddressOfEntryPoint = this.File.GetRvaFromVa(originalEntry);
|
||||||
ntHeaders.OptionalHeader.SizeOfImage = lastSection.VirtualAddress + lastSection.VirtualSize;
|
ntHeaders.OptionalHeader.SizeOfImage = this.File.GetAlignment(lastSection.VirtualAddress + lastSection.VirtualSize, this.File.NtHeaders.OptionalHeader.SectionAlignment);
|
||||||
this.File.NtHeaders = ntHeaders;
|
this.File.NtHeaders = ntHeaders;
|
||||||
|
|
||||||
// Write the NT headers to the file..
|
// Write the NT headers to the file..
|
||||||
|
|
|
@ -233,7 +233,7 @@ namespace Steamless.Unpacker.Variant30.x64
|
||||||
|
|
||||||
// Tls was valid for the real oep..
|
// Tls was valid for the real oep..
|
||||||
this.TlsAsOep = true;
|
this.TlsAsOep = true;
|
||||||
this.TlsOepRva = fileOffset;
|
this.TlsOepRva = this.File.GetRvaFromVa(this.File.TlsCallbacks[0]);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -246,7 +246,7 @@ namespace Steamless.Unpacker.Variant30.x64
|
||||||
private bool Step2()
|
private bool Step2()
|
||||||
{
|
{
|
||||||
// Obtain the payload address and size..
|
// Obtain the payload address and size..
|
||||||
var payloadAddr = this.File.GetFileOffsetFromRva(this.TlsAsOep ? this.TlsOepRva : this.File.NtHeaders.OptionalHeader.AddressOfEntryPoint - this.StubHeader.BindSectionOffset);
|
var payloadAddr = this.File.GetFileOffsetFromRva(this.TlsAsOep ? this.TlsOepRva - this.StubHeader.BindSectionOffset : this.File.NtHeaders.OptionalHeader.AddressOfEntryPoint - this.StubHeader.BindSectionOffset);
|
||||||
var payloadSize = (this.StubHeader.PayloadSize + 0x0F) & 0xFFFFFFF0;
|
var payloadSize = (this.StubHeader.PayloadSize + 0x0F) & 0xFFFFFFF0;
|
||||||
|
|
||||||
// Do nothing if there is no payload..
|
// Do nothing if there is no payload..
|
||||||
|
@ -296,7 +296,7 @@ namespace Steamless.Unpacker.Variant30.x64
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
// Obtain the SteamDRMP.dll file address and data..
|
// Obtain the SteamDRMP.dll file address and data..
|
||||||
var drmpAddr = this.File.GetFileOffsetFromRva(this.TlsAsOep ? this.TlsOepRva : this.File.NtHeaders.OptionalHeader.AddressOfEntryPoint - this.StubHeader.BindSectionOffset + this.StubHeader.DRMPDllOffset);
|
var drmpAddr = this.File.GetFileOffsetFromRva(this.TlsAsOep ? this.TlsOepRva - this.StubHeader.BindSectionOffset + this.StubHeader.DRMPDllOffset : this.File.NtHeaders.OptionalHeader.AddressOfEntryPoint - this.StubHeader.BindSectionOffset + this.StubHeader.DRMPDllOffset);
|
||||||
var drmpData = new byte[this.StubHeader.DRMPDllSize];
|
var drmpData = new byte[this.StubHeader.DRMPDllSize];
|
||||||
Array.Copy(this.File.FileData, (long)drmpAddr, drmpData, 0, drmpData.Length);
|
Array.Copy(this.File.FileData, (long)drmpAddr, drmpData, 0, drmpData.Length);
|
||||||
|
|
||||||
|
|
|
@ -238,7 +238,7 @@ namespace Steamless.Unpacker.Variant30.x86
|
||||||
|
|
||||||
// Tls was valid for the real oep..
|
// Tls was valid for the real oep..
|
||||||
this.TlsAsOep = true;
|
this.TlsAsOep = true;
|
||||||
this.TlsOepRva = fileOffset;
|
this.TlsOepRva = this.File.GetRvaFromVa(this.File.TlsCallbacks[0]);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -251,7 +251,7 @@ namespace Steamless.Unpacker.Variant30.x86
|
||||||
private bool Step2()
|
private bool Step2()
|
||||||
{
|
{
|
||||||
// Obtain the payload address and size..
|
// Obtain the payload address and size..
|
||||||
var payloadAddr = this.File.GetFileOffsetFromRva(this.TlsAsOep ? this.TlsOepRva : this.File.NtHeaders.OptionalHeader.AddressOfEntryPoint - this.StubHeader.BindSectionOffset);
|
var payloadAddr = this.File.GetFileOffsetFromRva(this.TlsAsOep ? this.TlsOepRva - this.StubHeader.BindSectionOffset : this.File.NtHeaders.OptionalHeader.AddressOfEntryPoint - this.StubHeader.BindSectionOffset);
|
||||||
var payloadSize = (this.StubHeader.PayloadSize + 0x0F) & 0xFFFFFFF0;
|
var payloadSize = (this.StubHeader.PayloadSize + 0x0F) & 0xFFFFFFF0;
|
||||||
|
|
||||||
// Do nothing if there is no payload..
|
// Do nothing if there is no payload..
|
||||||
|
@ -301,7 +301,7 @@ namespace Steamless.Unpacker.Variant30.x86
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
// Obtain the SteamDRMP.dll file address and data..
|
// Obtain the SteamDRMP.dll file address and data..
|
||||||
var drmpAddr = this.File.GetFileOffsetFromRva(this.TlsAsOep ? this.TlsOepRva : this.File.NtHeaders.OptionalHeader.AddressOfEntryPoint - this.StubHeader.BindSectionOffset + this.StubHeader.DRMPDllOffset);
|
var drmpAddr = this.File.GetFileOffsetFromRva(this.TlsAsOep ? this.TlsOepRva - this.StubHeader.BindSectionOffset + this.StubHeader.DRMPDllOffset : this.File.NtHeaders.OptionalHeader.AddressOfEntryPoint - this.StubHeader.BindSectionOffset + this.StubHeader.DRMPDllOffset);
|
||||||
var drmpData = new byte[this.StubHeader.DRMPDllSize];
|
var drmpData = new byte[this.StubHeader.DRMPDllSize];
|
||||||
Array.Copy(this.File.FileData, drmpAddr, drmpData, 0, drmpData.Length);
|
Array.Copy(this.File.FileData, drmpAddr, drmpData, 0, drmpData.Length);
|
||||||
|
|
||||||
|
|
|
@ -229,7 +229,7 @@ namespace Steamless.Unpacker.Variant31.x64
|
||||||
|
|
||||||
// Tls was valid for the real oep..
|
// Tls was valid for the real oep..
|
||||||
this.TlsAsOep = true;
|
this.TlsAsOep = true;
|
||||||
this.TlsOepRva = fileOffset;
|
this.TlsOepRva = this.File.GetRvaFromVa(this.File.TlsCallbacks[0]);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -242,7 +242,7 @@ namespace Steamless.Unpacker.Variant31.x64
|
||||||
private bool Step2()
|
private bool Step2()
|
||||||
{
|
{
|
||||||
// Obtain the payload address and size..
|
// Obtain the payload address and size..
|
||||||
var payloadAddr = this.File.GetFileOffsetFromRva(this.TlsAsOep ? this.TlsOepRva : this.File.NtHeaders.OptionalHeader.AddressOfEntryPoint - this.StubHeader.BindSectionOffset);
|
var payloadAddr = this.File.GetFileOffsetFromRva(this.TlsAsOep ? this.TlsOepRva - this.StubHeader.BindSectionOffset : this.File.NtHeaders.OptionalHeader.AddressOfEntryPoint - this.StubHeader.BindSectionOffset);
|
||||||
var payloadSize = (this.StubHeader.PayloadSize + 0x0F) & 0xFFFFFFF0;
|
var payloadSize = (this.StubHeader.PayloadSize + 0x0F) & 0xFFFFFFF0;
|
||||||
|
|
||||||
// Do nothing if there is no payload..
|
// Do nothing if there is no payload..
|
||||||
|
@ -292,7 +292,7 @@ namespace Steamless.Unpacker.Variant31.x64
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
// Obtain the SteamDRMP.dll file address and data..
|
// Obtain the SteamDRMP.dll file address and data..
|
||||||
var drmpAddr = this.File.GetFileOffsetFromRva(this.TlsAsOep ? this.TlsOepRva : this.File.NtHeaders.OptionalHeader.AddressOfEntryPoint - this.StubHeader.BindSectionOffset + this.StubHeader.DRMPDllOffset);
|
var drmpAddr = this.File.GetFileOffsetFromRva(this.TlsAsOep ? this.TlsOepRva - this.StubHeader.BindSectionOffset + this.StubHeader.DRMPDllOffset : this.File.NtHeaders.OptionalHeader.AddressOfEntryPoint - this.StubHeader.BindSectionOffset + this.StubHeader.DRMPDllOffset);
|
||||||
var drmpData = new byte[this.StubHeader.DRMPDllSize];
|
var drmpData = new byte[this.StubHeader.DRMPDllSize];
|
||||||
Array.Copy(this.File.FileData, (long)drmpAddr, drmpData, 0, drmpData.Length);
|
Array.Copy(this.File.FileData, (long)drmpAddr, drmpData, 0, drmpData.Length);
|
||||||
|
|
||||||
|
|
|
@ -234,7 +234,7 @@ namespace Steamless.Unpacker.Variant31.x86
|
||||||
|
|
||||||
// Tls was valid for the real oep..
|
// Tls was valid for the real oep..
|
||||||
this.TlsAsOep = true;
|
this.TlsAsOep = true;
|
||||||
this.TlsOepRva = fileOffset;
|
this.TlsOepRva = this.File.GetRvaFromVa(this.File.TlsCallbacks[0]);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -247,7 +247,7 @@ namespace Steamless.Unpacker.Variant31.x86
|
||||||
private bool Step2()
|
private bool Step2()
|
||||||
{
|
{
|
||||||
// Obtain the payload address and size..
|
// Obtain the payload address and size..
|
||||||
var payloadAddr = this.File.GetFileOffsetFromRva(this.TlsAsOep ? this.TlsOepRva : this.File.NtHeaders.OptionalHeader.AddressOfEntryPoint - this.StubHeader.BindSectionOffset);
|
var payloadAddr = this.File.GetFileOffsetFromRva(this.TlsAsOep ? this.TlsOepRva - this.StubHeader.BindSectionOffset : this.File.NtHeaders.OptionalHeader.AddressOfEntryPoint - this.StubHeader.BindSectionOffset);
|
||||||
var payloadSize = (this.StubHeader.PayloadSize + 0x0F) & 0xFFFFFFF0;
|
var payloadSize = (this.StubHeader.PayloadSize + 0x0F) & 0xFFFFFFF0;
|
||||||
|
|
||||||
// Do nothing if there is no payload..
|
// Do nothing if there is no payload..
|
||||||
|
@ -297,7 +297,7 @@ namespace Steamless.Unpacker.Variant31.x86
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
// Obtain the SteamDRMP.dll file address and data..
|
// Obtain the SteamDRMP.dll file address and data..
|
||||||
var drmpAddr = this.File.GetFileOffsetFromRva(this.TlsAsOep ? this.TlsOepRva : this.File.NtHeaders.OptionalHeader.AddressOfEntryPoint - this.StubHeader.BindSectionOffset + this.StubHeader.DRMPDllOffset);
|
var drmpAddr = this.File.GetFileOffsetFromRva(this.TlsAsOep ? this.TlsOepRva - this.StubHeader.BindSectionOffset + this.StubHeader.DRMPDllOffset : this.File.NtHeaders.OptionalHeader.AddressOfEntryPoint - this.StubHeader.BindSectionOffset + this.StubHeader.DRMPDllOffset);
|
||||||
var drmpData = new byte[this.StubHeader.DRMPDllSize];
|
var drmpData = new byte[this.StubHeader.DRMPDllSize];
|
||||||
Array.Copy(this.File.FileData, drmpAddr, drmpData, 0, drmpData.Length);
|
Array.Copy(this.File.FileData, drmpAddr, drmpData, 0, drmpData.Length);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue