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; HeaderOffset = ImageOffset + (uint)LongHeaderPattern.Length;
} }
uint Version = ByteOperations.ReadUInt32(Binary, ImageOffset + 0X04);
if (ByteOperations.ReadUInt32(Binary, HeaderOffset + 0X00) != 0) if (ByteOperations.ReadUInt32(Binary, HeaderOffset + 0X00) != 0)
{ {
ImageOffset = ByteOperations.ReadUInt32(Binary, HeaderOffset + 0X00); ImageOffset = ByteOperations.ReadUInt32(Binary, HeaderOffset + 0X00);
} }
else if (ByteOperations.ReadUInt32(Binary, ImageOffset + 0x04) > 0x03)
{
ImageOffset += 0xA8;
}
else if (HeaderType == QualcommPartitionHeaderType.Short) else if (HeaderType == QualcommPartitionHeaderType.Short)
{ {
ImageOffset += 0x28; ImageOffset += 0x28;
@@ -126,20 +124,32 @@ namespace WPinternals
ImageSize = ByteOperations.ReadUInt32(Binary, HeaderOffset + 0X08); ImageSize = ByteOperations.ReadUInt32(Binary, HeaderOffset + 0X08);
CodeSize = ByteOperations.ReadUInt32(Binary, HeaderOffset + 0X0C); CodeSize = ByteOperations.ReadUInt32(Binary, HeaderOffset + 0X0C);
SignatureAddress = ByteOperations.ReadUInt32(Binary, HeaderOffset + 0X10); 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) if (SignatureAddress == 0xFFFFFFFF)
{ {
SignatureAddress = ImageAddress + CodeSize; SignatureAddress = ImageAddress + CodeSize;
} }
SignatureSize = ByteOperations.ReadUInt32(Binary, HeaderOffset + 0X14);
SignatureOffset = SignatureAddress - ImageAddress + ImageOffset;
CertificatesAddress = ByteOperations.ReadUInt32(Binary, HeaderOffset + 0X18);
if (CertificatesAddress == 0xFFFFFFFF) if (CertificatesAddress == 0xFFFFFFFF)
{ {
CertificatesAddress = SignatureAddress + SignatureSize; CertificatesAddress = SignatureAddress + SignatureSize;
} }
CertificatesSize = ByteOperations.ReadUInt32(Binary, HeaderOffset + 0X1C);
//CertificatesOffset = CertificatesAddress - ImageAddress + ImageOffset; // Headers newer than version 5 need more padding here
CertificatesOffset = ImageSize - CertificatesSize + ImageOffset; 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 CurrentCertificateOffset = CertificatesOffset;
uint CertificateSize = 0; uint CertificateSize = 0;