Famed homebrew developer PSDev, notorious for his work on applications such as PS3 Tools Gui Edition, has released a simple-yet-effective script that will aid fellow developers in deciphering PlayStation Vita update packages (.PUP files) by presenting you with basic information such as the package header and license files — the script is better known as PS Vita Magic Reader.
On a side note: Most of the information regarding the PlayStation Vita and it’s update files has also been made available online via VitaDevWiki.
More from PSDev:
A while back as a test I made Magic Reader v1 that extracted the Magic (SCEUF), the FW version and license.xml out of the Vita PUP. Well I just added a extraction for the whole Vita Header of PUP.
This script extracts the following:
[*]Magic(SCEUF)
[*]PUP Version
[*]License
[*]Package Version
[*]Image Version
[*]File Count
[*]Header length
[*]Package length
[*]A Unknown bit of values 0×50 in length
[*]FileTable
[*]HashTable
[*]HeaderHashAlso later I’ll add a FileTable extractor. which is determined by the FileCount.
This is a linux script and will run in any linux environment.
SCRIPT:#!/bin/bash
# PsDev 2012. this script extract the PUP magic.
#Edit from PsiColio lv1.self extractrion
#just extracts the header info from a vita pup, good for comparison kinda useless atm and most likely always.
# File names to extract from the PUP
Extract=( “Magic” “PUPVersion” “License.xml” “PackageVersion” “ImageVersion” “FileCount” “HeaderLength” “PakageLength” “UNKNOWN” “FileTable” “HashTable” “HeaderHash” )
#length starting from the offset and it ending in the offsets total length
length=( 0×8 0×10 0x724B4 0×8 0×8 0×8 0×8 0×8 0×50 0×20 0×40 0×20) #how many long the file is how much to copy, for example the Magic starts at 0×0 and the length is 0×8 bytes.
#offset of the Magic, Version and License
offset=( 0×0 0x9FF 0xC00 0×8 0×10 0×18 0×20 0×28 0×30 0×80 0×100 0×130 ) #where the file dump begins in the hex.
cont=0
printf “____________________________n”
printf ” PsDev n”
printf ” Magic Reader n”
printf “____________________________ nn”
for file in “${Extract[@]}” #tells it for a file look in Extract = the the file names
do
printf “____________________________ n”
printf ” %sn” “${file}” #file name
printf “____________________________ n”
printf “offset= %sn” “${offset[$cont]}” #tells offset of file
printf “length= %sn” “${length[$cont]}” #tells total offset length of file
printf “%sn” “${cont}”
dd if=$1 of=$file bs=1 obs=1 skip=$((${offset[$cont]})) count=$((${length[$cont]}))
cont=$(($cont+1)) # make sure the usage is “./Magic-reader.sh PSP2UPDAT.PUP”
done
How to:
Make a new file named “Magic-reader.sh”
Run “chmod +x Magic-reader.sh” to give to execution permissions
Now in terminal run it. “./Magic-reader.sh PSP2UPDAT.PUP” It will output the three files in the folder/location the scripts located in.
Example out of the old Terminal LOG in v1, not updated there is a lot more files:
./Magic-reader.sh PSP2UPDAT.PUP
____________________________
PsDev
PUP READER
________________________________________________________
Magic
____________________________
offset= 0×0
length= 0×8
0
8+0 records in
8+0 records out
8 bytes (8 B) copied, 0.0153084 s, 0.5 kB/s
____________________________
PUP_Version
____________________________
offset= 0x9FF
length= 0×10
1
16+0 records in
16+0 records out
16 bytes (16 B) copied, 0.0528894 s, 0.3 kB/s
____________________________
license.xml
____________________________
offset= 0xC00
length= 0x724B4
2
-PSDev
Source #1
Source #2