param_sfo 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/bin/get_sfo_info +55 -0
- data/lib/SFO.rb +146 -0
- metadata +86 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: cf828ff35de041284fbf51306a95be0676515624
|
4
|
+
data.tar.gz: b33b136e60c56022b036ac12a206fda3110e912c
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 10733853834ea5922a3ea3cf78ddbdac85670da535bb126e4cefe91187a7f712ad0bdb51819334fe3bcec0a1bfa098ee1cd987e5781fa3664e27974db432c64c
|
7
|
+
data.tar.gz: 3cff9546770fb777ba8b0651e3cb28864e6f5df7652fa9abae27abbcb19ef034343623e5b4a4cf9bef6aa21adbf5688d3c158b16b3d214c71cf9ef8137832203
|
data/bin/get_sfo_info
ADDED
@@ -0,0 +1,55 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
require "SFO"
|
3
|
+
require "http"
|
4
|
+
|
5
|
+
def self.read_data(f)
|
6
|
+
#puts "Open"
|
7
|
+
count = 0
|
8
|
+
while record = f.read(1024)
|
9
|
+
count += record.length
|
10
|
+
if (found = /\000PSF/.match(record)) != nil
|
11
|
+
then
|
12
|
+
#puts "Found SFO magic at #{count}"
|
13
|
+
f.seek(found.begin(0) - 1024, IO::SEEK_CUR)
|
14
|
+
res = SFO::parse_sfo(f)
|
15
|
+
#puts res
|
16
|
+
if (res != nil)
|
17
|
+
then
|
18
|
+
return res
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
#puts 'Nothing found'
|
23
|
+
end
|
24
|
+
|
25
|
+
def self.get_sfo_from_pkg(url)
|
26
|
+
#puts "Requesting #{url}"
|
27
|
+
if (url.include? 'http')
|
28
|
+
then
|
29
|
+
f = StringIO.new
|
30
|
+
tries = 0;
|
31
|
+
while (f.length == 0 && tries < 5)
|
32
|
+
tries += 1;
|
33
|
+
body = HTTP.get(url).body
|
34
|
+
while((tmp = body.readpartial) != nil && f.length <= 1024*1024*3)
|
35
|
+
f << tmp
|
36
|
+
end
|
37
|
+
end
|
38
|
+
f.seek(0)
|
39
|
+
read_data(f)
|
40
|
+
else
|
41
|
+
open(url, 'r') do |f|
|
42
|
+
read_data(f)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
if (ARGV[0] == nil)
|
48
|
+
then
|
49
|
+
puts 'Usage: get_sfo_info [URL|File]'
|
50
|
+
else
|
51
|
+
sfo = self.get_sfo_from_pkg ARGV[0]
|
52
|
+
sfo.each_pair do |key,value|
|
53
|
+
puts "#{key}: #{value}"
|
54
|
+
end
|
55
|
+
end
|
data/lib/SFO.rb
ADDED
@@ -0,0 +1,146 @@
|
|
1
|
+
require "bindata"
|
2
|
+
|
3
|
+
class SFO
|
4
|
+
def self.transform_data(key,data)
|
5
|
+
case key
|
6
|
+
when :SYSTEM_VER
|
7
|
+
disp_as_hex data
|
8
|
+
when :PUBTOOLVER
|
9
|
+
disp_as_hex data
|
10
|
+
when :REMOTE_PLAY_KEY_ASSIGN
|
11
|
+
disp_as_hex data
|
12
|
+
when :DOWNLOAD_DATA_SIZE
|
13
|
+
disp_as_hex data
|
14
|
+
when :APP_TYPE
|
15
|
+
disp_as_hex data
|
16
|
+
when :PARENTAL_LEVEL
|
17
|
+
disp_as_hex data
|
18
|
+
when :PT_PARAM
|
19
|
+
disp_as_hex data
|
20
|
+
when :DEV_FLAG
|
21
|
+
disp_as_hex data
|
22
|
+
when :PUBTOOLMINVER
|
23
|
+
disp_as_hex data
|
24
|
+
when :ATTRIBUTE
|
25
|
+
Attribute.read(data.to_binary_s.reverse)
|
26
|
+
when :ATTRIBUTE2
|
27
|
+
Attribute2.read(data.to_binary_s.reverse)
|
28
|
+
else
|
29
|
+
data.to_binary_s.strip
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def self.disp_as_hex(item)
|
34
|
+
item.to_binary_s.reverse.unpack('H*')[0]
|
35
|
+
end
|
36
|
+
|
37
|
+
class Attribute < BinData::Record
|
38
|
+
bit1 :display_location_flag
|
39
|
+
bit1 :unknown_value_15
|
40
|
+
bit1 :supports_HDR
|
41
|
+
bit1 :unknown_value_14
|
42
|
+
bit1 :unknown_value_13
|
43
|
+
bit1 :requires_PSVR
|
44
|
+
bit1 :unknown_value_12
|
45
|
+
bit1 :unknown_value_11
|
46
|
+
bit1 :support_NEO_mode_on_PRO
|
47
|
+
bit1 :unknown_value_10
|
48
|
+
bit1 :unknown_value_9
|
49
|
+
bit1 :unknown_value_8
|
50
|
+
bit1 :unknown_value_7
|
51
|
+
bit1 :unknown_value_6
|
52
|
+
bit1 :unknown_value_5
|
53
|
+
bit1 :cpu_mode_7cpu
|
54
|
+
bit1 :cpu_mode_6cpu
|
55
|
+
bit1 :psvr_support
|
56
|
+
bit1 :unknown_value_4
|
57
|
+
bit1 :unknown_value_3
|
58
|
+
bit1 :unknown_value_2
|
59
|
+
bit1 :hdcp_disalbed_non_games
|
60
|
+
bit1 :hdcp_enabled
|
61
|
+
bit1 :suspend_on_output_resolution_change
|
62
|
+
bit1 :unknown_value_1
|
63
|
+
bit1 :share_button_overriden
|
64
|
+
bit1 :common_dialog_accept_system_setting
|
65
|
+
bit1 :suspend_on_lose_focus
|
66
|
+
bit1 :stereoscopic_3d
|
67
|
+
bit1 :ps_move
|
68
|
+
bit1 :common_dialog_accept_is_cross
|
69
|
+
bit1 :support_logout
|
70
|
+
end
|
71
|
+
|
72
|
+
class Attribute2 < BinData::Record
|
73
|
+
bit1 :unknown_value_24
|
74
|
+
bit1 :unknown_value_23
|
75
|
+
bit1 :unknown_value_22
|
76
|
+
bit1 :unknown_value_21
|
77
|
+
bit1 :unknown_value_20
|
78
|
+
bit1 :unknown_value_19
|
79
|
+
bit1 :unknown_value_18
|
80
|
+
bit1 :unknown_value_17
|
81
|
+
bit1 :unknown_value_16
|
82
|
+
bit1 :unknown_value_15
|
83
|
+
bit1 :unknown_value_14
|
84
|
+
bit1 :unknown_value_13
|
85
|
+
bit1 :unknown_value_12
|
86
|
+
bit1 :unknown_value_11
|
87
|
+
bit1 :unknown_value_10
|
88
|
+
bit1 :unknown_value_9
|
89
|
+
bit1 :unknown_value_8
|
90
|
+
bit1 :unknown_value_7
|
91
|
+
bit1 :unknown_value_6
|
92
|
+
bit1 :support_team_on_team_tournament_sdk4500
|
93
|
+
bit1 :support_one_on_one_match_sdk3500
|
94
|
+
bit1 :unknown_value_5
|
95
|
+
bit1 :does_not_apply_dummy_psmove_tracking_to_cpu
|
96
|
+
bit1 :support_broadcase_separate_mode
|
97
|
+
bit1 :unknown_value_4
|
98
|
+
bit1 :unknown_value_3
|
99
|
+
bit1 :psvr_eye_setting_dynamic_config
|
100
|
+
bit1 :psvr_personal_eye_setting_disabled
|
101
|
+
bit1 :unknown_value_2
|
102
|
+
bit1 :support_content_search
|
103
|
+
bit1 :support_video_recording
|
104
|
+
bit1 :unknown_value_1
|
105
|
+
end
|
106
|
+
|
107
|
+
class Header < BinData::Record
|
108
|
+
uint32le :magic
|
109
|
+
uint32le :version
|
110
|
+
uint32le :key_table_start
|
111
|
+
uint32le :data_table_start
|
112
|
+
uint32le :tables_entries
|
113
|
+
end
|
114
|
+
|
115
|
+
class Sfo_index_table_entry < BinData::Record
|
116
|
+
uint16le :key_offset
|
117
|
+
uint16le :data_fmt
|
118
|
+
uint32le :data_len
|
119
|
+
uint32le :data_max_len
|
120
|
+
uint32le :data_offset
|
121
|
+
end
|
122
|
+
|
123
|
+
class SFO < BinData::Record
|
124
|
+
endian :little
|
125
|
+
Header :header
|
126
|
+
array :index_entries, :type => Sfo_index_table_entry, :initial_length => lambda { header.tables_entries }
|
127
|
+
array :key_table, :type => :stringz, :initial_length => lambda { header.tables_entries }
|
128
|
+
array :data_table, :initial_length => lambda { header.tables_entries }, :byte_align => 4 do
|
129
|
+
#many of these should be little endian values, but we reverse byte order later.
|
130
|
+
array :data, :type => :uint8, :read_abs_offset => lambda {index_entries[index]}, :initial_length => lambda {index_entries[index].data_max_len}
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
134
|
+
#Takes a stream as an argument
|
135
|
+
def self.parse_sfo(stream)
|
136
|
+
sfo = SFO.read(stream)
|
137
|
+
unless sfo.header.magic == 1179865088
|
138
|
+
return nil
|
139
|
+
end
|
140
|
+
sfoHash = Hash[sfo.key_table.zip(sfo.data_table)].inject({}){|memo,(k,v)| memo[k.to_sym] = v; memo}
|
141
|
+
sfoHash.each_key do |key|
|
142
|
+
sfoHash[key] = transform_data(key,sfoHash[key])
|
143
|
+
end
|
144
|
+
sfoHash
|
145
|
+
end
|
146
|
+
end
|
metadata
ADDED
@@ -0,0 +1,86 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: param_sfo
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.2
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Fenny Fatal
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2018-06-07 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: bindata
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '2.4'
|
20
|
+
- - ">="
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: 2.4.3
|
23
|
+
type: :runtime
|
24
|
+
prerelease: false
|
25
|
+
version_requirements: !ruby/object:Gem::Requirement
|
26
|
+
requirements:
|
27
|
+
- - "~>"
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '2.4'
|
30
|
+
- - ">="
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: 2.4.3
|
33
|
+
- !ruby/object:Gem::Dependency
|
34
|
+
name: http
|
35
|
+
requirement: !ruby/object:Gem::Requirement
|
36
|
+
requirements:
|
37
|
+
- - "~>"
|
38
|
+
- !ruby/object:Gem::Version
|
39
|
+
version: '3.3'
|
40
|
+
- - ">="
|
41
|
+
- !ruby/object:Gem::Version
|
42
|
+
version: 3.3.0
|
43
|
+
type: :runtime
|
44
|
+
prerelease: false
|
45
|
+
version_requirements: !ruby/object:Gem::Requirement
|
46
|
+
requirements:
|
47
|
+
- - "~>"
|
48
|
+
- !ruby/object:Gem::Version
|
49
|
+
version: '3.3'
|
50
|
+
- - ">="
|
51
|
+
- !ruby/object:Gem::Version
|
52
|
+
version: 3.3.0
|
53
|
+
description: A simple parser utility for param.sfo
|
54
|
+
email: fenny@fennyfatal.com
|
55
|
+
executables:
|
56
|
+
- get_sfo_info
|
57
|
+
extensions: []
|
58
|
+
extra_rdoc_files: []
|
59
|
+
files:
|
60
|
+
- bin/get_sfo_info
|
61
|
+
- lib/SFO.rb
|
62
|
+
homepage: http://rubygems.org/gems/param_sfo
|
63
|
+
licenses:
|
64
|
+
- MIT
|
65
|
+
metadata: {}
|
66
|
+
post_install_message:
|
67
|
+
rdoc_options: []
|
68
|
+
require_paths:
|
69
|
+
- lib
|
70
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
71
|
+
requirements:
|
72
|
+
- - ">="
|
73
|
+
- !ruby/object:Gem::Version
|
74
|
+
version: '0'
|
75
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
76
|
+
requirements:
|
77
|
+
- - ">="
|
78
|
+
- !ruby/object:Gem::Version
|
79
|
+
version: '0'
|
80
|
+
requirements: []
|
81
|
+
rubyforge_project:
|
82
|
+
rubygems_version: 2.4.6
|
83
|
+
signing_key:
|
84
|
+
specification_version: 4
|
85
|
+
summary: Param.sfo
|
86
|
+
test_files: []
|