ios_backup_extractor 1.2.1 → 1.2.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 9e0c806f4af7fb994b9ae2810491713ed9c2911596ee6e40b5b1fc9e96765c96
4
- data.tar.gz: c3f6072b5d05f842e2ce085a8479634dfad298e9e967b42ca6081c60de2e280d
3
+ metadata.gz: c550f9eaaf8ec2f4415286b9ad41046ee675c0ed1f2f44ec8fc213fe0cd58649
4
+ data.tar.gz: 254cb6e8da6cb2a4eca3e72cfae3f8c0d0790d79cf577cd39b97d63011f9859a
5
5
  SHA512:
6
- metadata.gz: 6454a6faa18b7bda87039dfc1620dcaf71812c07555fc9cb34aae1b292e306e8bcc109d6907b747de52178cba7aa644c4140ca569461422d20ebd1f5ebe33d89
7
- data.tar.gz: 6623b4bf8feec91fdeefc27b1b43cbcf659a8f445d6c0d56cdfe25c0a341fae9c24df24f7cfc5a1c39f51d33456171b4a8643a76092ad5925e785b431aaa5a3c
6
+ metadata.gz: a36b324df7b41043d8f426aaa78b7bbe75857932a9cee1cad9face7fac89d0ce2f1547eb93cab5466a2e8bc4a8c67dbdacaa0a2d9a2a81df8152d98a1ee4663e
7
+ data.tar.gz: 6213ac85292d7e844ab6586fa25eabbf4c694fece157d5d4fd1b7ae6b1ff2c71f1a239979b475bc8b4623fd159aaac22e81cfa1d8cb6d60b620cde4ae7463dad
data/exe/ios CHANGED
@@ -58,6 +58,10 @@ OptionParser.new do |opts|
58
58
  backup_options[:password] = q.to_s
59
59
  end
60
60
 
61
+ opts.on('--temp FOLDER', 'Folder to use for creating temp files') do |q|
62
+ backup_options[:temp_folder] = q.to_s
63
+ end
64
+
61
65
  opts.on('--serial SERIAL', 'Target a specific device by its serial number') do |q|
62
66
  options[:serial_number] = q.to_s.strip
63
67
  end
@@ -17,7 +17,7 @@ module IosBackupExtractor
17
17
  continue unless infos.has? InfoPlist::PRODUCT_VERSION
18
18
  major = infos.versions.first
19
19
  if major <= 3
20
- raise 'iOS 3 backups are not supported'
20
+ @backups << RawBackup3.new(File.dirname(path))
21
21
  elsif major < 10
22
22
  @backups << RawBackup4.new(File.dirname(path))
23
23
  else
@@ -9,7 +9,6 @@ module IosBackupExtractor
9
9
  @backup_directory = NauktisUtils::FileBrowser.ensure_valid_directory(backup_directory)
10
10
  @info_plist = InfoPlist.new(File.join(@backup_directory, INFO_PLIST))
11
11
  @manifest_plist = IosBackupExtractor.plist_file_to_hash(File.join(@backup_directory, MANIFEST_PLIST))
12
- raise 'This looks like a very old backup (iOS 3?)' unless @manifest_plist.has_key? 'BackupKeyBag'
13
12
  end
14
13
 
15
14
  ##
@@ -5,6 +5,7 @@ module IosBackupExtractor
5
5
  private
6
6
 
7
7
  def load!(options = {})
8
+ raise 'This looks like a very old backup (iOS 3?)' unless @manifest_plist.has_key? 'BackupKeyBag'
8
9
  super(options)
9
10
 
10
11
  # Grab a copy of the Manifest database
