Editing SELF File Format
Jump to navigation
Jump to search
The edit can be undone. Please check the comparison below to verify that this is what you want to do, and then publish the changes below to finish undoing the edit.
Latest revision | Your text | ||
Line 1: | Line 1: | ||
ORBIS SELFs (and PUP entries) from PS4 have a somewhat different structure from the ones we see on vita and ps3. | |||
The structure is documented as follows: | |||
= SELF Header Structure = | = SELF Header Structure = | ||
Line 10: | Line 11: | ||
| 0x4 || 4 || Unknown || Always 00 01 01 12 | | 0x4 || 4 || Unknown || Always 00 01 01 12 | ||
|- | |- | ||
| 0x8 || 1 || | | 0x8 || 1 || Content Type || 1 on Self, 4 on PUP Entry | ||
|- | |- | ||
| 0x9 || 1 || | | 0x9 || 1 || Product Type || 0xC SK, 0xF SL, 0xE SM, 0x8 EBOOT and ELF and SELF, 0x9 SPRX and SDLL and SEXE, can increase by 0x10 increments for each new revision | ||
|- | |- | ||
| 0xA || 2 || Padding || | | 0xA || 2 || Padding || | ||
Line 18: | Line 19: | ||
| 0xC || 2 || Header Size || | | 0xC || 2 || Header Size || | ||
|- | |- | ||
| 0xE || 2 || Signature Size || | | 0xE || 2 || Signature Size || Metadata Size? | ||
|- | |- | ||
| 0x10 || 4 || | | 0x10 || 4 || Size of SELF || | ||
|- | |- | ||
| 0x14 || 4 || Padding || | | 0x14 || 4 || Padding || | ||
|- | |- | ||
| 0x18 || 2 || Number of Segments || 1 | | 0x18 || 2 || Number of Segments || 1 SK, 2 SL and Modules, 4 SK Elfs, 6 .selfs, 2 .sdll, 6 .sprx, 6 ShellCore, 6 eboot.bin, 2 sexe | ||
|- | |- | ||
| 0x1A || 2 || Unknown || Always 0x22 | | 0x1A || 2 || Unknown || Always 0x22 | ||
|- | |- | ||
| 0x1C || 4 || Padding || | | 0x1C || 4 || Padding || | ||
|- | |||
|} | |} | ||
== | == Self Segment Structure == | ||
Depending on the number of segments, at 0x20 the following structure follows and presents a size multiple of 0x20. | |||
Depending on the number of segments, at | |||
<pre> | <pre> | ||
typedef struct { | typedef struct | ||
unsigned long long flags; // 0x130006 / 0x00040F | { | ||
unsigned long long flags; // 0x130006 / 0x00040F | |||
unsigned long long offset; | unsigned long long offset; | ||
unsigned long long encrypted_compressed_size | unsigned long long encrypted_compressed_size | ||
unsigned long long decrypted_decompressed_size; | unsigned long long decrypted_decompressed_size ; | ||
} SEGMENT_TABLE; | } SEGMENT_TABLE; | ||
</pre> | </pre> | ||
=== Flags ID === | === The Flags ID === | ||
<pre> | <pre> | ||
enum SegFlags { | enum SegFlags | ||
{ | |||
SF_ORDR = 0x1, // ordered? | SF_ORDR = 0x1, // ordered? | ||
SF_ENCR = 0x2, // encrypted | SF_ENCR = 0x2, // encrypted | ||
Line 56: | Line 59: | ||
</pre> | </pre> | ||
=== Flags Maths === | === The Flags Maths === | ||
<pre> | <pre> | ||
uint32_t Id() { | uint32_t Id() | ||
{ | |||
return Flags >> 20; //0 or 1 | return Flags >> 20; //0 or 1 | ||
} | } | ||
bool IsOrdered() { | bool IsOrdered() | ||
{ | |||
return (Flags & 1) != 0;//0 or 1 | return (Flags & 1) != 0;//0 or 1 | ||
} | } | ||
bool IsEncrypted() { | bool IsEncrypted() | ||
{ | |||
return (Flags & 2) != 0;//0 or 2 | return (Flags & 2) != 0;//0 or 2 | ||
} | } | ||
bool IsSigned() { | bool IsSigned() | ||
{ | |||
return (Flags & 4) != 0;//0 or 4 | return (Flags & 4) != 0;//0 or 4 | ||
} | } | ||
bool IsCompressed() { | bool IsCompressed() | ||
{ | |||
return (Flags & 8) != 0;//0 or 8 | return (Flags & 8) != 0;//0 or 8 | ||
} | } | ||
bool IsBlocked() { | bool IsBlocked() | ||
{ | |||
return (Flags & 0x800) != 0;//0 or 0x800 | return (Flags & 0x800) != 0;//0 or 0x800 | ||
} | } | ||
Line 147: | Line 156: | ||
|0x11||[[CloudABI]] | |0x11||[[CloudABI]] | ||
|} | |} | ||
It is often set to <code>0</code> regardless of the target platform. | |||
|- | |- | ||
| colspan="2" | 0x08 || colspan="2" | 1 || <tt>e_ident[EI_ABIVERSION]</tt> | | colspan="2" | 0x08 || colspan="2" | 1 || <tt>e_ident[EI_ABIVERSION]</tt> | ||
Line 154: | Line 162: | ||
|- | |- | ||
| colspan="2" | 0x09 || colspan="2" | 7 || <tt>e_ident[EI_PAD]</tt> | | colspan="2" | 0x09 || colspan="2" | 7 || <tt>e_ident[EI_PAD]</tt> | ||
| | |currently unused | ||
|- | |- | ||
| colspan="2" | 0x10 || colspan="2" | 2 || <tt>e_type</tt> | | colspan="2" | 0x10 || colspan="2" | 2 || <tt>e_type</tt> | ||
Line 160: | Line 168: | ||
{| class="wikitable" | {| class="wikitable" | ||
|- | |- | ||
!Value!!Type | !Value!!Type | ||
|- | |- | ||
| | |0x00||ET_NONE | ||
|- | |- | ||
| | |0x01||ET_REL | ||
|- | |- | ||
| | |0x02||ET_EXEC | ||
|- | |- | ||
| | |0x03||ET_DYN | ||
|- | |- | ||
| | |0x04||ET_CORE | ||
|- | |- | ||
| | |0xfe00||ET_LOOS | ||
|- | |- | ||
|0xfeff||ET_HIOS | |0xfeff||ET_HIOS | ||
|- | |- | ||
|0xff00||ET_LOPROC | |0xff00||ET_LOPROC | ||
|- | |- | ||
|0xffff||ET_HIPROC | |0xffff||ET_HIPROC | ||
|} | |} | ||
|- | |- | ||
Line 321: | Line 323: | ||
|} | |} | ||
= | = SCE Special = | ||
Just before the start of the metadata a special section exists which contains the following: | |||
{| class="wikitable" | {| class="wikitable" | ||
! Offset !! Size !! Description !! Notes | ! Offset !! Size !! Description !! Notes | ||
|- | |- | ||
| 0 || | | 0 || 0x8 || AuthID || | ||
|- | |- | ||
| | | 0x8 || 0x8 || Product Type || 0xC SK, 0xF SL, 0xE SM, 0x8 EBOOT and ELF and SELF, 0x9 SPRX and SDLL and SEXE | ||
|- | |- | ||
| | | 0x10 || 0x8 || Version_1 || | ||
|- | |- | ||
| | | 0x18 || 0x8 || Version_2 || | ||
|- | |- | ||
| | | N.A/0x20 || 0x20 || Content ID || Only exists if the self is NPDRM | ||
|- | |- | ||
| | | 0x20/0x40 || 0x20 || SHA256SUM || | ||
|- | |- | ||
|} | |} | ||
= Footer Signature | = Footer Signature (Extra) = | ||
Additionally, at the bottom, there is likely a footer signature as well as some extra data (relative size) | |||