apple-data 0.1.0 → 1.0.1
Sign up to get free protection for your applications and to get access to all the features.
- 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
|