param_sfo 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (4) hide show
  1. checksums.yaml +7 -0
  2. data/bin/get_sfo_info +55 -0
  3. data/lib/SFO.rb +146 -0
  4. 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: []