From 83c09bdc81c798db5e98bb813284d3b0b928fa62 Mon Sep 17 00:00:00 2001 From: Gustave Monce Date: Thu, 9 Mar 2023 21:40:23 +0100 Subject: [PATCH] Improve RKH Reading from Qualcomm Images --- WPinternals/Models/QualcommPartition.cs | 30 ++++++++++++++++--------- 1 file changed, 20 insertions(+), 10 deletions(-) diff --git a/WPinternals/Models/QualcommPartition.cs b/WPinternals/Models/QualcommPartition.cs index ad87b59..561c2ce 100644 --- a/WPinternals/Models/QualcommPartition.cs +++ b/WPinternals/Models/QualcommPartition.cs @@ -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;