Editing Playstation Update Package (PUP)
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 5: | Line 5: | ||
== Location == | == Location == | ||
=== | === PSVita === | ||
The | The PSVita and PSVita TV OS can install the update as /PSP2/UPDATE/PSP2UPDAT.PUP or as /PSVITA/UPDATE/PSVUPDAT.PUP.<br /> | ||
The update comes from: | The update comes from: | ||
Line 29: | Line 29: | ||
To document. | To document. | ||
=== | === PSVita === | ||
PUP | Each PUP contain updates for different partitions of the system. Most packages, once decrypted, decompressed and pieced together are a raw disk image for the partition to update. Sometimes a TAR archive patch is also used along with the disk images but not as often. Sony usually releases three kinds of update files, each to update different components: full, systemdata and preinst. | ||
There are different types of | There are different types of PSVita .PUP: | ||
==== | ==== full ==== | ||
This contains the actual system files. The main components are <code>os0</code>, <code>vs0</code>, and the [[Boot Sequence|bootloader partition]]. | |||
==== systemdata ==== | |||
Systemdata PUPs only update the <code>sa0</code> [[Partitions|partition]]. It is likely separated from the main update due to it not regularly needing updates and size concerns. | Systemdata PUPs only update the <code>sa0</code> [[Partitions|partition]]. It is likely separated from the main update due to it not regularly needing updates and size concerns. | ||
==== | ==== preinst ==== | ||
Preinst PUPs only update the <code>pd0</code> [[Partitions|partition]]. This is the [[Welcome Park]] application and the initial setup movie. It is likely separated from the main update because of the size. | |||
==== com ==== | ==== com ==== | ||
Unknown. Maybe stands for Common. | |||
Unknown. Maybe stands for Common | |||
==== modeldiff ==== | ==== modeldiff ==== | ||
Unknown. Maybe stands for Model Differences. | |||
==== Debug ==== | |||
Debug updates for [[PTEL-XXXX]] and [[PDEL-XXXX]] do not separate into different PUPs. A single PUP will update all components. Additionally updates for PDEL units contains updates for the CP and probably other development unit specific components. | |||
== Revisions == | == Revisions == | ||
=== | === PSVita === | ||
See [https:// | See [https://playstationdev.wiki/psvitadevwiki/index.php?title=Category:Firmware_revisions]. | ||
== | == Regioning == | ||
=== PS3 === | === PS3 === | ||
There is no regioning in the .PUP files | There is no regioning in the .PUP files, they are the same for all different regions (if you were looking for regioninfo, [http://www.ps3devwiki.com/index.php?title=SKU_Models#Regioning see here]).<br /> | ||
The PS3 however gets the [[ps3-updatelist.txt]] from different servers, depending on the region of that model (last 2 numbers in the CECHxxXX SKU name). | |||
<ul> | <ul> | ||
Line 82: | Line 81: | ||
<li> [http://fbr01.ps3.update.playstation.net/update/ps3/list/br/ps3-updatelist.txt Brasil, br] (11 > 0x8F) | <li> [http://fbr01.ps3.update.playstation.net/update/ps3/list/br/ps3-updatelist.txt Brasil, br] (11 > 0x8F) | ||
</ul> | </ul> | ||
for completeness see [[Target ID]]: Reference Tool/DECR : 0x81, Debug/DEX : 0x82, and Arcade : 0xA0 | |||
Retail basic structure of the update URL: | Retail basic structure of the update URL: | ||
Line 94: | Line 92: | ||
Content: | Content: | ||
# JP(shop) | # JP(shop) | ||
Dest=83;CompatibleSystemSoftwareVersion=4.7600-; | Dest=83;CompatibleSystemSoftwareVersion=4.7600-; | ||
Line 130: | Line 128: | ||
Dest=8F;CompatibleSystemSoftwareVersion=4.7600-; | Dest=8F;CompatibleSystemSoftwareVersion=4.7600-; | ||
Dest=8F;ImageVersion=00010015;SystemSoftwareVersion=4.7600;CDN=http://dbr01.ps3.update.playstation.net/update/ps3/image/shop/2015_0903_6f462b5aaaed64263d72e1e989e4b336/PS3UPDAT.PUP;CDN_Timeout=30; | Dest=8F;ImageVersion=00010015;SystemSoftwareVersion=4.7600;CDN=http://dbr01.ps3.update.playstation.net/update/ps3/image/shop/2015_0903_6f462b5aaaed64263d72e1e989e4b336/PS3UPDAT.PUP;CDN_Timeout=30; | ||
Shop basic structure of the update URL: | Shop basic structure of the update URL: | ||
Line 136: | Line 134: | ||
(TLD=2 letter abbreviation from above region, YYYY_MMDD is release date, MD5 is 22-digits long HASH) | (TLD=2 letter abbreviation from above region, YYYY_MMDD is release date, MD5 is 22-digits long HASH) | ||
=== | === PSVita === | ||
Contrarly to PS3, there is no regioning in the .PUP files: they are the same for all different regions.<br /> | |||
However, the PSVita gets the psp2-updatelist.xml from different servers, depending on the region of that model. | |||
Retail: | Retail: | ||
Line 254: | Line 241: | ||
Retail basic structure of the update URL: | Retail basic structure of the update URL: | ||
<pre> | <pre>http://d<TLD>01.psp2.update.playstation.net/update/psp2/image/<YYYY_MMDD>/pre_<md5>/PSP2UPDAT.PUP?dest=<TLD> | ||
http://d<TLD>01.psp2.update.playstation.net/update/psp2/image/<YYYY_MMDD>/pre_<md5>/PSP2UPDAT.PUP?dest=<TLD> | (TLD=2 letter abbreviation from above region, YYYY_MMDD is release date, md5 is 22-digits long HASH)</pre> | ||
(TLD=2 letter abbreviation from above region, YYYY_MMDD is release date, md5 is 22-digits long HASH) | |||
== Installation == | == Installation == | ||
Line 448: | Line 369: | ||
0x8002F2Ex - (Turning On/Off Recovery Mode Flag) | 0x8002F2Ex - (Turning On/Off Recovery Mode Flag) | ||
= | = File structure = | ||
== Verification == | == Verification == | ||
The | The HMAC key used to verify the packages has been released. Look around for "pup-hmac". | ||
== Decryption == | |||
To decrypt the files that are unpacked using the tool, the keys are available under [[Keys]]. | |||
== Extraction == | == Extraction == | ||
The PSVita and PSVita TV update files can be extracted from .PUP using: | |||
* "[http://www.vitadevwiki.com/index.php?title=Tools PS VITA Firmware xTractor]" | |||
= | * pupunpack from [http://www.vitadevwiki.com/index.php?title=Tools#Vitatools vitatools]. | ||
== PS3 == | |||
<!--// PUP Extractor http://www.megaupload.com/?d=WILOJ5TC (outdated: incompatible output, tool not update since 27 may 2008 - autor:NDT @ ps3news) //--> | |||
=== Header === | === Header === | ||
<source lang="C"> | <source lang="C"> | ||
typedef struct | typedef struct { | ||
uint64_t magic; | |||
uint8_t format_flag; | uint8_t format_flag; | ||
uint64_t package_version; | uint64_t package_version; | ||
uint64_t image_version; | uint64_t image_version; | ||
uint64_t segment_num; | uint64_t segment_num; | ||
uint64_t | uint64_t header_length; | ||
uint64_t | uint64_t data_length; | ||
} | } PUPHeader; | ||
</source> | </source> | ||
Line 498: | Line 411: | ||
| 0x7 || 0x1 || uint8_t || Format Flag | | 0x7 || 0x1 || uint8_t || Format Flag | ||
|- | |- | ||
| 0x8 || 0x8 || unsigned long || Package Version | | 0x8 || 0x8 || unsigned long || Package Version ?Might be Format version like on PSVita? | ||
|- | |- | ||
| 0x10 || 0x8 || unsigned long || Image Version | | 0x10 || 0x8 || unsigned long || Image Version ?what is that? | ||
|- | |- | ||
| 0x18 || 0x8 || unsigned long || Segment | | 0x18 || 0x8 || unsigned long || Segment Num | ||
|- | |- | ||
| 0x20 || 0x8 || unsigned long || | | 0x20 || 0x8 || unsigned long || Header Length | ||
|- | |- | ||
| 0x28 || 0x8 || unsigned long || | | 0x28 || 0x8 || unsigned long || Data Length | ||
|- | |- | ||
| 0x30 || 0x20 * '''segment_num''' || ''' | | 0x30 || 0x20 * '''segment_num''' || '''File Table''' || File Table | ||
|- | |- | ||
| 0x30 + (0x20 * '''segment_num''') || 0x20 * '''segment_num''' || ''' | | 0x30 + (0x20 * '''segment_num''') || 0x20 * '''segment_num''' || '''Hash Table''' || Hash Table | ||
|- | |- | ||
| 0x30 + (0x40 * '''segment_num''') || 0x14 || | | 0x30 + (0x40 * '''segment_num''') || 0x14 || bytes || Header Hash | ||
|- | |- | ||
| 0x44 + (0x40 * '''segment_num''') || 0xC || | | 0x44 + (0x40 * '''segment_num''') || 0xC || bytes || Padding | ||
|} | |} | ||
=== | === File Table === | ||
The | The file table consists of a number of file entries determined by '''Segment Num''', with the format below: | ||
<source lang="C"> | <source lang="C"> | ||
typedef struct | typedef struct { | ||
uint64_t id; | uint64_t id; | ||
uint64_t offset; | uint64_t offset; | ||
uint64_t size; | uint64_t size; | ||
uint8_t padding[8]; | |||
} PUPFileEntry; | |||
} | |||
</source> | </source> | ||
{| class="wikitable" | {| class="wikitable" | ||
|- | |- | ||
! Offset | ! Offset | ||
! Length | |||
! Type | |||
! Information | |||
|- | |- | ||
| 0x0 | | 0x0 | ||
| 0x8 | |||
| unsigned long | |||
| ID | |||
|- | |- | ||
| 0x8 | | 0x8 | ||
| 0x8 | |||
| unsigned long | |||
| Offset | |||
|- | |- | ||
| | | 0x10 | ||
| 0x8 | |||
| unsigned long | |||
| Size | |||
|- | |- | ||
| | | 0x18 | ||
| 0x8 | |||
| unsigned long | |||
| Unknown | |||
|} | |} | ||
=== | === Filename IDs === | ||
PUPEntryID entries | |||
<source lang="C"> | |||
static const PUPEntryID entries[] = { | |||
{0x100, "version.txt"}, | |||
{0x101, "license.xml"}, | |||
{0x102, "promo_flags.txt"}, | |||
{0x103, "update_flags.txt"}, | |||
{0x104, "patch_build.txt"}, | |||
{0x200, "ps3swu.self"}, | |||
{0x201, "vsh.tar"}, | |||
{0x202, "dots.txt"}, | |||
{0x203, "patch_data.pkg"}, | |||
{0x300, "update_files.tar"}, | |||
{0x501, "spkg_hdr.tar"}, | |||
{0x601, "ps3swu2.self"}, | |||
{0, NULL} | |||
}; | |||
</source> | |||
{| class="wikitable | {| class="wikitable" | ||
|- | |- | ||
! Entry ID | |||
! Filename | |||
|- | |- | ||
| | | 0x100 | ||
| [[version.txt]] (aka: ps3version.txt) | |||
|- | |- | ||
| | | 0x101 | ||
| [[license.xml]] (aka: resource.txt? ) | |||
|- | |- | ||
| | | 0x102 | ||
| [[promo_flags.txt]] (only on {{shop}}) (aka: shop.txt?) | |||
|- | |- | ||
| | | 0x103 | ||
| [[update_flags.txt]] | |||
|- | |- | ||
| | | 0x104 | ||
| [[patch_build.txt]] | |||
|- | |- | ||
| | | 0x200 | ||
| [[ps3swu.self]] | |||
|- | |- | ||
| | | 0x201 | ||
| [[vsh.tar]] / font_resource.tar | |||
|- | |- | ||
| | | 0x202 | ||
| [[dots.txt]] | |||
|- | |- | ||
| | | 0x203 | ||
| [[patch_data.pkg]] | |||
|- | |- | ||
| | | 0x300 | ||
| [[update_files.tar]] | |||
|- | |- | ||
| | | 0x501 | ||
| [[spkg_hdr.tar]] (added since FW 3.56) | |||
|- | |- | ||
| | | 0x601 | ||
| [[ps3swu2.self]] (added since FW 3.56) | |||
|} | |} | ||
=== | === Hash Table === | ||
The | The hash table contains a hash entry for every file inside the PUP. | ||
<source lang="C"> | <source lang="C"> | ||
typedef struct | typedef struct { | ||
uint64_t segment_index; | uint64_t segment_index; | ||
uint8_t digest[0x14]; | uint8_t digest[0x14]; | ||
uint32_t padding; | uint32_t padding; | ||
} | } PUPHashEntry; | ||
</source> | </source> | ||
Line 664: | Line 552: | ||
| 0x0 || 0x8 || uint64_t || Segment Index | | 0x0 || 0x8 || uint64_t || Segment Index | ||
|- | |- | ||
| 0x8 || 0x14 || uint8_t[0x14] || Digest (HMAC-SHA1) | | 0x8 || 0x14 || uint8_t[0x14] || Digest (HMAC-SHA1 hash) | ||
|- | |- | ||
| 0x1C || 0x4 || uint32_t || Padding | | 0x1C || 0x4 || uint32_t || Padding | ||
|} | |} | ||
=== Header | === Header Hash === | ||
<source lang="C"> | <source lang="C"> | ||
typedef struct { | typedef struct { | ||
uint8_t | uint8_t hash[0x14]; | ||
} | } header_hash; | ||
</source> | </source> | ||
== | == PSVita == | ||
=== Differences with PS3 PUPs === | === Differences with PS3 PUPs === | ||
The file structure of the | The file structure of the PSVita PUP files is almost identical to the PS3's, although there is a slight difference in the header and the hash algorithm. | ||
* | * Whereas in PS3 the format is big-endian, for the PSVita it is little endian. | ||
* | * The '''Format Version''' field in PSVita PUP is set to 2 where in PS3 PUPs it was set to 1. | ||
* There | * There is 0x50 bytes of extra data in the header. | ||
* | * The digests used are of a longer length than in PS3 updates: 0x20 bytes (SHA-256 length) in PSVita versus 0x14 bytes (SHA-1 length) in PS3. | ||
=== Header === | === Header === | ||
{| class="wikitable" | {| class="wikitable" | ||
Line 722: | Line 587: | ||
| 0x8 || 0x8 || uint64_t || Format Version (11 digits max) | | 0x8 || 0x8 || uint64_t || Format Version (11 digits max) | ||
|- | |- | ||
| 0x10 || 0x4 || uint32_t || Version (ex: 0x01600000 on FW 1.60) | | 0x10 || 0x4 || uint32_t || Sdk Version (ex: 0x01600000 on FW 1.60) | ||
|- | |- | ||
| 0x14 || 0x4 || uint32_t || Build No | | 0x14 || 0x4 || uint32_t || Build No (ex: 0x1600 on FW 1.60) | ||
|- | |- | ||
| 0x18 || 0x8 || uint64_t || Segment Num (11 digits max) | | 0x18 || 0x8 || uint64_t || Segment Num (11 digits max) | ||
|- | |- | ||
| 0x20 || 0x8 || uint64_t || Header Length (ex: | | 0x20 || 0x8 || uint64_t || Header Length (ex: 0xE00, 0x1000) | ||
|- | |||
| 0x28 || 0x8 || uint64_t || Data Length. Equals (PUP file size - Header Length). | |||
|- | |||
| 0x30 || 0x4 || uint32_t || sign_algorithm. PSVita only. (ex: 2) | |||
|- | |||
| 0x34 || 0x4 || uint32_t || sign_key_index. PSVita only. (ex: 1) | |||
|- | |||
| 0x38 || 0x4 || uint8_t[4] || Attribute. PSVita only. | |||
|- | |- | ||
| | | 0x3C || 0x4 || uint32_t || Target. PSVita only. Maybe matches Product Code target (to check). | ||
|- | |- | ||
| | | 0x40 || 0x4 || uint32_t || Sub Target. PSVita only. Maybe matches Product Sub Code target (to check). | ||
|- | |- | ||
| | | 0x44 || 0x4 || uint32_t || Support List. PSVita only. (ex: 0xC, 0xF) | ||
|- | |- | ||
| | | 0x48 || 0x4 || uint32_t || Base Version. PSVita only. | ||
|- | |- | ||
| | | 0x4C || 0x4 || uint32_t || Base Build No. PSVita only. | ||
|- | |- | ||
| | | 0x50 || 0x30 || char[0x30] || Unknown. PSVita only. | ||
|- | |- | ||
| | | 0x80 || 0x20 * '''segment_num''' || '''File Table''' || File Table | ||
|- | |- | ||
| | | 0x80 + (0x20 * '''segment_num''') || 0x40 * '''segment_num''' || '''Hash Table''' || Hash Table | ||
|- | |||
| 0x80 + (0x60 * '''segment_num''') || 0x20 || bytes || Header Hash (maybe SHA-256?) | |||
|} | |||
=== File Table === | |||
The file table consists of a number of file entries determined by '''Segment Num''', with the format below (which is the same as the format in PS3 PUP1 files). | |||
{| class="wikitable" | |||
|- | |- | ||
! Offset !! Length !! Type !! Information | |||
|- | |- | ||
| | | 0x0 || 0x8 || unsigned long || ID | ||
|- | |- | ||
| | | 0x8 || 0x8 || unsigned long || Offset | ||
|- | |- | ||
| | | 0x10 || 0x8 || unsigned long || Size | ||
|- | |- | ||
| | | 0x18 || 0x8 || unsigned long || Sign algorithm. 2 = HMAC-SHA256 | ||
|} | |} | ||
=== | === Filename IDs === | ||
It is a mistake to try to connect a file entry ID to any specific file. A better way of organizing the update contents is through the extracted [[SCE]] encrypted file header. Nevertheless, there are certain file entry IDs that have been linked with the same data throughout all observed update packages. | |||
= | {| class="wikitable sortable" | ||
! File Entry ID !! Filename !! Notes | |||
|- | |||
| 0x100 || version.txt || Version string | |||
|- | |||
| 0x101 || license.xml || License XML | |||
|- | |||
| 0x200 || psp2swu.self || main updater | |||
|- | |||
| 0x204 || cui_setupper.self || development updater initializer | |||
|- | |||
| 0x400 || package_scewm.wm || wm means watermark. Same ID for retail PUPs. Different IDs for dev PUPs for each developer. | |||
|- | |||
| 0x401 || package_sceas.as || Unknown SCEAS magic file | |||
|- | |||
| 0x2005 || || CP firmware in early debug updates only | |||
|- | |||
| 0x2006 || || CP firmware in debug updates only | |||
|} | |||
=== Hash Table === | |||
The hash table contains a hash entry for every file inside the PUP. | |||
The hash entry format is: | |||
{| class="wikitable" | {| class="wikitable" | ||
|- | |- | ||
Line 779: | Line 674: | ||
| 0x0 || 0x8 || unsigned long || Segment Index | | 0x0 || 0x8 || unsigned long || Segment Index | ||
|- | |- | ||
| 0x8 || 0x20 || | | 0x8 || 0x20 || char[0x20] || Digest (HMAC-SHA256 hash) | ||
|- | |- | ||
| 0x28 || 0x18 || | | 0x28 || 0x18 || char[0x18] || Padding | ||
|} | |} | ||
=== Header | === Header signature / hash === | ||
After files hashes is a 0x20 bytes signature / hash. | |||
= Embedded files = | = Embedded files = | ||
Line 1,068: | Line 959: | ||
</pre> | </pre> | ||
== | == PSVita == | ||
=== preinst - 01.000.000 === | === preinst - 01.000.000 === |