apple-data 0.1.0 → 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/apple_data/boot_args.rb +5 -0
- data/lib/apple_data/fdr.rb +30 -0
- data/lib/apple_data/ioreg.rb +57 -0
- data/lib/apple_data/ipsw.rb +25 -0
- data/lib/apple_data/keybag.rb +56 -0
- data/lib/apple_data/lockdown.rb +48 -0
- data/lib/apple_data/macho.rb +5 -0
- data/lib/apple_data/version.rb +5 -0
- data/lib/apple_data.rb +8 -0
- data/share/4cc.yaml +297 -293
- data/share/apns.yaml +367 -364
- data/share/backup.yaml +47 -44
- data/share/baseband/qualcomm/mav13.yaml +26 -0
- data/share/baseband/qualcomm/mav20.yaml +45 -0
- data/share/baseband/qualcomm/mav21.yaml +254 -0
- data/share/baseband.yaml +290 -1
- data/share/bluetooth.yaml +75 -71
- data/share/boot_args.yaml +863 -855
- data/share/bridgeos.yaml +174 -131
- data/share/bundles.yaml +56 -60
- data/share/coprocessor.yaml +64 -0
- data/share/cores.yaml +72 -47
- data/share/debug.yaml +13 -0
- data/share/defaults.yaml +5 -0
- data/share/dnssd.yaml +171 -166
- data/share/entitlements.yaml +10391 -0
- data/share/environment_variables.yaml +354 -0
- data/share/esim.yaml +7 -0
- data/share/fdr.yaml +150 -148
- data/share/firmware.yaml +1310 -0
- data/share/homekit.yaml +14 -14
- data/share/iboot.yaml +143 -0
- data/share/icloud.yaml +11 -8
- data/share/img4.yaml +454 -453
- data/share/ioreg.yaml +5647 -5642
- data/share/ipsw.yaml +51505 -1099
- data/share/kext.yaml +3491 -1718
- data/share/keybags/7000.yaml +44342 -0
- data/share/keybags/7001.yaml +19430 -0
- data/share/keybags/7002.yaml +292 -0
- data/share/keybags/8000.yaml +82065 -0
- data/share/keybags/8001.yaml +29655 -0
- data/share/keybags/8004.yaml +295 -0
- data/share/keybags/8006.yaml +65 -0
- data/share/keybags/8010.yaml +23899 -0
- data/share/keybags/8011.yaml +4409 -0
- data/share/keybags/8015.yaml +23626 -0
- data/share/keybags/8020.yaml +4488 -0
- data/share/keybags/8027.yaml +43 -0
- data/share/keybags/8030.yaml +8687 -0
- data/share/keybags/8101.yaml +8595 -0
- data/share/keybags/8720.yaml +2026 -0
- data/share/keybags/8900.yaml +2344 -0
- data/share/keybags/8920.yaml +6761 -0
- data/share/keybags/8922.yaml +3141 -0
- data/share/keybags/8930.yaml +20583 -0
- data/share/keybags/8940.yaml +36319 -0
- data/share/keybags/8942.yaml +17343 -0
- data/share/keybags/8945.yaml +23360 -0
- data/share/keybags/8947.yaml +1384 -0
- data/share/keybags/8950.yaml +16258 -0
- data/share/keybags/8955.yaml +52163 -0
- data/share/keybags/8960.yaml +49499 -0
- data/share/keys.yaml +56 -0
- data/share/lightning.yaml +26 -23
- data/share/lockdownd.yaml +74 -71
- data/share/mach_o.yaml +204 -172
- data/share/mobile_assets.yaml +113 -127
- data/share/mobile_gestalt.yaml +2447 -2444
- data/share/nvram.yaml +463 -441
- data/share/ota.yaml +4 -1
- data/share/pki.yaml +103 -99
- data/share/platforms.yaml +35 -31
- data/share/pmu.yaml +52 -26
- data/share/registers.yaml +1579 -1603
- data/share/resources.yaml +202 -198
- data/share/sep.yaml +210 -206
- data/share/services.yaml +641 -636
- data/share/sip.yaml +64 -0
- data/share/smc.yaml +7 -0
- data/share/syscfg.yaml +4 -1
- data/share/tipw_sync.yaml +79103 -0
- data/share/vmapple.yaml +35 -0
- metadata +80 -15
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 18210321b989a92b229f328c7b98efff91cbadb5663dc91ec437bc44fdd1db19
|
|
4
|
+
data.tar.gz: 237f98dc8650687b41b341922d573e896f4ed64e178b9d52e854d907766e171a
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 95110443f487a8958365cd5ca4ef25ef41f0bd5468bdbc9a3d2a443c7cdce5ea520329d7612b142125c316f807c4d6ed62d39bbae84d17beb7bdd4cfa3c1e125
|
|
7
|
+
data.tar.gz: 2c9712af1124372baf6cd24bab8954cd8d90366e8f18b01afec1943aabf31cdfaeb04da67d4fbd670269237bfa2ebe48b74ffc02eff2530741e0fc2d2e4864d4
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# typed: true
|
|
2
|
+
# frozen_string_literal: true
|
|
3
|
+
|
|
4
|
+
# Factory Device Restore
|
|
5
|
+
class FDRData < DataFile
|
|
6
|
+
def initialize
|
|
7
|
+
super 'fdr.yaml'
|
|
8
|
+
|
|
9
|
+
@data ||= {}
|
|
10
|
+
|
|
11
|
+
@data['properties'] = []
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def ensure_property(prop)
|
|
15
|
+
prop_instance = @data['properties'].find { |p| p['name'] == prop }
|
|
16
|
+
unless prop_instance
|
|
17
|
+
prop_instance = {}
|
|
18
|
+
prop_instance['name'] = prop
|
|
19
|
+
prop_instance['description'] = nil
|
|
20
|
+
@data['properties'] << prop_instance
|
|
21
|
+
end
|
|
22
|
+
prop_instance
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def data
|
|
26
|
+
@data['properties'].sort_by! { |prop| prop['name'] }
|
|
27
|
+
|
|
28
|
+
@data
|
|
29
|
+
end
|
|
30
|
+
end
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
# typed: true
|
|
2
|
+
# frozen_string_literal: true
|
|
3
|
+
|
|
4
|
+
# Data file for the IOReg data
|
|
5
|
+
class IORegData < DataFile
|
|
6
|
+
def initialize
|
|
7
|
+
super 'ioreg.yaml'
|
|
8
|
+
|
|
9
|
+
@classes = []
|
|
10
|
+
|
|
11
|
+
@data['classes'].each do |single_class|
|
|
12
|
+
@classes << IORegClass.load_one(single_class)
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def data
|
|
17
|
+
@data = {}
|
|
18
|
+
@data['classes'] = @classes.map(&:to_h)
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
# A single IOKit class
|
|
23
|
+
class IORegClass
|
|
24
|
+
attr_accessor :description, :name, :parents, :known_names
|
|
25
|
+
|
|
26
|
+
def initialize(klass_name)
|
|
27
|
+
@name = klass_name
|
|
28
|
+
@parents = []
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def self.for_name(name)
|
|
32
|
+
@instances ||= {}
|
|
33
|
+
|
|
34
|
+
@instances[name] = IORegClass.new name unless @instances.key? name
|
|
35
|
+
|
|
36
|
+
@instances[name]
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def self.values
|
|
40
|
+
@instances.values.sort_by(&:name)
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def self.load_one(hash)
|
|
44
|
+
instance = for_name hash['name']
|
|
45
|
+
instance.description = hash['description']
|
|
46
|
+
instance.parents = hash['parents']
|
|
47
|
+
instance.known_names = (hash['known_names'] || []).sort
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def to_h
|
|
51
|
+
{ 'name' => @name, 'description' => @description, 'parents' => @parents, 'known_names' => @known_names }
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def user_client?
|
|
55
|
+
@parents.include? 'IOUserClient'
|
|
56
|
+
end
|
|
57
|
+
end
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'zip'
|
|
4
|
+
require 'cfpropertylist'
|
|
5
|
+
|
|
6
|
+
# Represents an IPSW on disk and provides helper access
|
|
7
|
+
class IPSW
|
|
8
|
+
def initialize(path)
|
|
9
|
+
@path = path
|
|
10
|
+
@zip = Zip::File.open(@path)
|
|
11
|
+
@manifest = CFPropertyList.guess(@zip.get_entry('BuildManifest.plist').get_input_stream.read)
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def baseband_files
|
|
15
|
+
result = []
|
|
16
|
+
@manifest['BuildIdentities'].each do |identity|
|
|
17
|
+
identity['Manifest'].each do |key, value|
|
|
18
|
+
result << value if key == 'BasebandFirmware'
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
result
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def img4_files; end
|
|
25
|
+
end
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module AppleData
|
|
4
|
+
# Represents a GID grouping of encrypted and decrypted keybags
|
|
5
|
+
class GIDKeyBag < DataFile
|
|
6
|
+
@keybags = {}
|
|
7
|
+
cattr_reader :keybags
|
|
8
|
+
|
|
9
|
+
class << self
|
|
10
|
+
def new(chip_id)
|
|
11
|
+
self.[](chip_id)
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def save_all
|
|
15
|
+
@keybags.each do |_key, keybag|
|
|
16
|
+
keybag.save
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def [](chip_id)
|
|
21
|
+
chip_id = chip_id.to_i
|
|
22
|
+
return @keybags[chip_id] if @keybags.key? chip_id
|
|
23
|
+
|
|
24
|
+
instance = allocate
|
|
25
|
+
instance.send(:initialize, chip_id)
|
|
26
|
+
@keybags[chip_id] = instance
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def initialize(chip_id)
|
|
31
|
+
super('keybags', chip_id.to_s)
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def get_board(board_id)
|
|
35
|
+
board_id = board_id.to_i
|
|
36
|
+
BoardKeyBag.new self, board_id, collection(:keybag_boards).ensure_key(board_id, description: false)
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
# A keybag of builds for a particular build
|
|
40
|
+
class BoardKeyBag
|
|
41
|
+
def initialize(gid_keybag, board_id, board)
|
|
42
|
+
@keybag = gid_keybag
|
|
43
|
+
@board_id = board_id
|
|
44
|
+
@board = board
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def merge_keydb_build(build_id, build)
|
|
48
|
+
return unless build['keybags']
|
|
49
|
+
|
|
50
|
+
@board[build_id] ||= {}
|
|
51
|
+
@board[build_id]['components'] ||= {}
|
|
52
|
+
@board[build_id]['components'].reverse_merge! build['keybags']
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
end
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
# typed: true
|
|
2
|
+
# frozen_string_literal: true
|
|
3
|
+
|
|
4
|
+
# Schema file for the `lockdownd.yaml` file
|
|
5
|
+
class LockdownData < DataFile
|
|
6
|
+
def initialize
|
|
7
|
+
super 'lockdownd.yaml'
|
|
8
|
+
@data ||= {}
|
|
9
|
+
@data['clients'] ||= []
|
|
10
|
+
@data['domains'] ||= []
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def ensure_client(client)
|
|
14
|
+
@data['clients'] << client unless @data['clients'].include? client
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def ensure_domain_has_property(domain, property, _type = nil)
|
|
18
|
+
domain_instance = get_domain domain
|
|
19
|
+
|
|
20
|
+
return unless property
|
|
21
|
+
|
|
22
|
+
domain_instance['properties'] << property unless domain_instance['properties'].include? property
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def get_domain(domain)
|
|
26
|
+
result = @data['domains'].find { |d| d['name'] == domain }
|
|
27
|
+
unless result
|
|
28
|
+
result = {}
|
|
29
|
+
result['name'] = domain
|
|
30
|
+
@data['domains'] << result
|
|
31
|
+
end
|
|
32
|
+
result['description'] ||= nil
|
|
33
|
+
result['properties'] ||= []
|
|
34
|
+
result
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def data
|
|
38
|
+
@data['clients'].sort!
|
|
39
|
+
|
|
40
|
+
@data['domains'].each do |domain|
|
|
41
|
+
domain['properties'].sort!
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
@data['domains'].sort_by! { |d| d['name'] }
|
|
45
|
+
|
|
46
|
+
@data
|
|
47
|
+
end
|
|
48
|
+
end
|