Packages (.PKG): Difference between revisions

From Vita Developer wiki
Jump to navigation Jump to search
Line 29: Line 29:
<pre>
<pre>
typedef struct{
typedef struct{
u32 magic;                     // 0x7f657874 ".ext"
u32 magic;                             // 0x7F657874 ".ext"
u32 unknown_01;                 // static = 1
u32 unknown_1;                         // static = 1
u32 header_size;               // header size (0x00000040)
u32 ext_header_size;                   // 0x40
u32 data_size;                 // data size  (0x00000180)
u32 ext_data_size;                     // 0x180
u32 data_offset;               // data start offset (0x00000100)
u32 main_ext_headers_hmac_offset;     // 0x100
u32 data_type;                 // = 0x00000360, Beta = 0x00000390, Retail 0x00000490  
u32 metadata_header_hmac;             // ex: 0x00000360, Beta = 0x00000390, Retail = 0x00000490  
u64 pkg_data_size (or offset?); // 0x20 of data at the end used for an SHA-1 of the PKG
u64 tail_offset                        // tail size seams to be always 0x1A0
                                                        (size is always 0x1a0 on retail and beta pkg?).
u32 padding1;                         // 0x00000000
u32 padding1;                   // 0x00000000
u32 pkg_key_id;                       // Beta = 0x00000001 (PSP), Retail PSVita = 0xC0000002
u32 data_type2;                 // Beta = 0x00000001, Retail 0xc0000002
u32 full_header_hmac;                 // Beta 0x00000000, Retail = 0x00000930
u32 unknown_02;                 // Beta 0x00000000, Retail = 0x00000930
u8 padding2[0x14];
u32  padding2;                   // 0x00000000
u64  padding3;                  // 0x0000000000000000
u64  padding3;                  // 0x0000000000000000
} ext_Header;
} ext_Header;
</pre>
</pre>

Revision as of 22:57, 19 April 2018


PS3 PKG / PS4 PKG


There are two kinds of PS VITA package files (.pkg):

1. PS VITA Game Packages (.pkg)

2. PS VITA System Packages (.pkg)

Keys

pkg_key_psp: 07F2C68290B50D2C33818D709B60E62B
pkg_vita_2: E31A70C9CE1DD72BF3C0622963F2ECCB
pkg_vita_3: 423ACA3A2BD5649F9686ABAD6FD8801F
pkg_vita_4: AF07FD59652527BAF13389668B17D9EA

Game Packages

Debug and Retail v1.0 (not the actual ones) PS VITA Game Package files (.pkg) can be decrypted & extracted using the "PS VITA .pkg xTractor"

A picture showing the unpacked game .pkg structure: PKGdirstruct.png

See also: System_File_Object_(SFO)_(PSF), Keys and PKG type

.ext Header

typedef struct{
	u32 magic;                             // 0x7F657874 ".ext"
	u32 unknown_1;                         // static = 1
	u32 ext_header_size;                   // 0x40
	u32 ext_data_size;                     // 0x180
	u32 main_ext_headers_hmac_offset;      // 0x100
	u32 metadata_header_hmac;              // ex: 0x00000360, Beta = 0x00000390, Retail = 0x00000490 
	u64 tail_offset                        // tail size seams to be always 0x1A0
	u32 padding1;                          // 0x00000000
	u32 pkg_key_id;                        // Beta = 0x00000001 (PSP), Retail PSVita = 0xC0000002
	u32 full_header_hmac;                  // Beta 0x00000000, Retail = 0x00000930
	u8 padding2[0x14];
} ext_Header;

PSN

Game Update

It is a bit upgraded but basicly the same as on PS3. Once a game tab is opened, the VITA downloads a PKG for this game tab. This includes update information, such as if an update if available. If thats the case, the game tab will show you a yellow arrow on the top of the screen which gives you information about the update available. This information is stored in XML's which are gathered via URL's like this example one:

 http://gs.ww.np.dl.playstation.net/ppkg/np/PCSG00001/PCSG00001_T1/0101/c653f481544f8b19/changeinfo.xml

this is the content:

<?xml version="1.0" encoding="UTF-8"?>
<changeinfo titleid="PCSG00001">
  <changes app_ver="01.01">
    <![CDATA[
オンライン仕様に関わる動作の安定性を向上しました
    ]]>
  </changes>
</changeinfo>

This is the original update PKG.

 http://gs.ww.np.dl.playstation.net/ppkg/np/PCSG00001/PCSG00001_T1/c653f481544f8b19/JP0700-PCSG00001_00-RIDGERACERPSVITA-A0101-V0100-fd9baf01343b2db6df0d434b17ef822a9699c6da-PE.pkg 

original link(SKFU BLOG)

the update is stored with the XML.

 http://gs.ww.np.dl.playstation.net/ppkg/np/[TITLE_ID]/[TITLE_ID]_T1/[Version]/[An HASH]/changeinfo.xml


Package Installer uses SceNpDrm to decrypt/extract the game package into a temporary directory. Then it calls ScePromoterUtil NID 0x86641BC6 on 1.69 and NID 0x716C81F4 on 1.80+ to "promote" (aka install) the files into the right directory in ux0. ScePromoterUtil is just a wrapper for a SceShellSvc call, so SceShell actually moves the files, then adds the LiveArea bubble and updates app.db accordingly. In theory you can use SceNpDrm and ScePromoterUtil separately and package your games in an alternative format.


System Package

PS VITA Firmware Package files (.pkg) are inside PS VITA Update Files (.pup).

Those packages can not be decrypted, yet.

Structure

Bytes are in Little Endian.

typedef struct {
    unint32_t type;          /*type of pkg. must be 0x3 (Offset 0x04)*/
    unint64_t unknown;       /*unknown but static       (Offset 0x08)*/
    unint64_t hdr_size;      /*header size              (Offset 0x10)*/
    unint64_t content_size;  /*package content size     (Offset 0x18)*/
    unint64_t size;          /*package size             (Offset 0x20)*/
} s_pkg;