idb 2.9.3 → 2.10.0

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
  SHA1:
3
- metadata.gz: a8691fa7177ba847827d93e208287564f861230a
4
- data.tar.gz: c282d257c080cbc16affe067ea53ccc8c832a30d
3
+ metadata.gz: 4130d3094c841da7617c5136e633a1db05763f17
4
+ data.tar.gz: 1ff56befe28f80b90b5cab55bd8d630cf13075b7
5
5
  SHA512:
6
- metadata.gz: 25e50cd9ac1b50ae4f180d8d0200db39f82be0d937613cd74c0aefef442527962f1917661ed38b075e4c647916b130ae784c5c250d6067c955895b3ed9ab746d
7
- data.tar.gz: 900d75b22ea92b105396499326b52973dadb18dd07e9c27ab9ec43eac9001a3dd9a71c00e99997037a1f90fc914f8733068ade41bb1f8b9f2b7da81cbe1b49fc
6
+ metadata.gz: 1a3aa79dfe0011c12de8354353d98fbe4535e8459aa59a139bbbe776727466eb8c3d98a2877212fb3f51155cf6e9ca56fd34f983e495bc69b9087e2229a3cfca
7
+ data.tar.gz: 9c29f6ee4927e8b9cb33bbd6edf1f9fb3c927d6bb5bfd2ae034f20b440fb27a2ee083aedd2a80495e66e5ef9fa0e1177b34d828bd8e858c514ea713c2b13e0e0
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- idb (2.9.3)
4
+ idb (2.10.0)
5
5
  awesome_print
6
6
  coderay
7
7
  git
@@ -134,7 +134,7 @@ module Idb
134
134
  if $device.ios_version < 8
135
135
  add_detail 'application-identifier', 'Only available for iOS 8+'
136
136
  else
137
- $selected_app.services_map.entitlements_by_bundle_id($selected_app.bundle_id).each do |x|
137
+ $selected_app.entitlements.each do |x|
138
138
  add_detail x[0].to_s, x[0].to_s
139
139
  @vals[x[0].to_s].setText(x[1].to_s)
140
140
  end
@@ -38,7 +38,7 @@ module Idb
38
38
  end
39
39
 
40
40
  def refresh_app_list
41
- if $device.ios_version >= 8
41
+ if $device.ios_version >= 8 && $device.ios_version != 10
42
42
  refresh_msg = "Refreshing uicache to ensure app information is" \
43
43
  "up-to-date. This may take a few seconds."
44
44
  box = Qt::MessageBox.new 1, "Refreshing...", refresh_msg
@@ -20,7 +20,7 @@ module Idb
20
20
  if $device.ios_version < 8
21
21
  @val.setText "Only available for iOS 8+"
22
22
  else
23
- $selected_app.services_map.entitlements_by_bundle_id($selected_app.bundle_id).each do |x|
23
+ $selected_app.entitlements.each do |x|
24
24
  if x[0].to_s == "com.apple.developer.default-data-protection"
25
25
  @val.setText x[1].to_s
26
26
  end
data/lib/idb.rb CHANGED
@@ -213,7 +213,7 @@ module Idb
213
213
  $log.info "Device not seen before. Opening status page."
214
214
  error = Qt::MessageBox.new self
215
215
  error.setInformativeText("This device has not been configured yet. Opening Status page to verify all required tools are installed on the device.")
216
- error.setIcon(Qt::MessageBox::Warning)
216
+ #error.setIcon(Qt::MessageBox::Warning)
217
217
  error.exec
218
218
  @device_status = DeviceStatusDialog.new
219
219
  @device_status.exec
@@ -1,3 +1,3 @@
1
1
  module Idb
2
- VERSION = "2.9.3"
2
+ VERSION = "2.10.0"
3
3
  end
@@ -2,6 +2,7 @@ require_relative 'plist_util'
2
2
  require_relative 'app_binary'
3
3
  require_relative 'CgBI'
4
4
  require_relative 'ios8_last_launch_services_map_wrapper'
5
+ require_relative 'ios10_application_state_db_wrapper'
5
6
 
6
7
  module Idb
7
8
  class App
@@ -19,16 +20,21 @@ module Idb
19
20
 
20
21
  parse_info_plist
21
22
 
22
- if $device.ios_version >= 8
23
+
24
+ if $device.ios_version >= 10
25
+ @services_map = IOS10ApplicationStateDbWrapper.new
26
+ @data_dir = @services_map.data_path_by_bundle_id @info_plist.bundle_identifier
27
+
28
+ elsif $device.ios_version >= 8
23
29
  if $device.ios_version == 8
24
30
  mapping_file = "/var/mobile/Library/MobileInstallation/LastLaunchServicesMap.plist"
25
31
  else
26
32
  mapping_file = "/private/var/installd/Library/MobileInstallation/LastLaunchServicesMap.plist"
27
33
  end
