Restore 0.85 compatibility for PS3 Binary Decryption

0.85 elfs break here due to them not having a version header offset.

Very unlikely these elfs will ever load but its useful to be able to decrypt them at least.

Co-authored-by: Elad <18193363+elad335@users.noreply.github.com>
This commit is contained in:
Haxy
2026-05-03 00:28:47 +01:00
committed by Elad
parent 155883ea2a
commit a6fb0c8931
+19 -7
View File
@@ -807,6 +807,8 @@ bool SELFDecrypter::LoadHeaders(bool isElf32, SelfAdditionalInfo* out_info)
self_f.seek(0); self_f.seek(0);
sce_hdr.Load(self_f); sce_hdr.Load(self_f);
const usz self_size = self_f.size();
if (out_info) if (out_info)
{ {
*out_info = {}; *out_info = {};
@@ -880,8 +882,9 @@ bool SELFDecrypter::LoadHeaders(bool isElf32, SelfAdditionalInfo* out_info)
for(u32 i = 0; i < (isElf32 ? elf32_hdr.e_phnum : elf64_hdr.e_phnum); ++i) for(u32 i = 0; i < (isElf32 ? elf32_hdr.e_phnum : elf64_hdr.e_phnum); ++i)
{ {
if (self_f.pos() >= self_f.size()) if (self_f.pos() >= self_size)
{ {
// Read out of bounds (file is truncated or corrupted)
return false; return false;
} }
@@ -889,15 +892,23 @@ bool SELFDecrypter::LoadHeaders(bool isElf32, SelfAdditionalInfo* out_info)
m_seg_ext_hdr.back().Load(self_f); m_seg_ext_hdr.back().Load(self_f);
} }
if (m_ext_hdr.version_hdr_offset == 0 || utils::add_saturate<u64>(m_ext_hdr.version_hdr_offset, sizeof(version_header)) > self_f.size()) if (m_ext_hdr.version_hdr_offset == 0)
{ {
// 0.85 Selfs have version_hdr_offset set to 0
m_version_hdr = {};
}
else if (utils::add_saturate<u64>(m_ext_hdr.version_hdr_offset, sizeof(version_header)) > self_size)
{
// Read out of bounds (file is truncated or corrupted)
return false; return false;
} }
else
{
// Read SCE version info.
self_f.seek(m_ext_hdr.version_hdr_offset);
// Read SCE version info. m_version_hdr.Load(self_f);
self_f.seek(m_ext_hdr.version_hdr_offset); }
m_version_hdr.Load(self_f);
// Read control info. // Read control info.
m_supplemental_hdr_arr.clear(); m_supplemental_hdr_arr.clear();
@@ -905,8 +916,9 @@ bool SELFDecrypter::LoadHeaders(bool isElf32, SelfAdditionalInfo* out_info)
for (u64 i = 0; i < m_ext_hdr.supplemental_hdr_size;) for (u64 i = 0; i < m_ext_hdr.supplemental_hdr_size;)
{ {
if (self_f.pos() >= self_f.size()) if (self_f.pos() >= self_size)
{ {
// Read out of bounds (file is truncated or corrupted)
return false; return false;
} }