Improve RKH Reading from Qualcomm Images

This commit is contained in:
Gustave Monce
2023-03-09 21:40:23 +01:00
parent 93a5064751
commit 83c09bdc81
+20 -10
View File
@@ -105,14 +105,12 @@ namespace WPinternals
HeaderOffset = ImageOffset + (uint)LongHeaderPattern.Length;
}
uint Version = ByteOperations.ReadUInt32(Binary, ImageOffset + 0X04);
if (ByteOperations.ReadUInt32(Binary, HeaderOffset + 0X00) != 0)
{
ImageOffset = ByteOperations.ReadUInt32(Binary, HeaderOffset + 0X00);
}
else if (ByteOperations.ReadUInt32(Binary, ImageOffset + 0x04) > 0x03)
{
ImageOffset += 0xA8;
}
else if (HeaderType == QualcommPartitionHeaderType.Short)
{
ImageOffset += 0x28;
@@ -126,20 +124,32 @@ namespace WPinternals
ImageSize = ByteOperations.ReadUInt32(Binary, HeaderOffset + 0X08);
CodeSize = ByteOperations.ReadUInt32(Binary, HeaderOffset + 0X0C);
SignatureAddress = ByteOperations.ReadUInt32(Binary, HeaderOffset + 0X10);
SignatureSize = ByteOperations.ReadUInt32(Binary, HeaderOffset + 0X14);
CertificatesAddress = ByteOperations.ReadUInt32(Binary, HeaderOffset + 0X18);
CertificatesSize = ByteOperations.ReadUInt32(Binary, HeaderOffset + 0X1C);
if (SignatureAddress == 0xFFFFFFFF)
{
SignatureAddress = ImageAddress + CodeSize;
}
SignatureSize = ByteOperations.ReadUInt32(Binary, HeaderOffset + 0X14);
SignatureOffset = SignatureAddress - ImageAddress + ImageOffset;
CertificatesAddress = ByteOperations.ReadUInt32(Binary, HeaderOffset + 0X18);
if (CertificatesAddress == 0xFFFFFFFF)
{
CertificatesAddress = SignatureAddress + SignatureSize;
}
CertificatesSize = ByteOperations.ReadUInt32(Binary, HeaderOffset + 0X1C);
//CertificatesOffset = CertificatesAddress - ImageAddress + ImageOffset;
CertificatesOffset = ImageSize - CertificatesSize + ImageOffset;
// Headers newer than version 5 need more padding here
if (Version > 5)
{
ImageOffset += 0x80;
}
SignatureOffset = ImageOffset + CodeSize;
CertificatesOffset = ImageOffset + CodeSize + SignatureSize;
// Keeping just in case
// SignatureOffset = SignatureAddress - ImageAddress + ImageOffset;
// CertificatesOffset = ImageSize - CertificatesSize + ImageOffset;
uint CurrentCertificateOffset = CertificatesOffset;
uint CertificateSize = 0;