@@ -0,0 +1,58 @@
1
+ module IosBackupExtractor
2
+ class RawBackup3 < RawBackup
3
+ private
4
+
5
+ def load!(options = {})
6
+ unless @loaded
7
+ logger.debug(self.class.name) { 'Loading backup' }
8
+ logger.info(self.class.name) { "Files in the original backup directory #{IosBackupExtractor.file_count(@backup_directory)}" }
9
+
10
+ p @backup_directory
11
+
12
+
13
+ if @manifest_plist['IsEncrypted'] && @manifest_plist['IsEncrypted'] != 0
14
+ raise "Encrypted backup for iOS 3 and below are not supported."
15
+ end
16
+
17
+ @manifest_data = IosBackupExtractor.plist_data_to_hash(@manifest_plist['Data'])
18
+ @loaded = true
19
+ end
20
+ end
21
+
22
+ # Copy a file from the backup to destination
23
+ def copy_files(destination_directory, options = {})
24
+ destination_directory = NauktisUtils::FileBrowser.ensure_valid_directory(destination_directory)
25
+
26
+ @manifest_data['Files'].each_pair do |key, value|
27
+ puts key
28
+ puts value
29
+
30
+ mdinfo_file = File.join(@backup_directory, "#{key}.mdinfo")
31
+ mdinfo_file = File.expand_path(mdinfo_file)
32
+ raise "File #{mdinfo_file} doesn't exist in your backup source" unless File.exists?(mdinfo_file)
33
+
34
+ mddata_file = File.join(@backup_directory, "#{key}.mddata")
35
+ mddata_file = File.expand_path(mddata_file)
36
+ raise "File #{mddata_file} doesn't exist in your backup source" unless File.exists?(mddata_file)
37
+
38
+ mdinfo = IosBackupExtractor.plist_file_to_hash(mdinfo_file)
39
+
40
+ domain, path = mdinfo['Domain'], mdinfo['Path']
41
+ if mdinfo['Metadata']
42
+ mdinfo_metadata = IosBackupExtractor.plist_data_to_hash(mdinfo['Metadata'])
43
+ domain, path = mdinfo_metadata['Domain'], mdinfo_metadata['Path']
44
+ end
45
+
46
+ p mdinfo
47
+ p mdinfo_metadata
48
+
49
+ destination = File.expand_path(File.join(destination_directory, domain, path))
50
+ copy_file_from_backup(mddata_file, destination)
51
+ end
52
+ end
53
+
54
+ def add_files_with_extensions(destination_directory)
55
+
56
+ end
57
+ end
58
+ end
@@ -5,6 +5,7 @@ module IosBackupExtractor
5
5
  private
6
6
 
7
7
  def load!(options = {})
8
+ raise 'This looks like a very old backup (iOS 3?)' unless @manifest_plist.has_key? 'BackupKeyBag'
8
9
  super(options)
9
10
  @mbdb = MBDB.new(File.join(@backup_directory, MANIFEST_MBDB))
10
11
  end
@@ -19,31 +20,12 @@ module IosBackupExtractor
19
20
  continue unless should_include?(f[:domain], f[:file_path], options)
20
21
 
21
22
  destination = File.expand_path(File.join(destination_directory, f[:domain], f[:file_path]))
22
- raise "File #{destination} already exists" if File.exists?(destination)
23
-
24
- source = File.expand_path(File.join(@backup_directory, f[:file_id]))
25
- raise "File #{source} doesn't exist in your backup source" unless File.exists?(source)
26
-
27
- logger.debug(self.class.name) { "Extracting #{destination}" }
28
- FileUtils.mkdir_p(File.dirname(destination))
29
23
 
30
24
  if not f[:encryption_key].nil? and not @keybag.nil?
31
25
  key = @keybag.unwrap_key_for_class(f[:protection_class], f[:encryption_key][4..-1])
32
-
33
- cipher = OpenSSL::Cipher::AES256.new(:CBC)
34
- cipher.decrypt
35
- cipher.key = key
36
- buf = ''
37
- File.open(destination, 'wb') do |outf|
38
- File.open(source, 'rb') do |inf|
39
- while inf.read(4096, buf)
40
- outf << cipher.update(buf)
41
- end
42
- outf << cipher.final
43
- end
44
- end
26
+ copy_enc_file_from_backup(f[:file_id], destination, key)
45
27
  else
46
- FileUtils.cp(source, destination)
28
+ copy_file_from_backup(f[:file_id], destination)
47
29
  end
48
30
  end
49
31
  end
@@ -1,3 +1,3 @@
1
1
  module IosBackupExtractor
2
- VERSION = '1.2.1'
2
+ VERSION = '1.2.2'
3
3
  end
@@ -13,6 +13,7 @@ require 'ios_backup_extractor/info_plist'
13
13
  require 'ios_backup_extractor/mbdb'
14
14
  require 'ios_backup_extractor/keybag'
15
15
  require 'ios_backup_extractor/raw_backup'
16
+ require 'ios_backup_extractor/raw_backup3'
16
17
  require 'ios_backup_extractor/raw_backup4'
17
18
  require 'ios_backup_extractor/raw_backup10'
18
19
  require 'ios_backup_extractor/backup_retriever'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ios_backup_extractor
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.1
4
+ version: 1.2.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nauktis
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-12-29 00:00:00.000000000 Z
11
+ date: 2021-12-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: nauktis_utils
@@ -148,6 +148,7 @@ files:
148
148
  - lib/ios_backup_extractor/mbdb.rb
149
149
  - lib/ios_backup_extractor/raw_backup.rb
150
150
  - lib/ios_backup_extractor/raw_backup10.rb
151
+ - lib/ios_backup_extractor/raw_backup3.rb
151
152
  - lib/ios_backup_extractor/raw_backup4.rb
152
153
  - lib/ios_backup_extractor/version.rb
153
154
  homepage: https://github.com/Nauktis/ios_backup_extractor