34
+
28
35
  local_mapping_file = cache_file mapping_file
29
36
  @services_map = IOS8LastLaunchServicesMapWrapper.new local_mapping_file
30
37
  @data_dir = @services_map.data_path_by_bundle_id @info_plist.bundle_identifier
31
- @keychain_access_groups = @services_map.keychain_access_groups_by_bundle_id @info_plist.bundle_identifier
32
38
 
33
39
  else
34
40
  @data_dir = @app_dir
@@ -165,11 +171,24 @@ module Idb
165
171
  end
166
172
 
167
173
  def keychain_access_groups
168
- if @keychain_access_groups.nil?
169
- "[iOS 8 specific]"
170
- else
171
- @keychain_access_groups.join "\n"
174
+ if $device.ios_version < 8
175
+ "[iOS 8+ specific]"
176
+ end
177
+
178
+ ## return stored groups if we have them
179
+ unless @keychain_access_groups.nil?
180
+ return @keychain_access_groups.join ("\n")
172
181
  end
182
+
183
+ if $device.ios_version >= 10
184
+ @keychain_access_groups = @services_map.keychain_access_groups_by_binary binary_path
185
+ end
186
+
187
+ if $device.ios_version >= 8
188
+ @keychain_access_groups = @services_map.keychain_access_groups_by_bundle_id @info_plist.bundle_identifier
189
+ end
190
+
191
+ @keychain_access_groups.join ("\n")
173
192
  end
174
193
 
175
194
  def data_directory
@@ -203,13 +222,18 @@ module Idb
203
222
  end
204
223
 
205
224
  def binary_path
206
- $log.info "Locating application binary..."
207
- dirs = $device.ops.dir_glob("#{@app_dir}/", "**")
208
- dirs.select! do |f|
209
- $device.ops.file_exists? "#{f}/#{binary_name}"
225
+ if @binary_path.nil?
226
+ $log.info "Locating application binary..."
227
+ dirs = $device.ops.dir_glob("#{@app_dir}/", "**")
228
+ dirs.select! do |f|
229
+ $device.ops.file_exists? "#{f}/#{binary_name}"
230
+ end
231
+
232
+ @binary_path = "#{dirs.first}/#{binary_name}"
233
+ else
234
+ @binary_path
210
235
  end
211
236
 
212
- "#{dirs.first}/#{binary_name}"
213
237
  end
214
238
 
215
239
  def binary_name
@@ -270,6 +294,16 @@ module Idb
270
294
  end
271
295
  end
272
296
 
297
+
298
+ def entitlements
299
+ if $device.ios_version >= 10
300
+ @services_map.entitlements_by_binary(binary_path)
301
+ elsif $device.ios_version >= 8
302
+ @services_map.entitlements_by_bundle_id(bundle_id)
303
+ end
304
+
305
+ end
306
+
273
307
  private
274
308
 
275
309
  def parse_info_plist
@@ -307,5 +341,6 @@ module Idb
307
341
  $log.info "Info.plist found at #{plist_file}"
308
342
  plist_file
309
343
  end
344
+
310
345
  end
311
346
  end
@@ -65,18 +65,32 @@ module Idb
65
65
 
66
66
  @apps_dir_ios_9 = '/private/var/containers/Bundle/Application'
67
67
  @data_dir_ios_9 = @data_dir_ios_8
68
+ @application_state_ios_10 = "/User/Library/FrontBoard/applicationState.db"
68
69
 
69
- if @ops.directory? @apps_dir_ios_9
70
+ $log.info "Checking iOS version"
71
+
72
+ @ops.execute"touch /tmp/daniel"
73
+
74
+ if @ops.file_exists? @application_state_ios_10
75
+ $log.info "iOS Version: 10 or newer"
76
+ @ios_version = 10
77
+ @apps_dir = @apps_dir_ios_9
78
+ @data_dir = @data_dir_ios_9
79
+
80
+ elsif @ops.directory? @apps_dir_ios_9
81
+ $log.info "iOS Version: 9"
70
82
  @ios_version = 9
71
83
  @apps_dir = @apps_dir_ios_9
72
84
  @data_dir = @data_dir_ios_9
73
85
 
74
86
  elsif @ops.directory? @apps_dir_ios_8
87
+ $log.info "iOS Version: 8"
75
88
  @ios_version = 8
76
89
  @apps_dir = @apps_dir_ios_8
77
90
  @data_dir = @data_dir_ios_8
78
91
 
79
92
  elsif @ops.directory? @apps_dir_ios_pre8
93
+ $log.info "iOS Version: 7 or earlier"
80
94
  @ios_version = 7 # 7 or earlier
81
95
  @apps_dir = @apps_dir_ios_pre8
82
96
  @data_dir = @apps_dir_ios_pre8
@@ -0,0 +1,83 @@
1
+ require 'plist4r'
2
+ require 'sqlite3'
3
+ require 'pry'
4
+
5
+ class IOS10ApplicationStateDbWrapper
6
+ def initialize
7
+ @db_file = "/User/Library/FrontBoard/applicationState.db"
8
+
9
+ @cache_path = "#{$tmp_path}/device/applicationState.db"
10
+
11
+ @ldid_binary = "/usr/bin/ldid"
12
+
13
+
14
+
15
+ # download latest db file
16
+ FileUtils.mkpath "#{$tmp_path}/device" unless File.directory? "#{$tmp_path}/device"
17
+ $device.ops.download @db_file, @cache_path
18
+
19
+ end
20
+
21
+
22
+ def entitlements_by_binary(binary_path)
23
+ unless $device.ops.file_exists?(@ldid_binary)
24
+ $log.error "Cannot find ldid binary at #{@ldid_binary}"
25
+ return ""
26
+ end
27
+
28
+ plist = $device.ops.execute("#{@ldid_binary} -e #{binary_path}")
29
+ entitlements = Plist4r.new({:from_string => plist})
30
+ puts entitlements
31
+ entitlements
32
+ end
33
+
34
+
35
+ def data_path_by_bundle_id(bundle_id)
36
+
37
+ #puts @cache_path
38
+ db = SQLite3::Database.open @cache_path
39
+ #puts db.inspect
40
+
41
+ #puts bundle_id
42
+ plist = ""
43
+
44
+ # I fail to get prepared statements to work with SQLite... So using strig concatenation instead. here be dragons
45
+ stmnt = db.prepare "SELECT kvs.value FROM application_identifier_tab left join kvs on application_identifier_tab.id = kvs.application_identifier where kvs.key = 2 and application_identifier_tab.application_identifier='#{bundle_id}'"
46
+ # stmnt.bind_params(bundle_id)
47
+ rs = stmnt.execute
48
+ #
49
+ #binding.pry
50
+ #puts rs.inspect
51
+ row = rs.next
52
+ if row.nil?
53
+ return nil
54
+ end
55
+ #puts row.inspect
56
+ plist = row[0]
57
+
58
+ #puts plist
59
+
60
+ outer_plist = Plist4r.new({:from_string => plist})
61
+ h = outer_plist.to_hash
62
+ if h.key? "sandboxPath"
63
+ return h["sandboxPath"]
64
+ end
65
+ #puts outer_plist.inspect
66
+ plist = outer_plist.to_hash["String"]
67
+ inner_plist = Plist4r::Plist.new({:from_string => plist})
68
+ return inner_plist.to_hash["$objects"][4]
69
+
70
+ end
71
+
72
+ def keychain_access_groups_by_binary binary_path
73
+ unless $device.ops.file_exists?(@ldid_binary)
74
+ $log.error "Cannot find ldid binary at #{@ldid_binary}"
75
+ return ""
76
+ end
77
+
78
+ plist = $device.ops.execute("#{@ldid_binary} -e #{binary_path}")
79
+ entitlements = Plist4r.new({:from_string => plist})
80
+ puts entitlements["keychain-access-groups"]
81
+ return entitlements["keychain-access-groups"]
82
+ end
83
+ end
@@ -22,6 +22,13 @@ module Idb
22
22
  $log.info 'Establishing SFTP Session...'
23
23
  @sftp = Net::SFTP::Session.new @ssh
24
24
  @sftp.loop { @sftp.opening? }
25
+ unless @sftp.open?
26
+ $log.error 'SFTP connection could not be established.'
27
+ error = Qt::MessageBox.new
28
+ error.setInformativeText("SFTP connection could not be established. Ensure SFTP is available on the iOS device, e.g., by installing the OpenSSH package.")
29
+ error.setIcon(Qt::MessageBox::Critical)
30
+ error.exec
31
+ end
25
32
  rescue StandardError => ex
26
33
  error = Qt::MessageBox.new
27
34
  error.setInformativeText("SSH connection could not be established: #{ex.message}")
@@ -86,7 +93,8 @@ module Idb
86
93
  def file_exists?(path)
87
94
  @sftp.stat!(path)
88
95
  return true
89
- rescue
96
+ rescue Exception => e
97
+ $log.debug("File not found: #{e.message}")
90
98
  return false
91
99
  end
92
100
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: idb
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.9.3
4
+ version: 2.10.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Daniel A. Mayer
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-07-22 00:00:00.000000000 Z
11
+ date: 2017-08-31 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -344,6 +344,7 @@ files:
344
344
  - lib/lib/device.rb
345
345
  - lib/lib/device_ca_interface.rb
346
346
  - lib/lib/host_file_wrapper.rb
347
+ - lib/lib/ios10_application_state_db_wrapper.rb
347
348
  - lib/lib/ios8_last_launch_services_map_wrapper.rb
348
349
  - lib/lib/keychain_wrapper.rb
349
350
  - lib/lib/local_operations.rb