idb 2.8.5 → 2.9.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: 64d37de3432acafe6d8534cb1b232139c3f43451
4
- data.tar.gz: bcb894ffd86ea70e2e17a7a6989a6cc85bcd264a
3
+ metadata.gz: dc3813e5d7a7c00e6f7bea27eaa8458f11079789
4
+ data.tar.gz: efa1b2b57cc7bc2ea41aefd2d273393e2574b8b9
5
5
  SHA512:
6
- metadata.gz: c99bb19a9c6c9caf1e7fb53fb66b1ea43eae545196db9917a151b40cb92bb21c3b4af4cd1222a2a12258e41cd45e863d7b4884da82d1763496d86fd03069e3d3
7
- data.tar.gz: 9184bb8182e4bd7cc9377625d6901daefea75b9aa8f78aba9249592135aa7284dea4f22b0d47f1e73fbedc18d7484a5f7df6a31b899efecc0ce42be95d32eb4e
6
+ metadata.gz: e7a8dd3eda610331196674b8fdc6401140a5d66a3b610e046e19ecd71de5b995107a3076b11d925f88b356f7bed1a0738be8a0faf596bec5bb39e546b7ad3ae4
7
+ data.tar.gz: 16b571a0abeb06e6c840723ae0c1479ddb26fbd6a2c35be4208254cce49fc179c9858a3a9778c8c44fe7c69e780184fa8698d51202f2b36561c55cb6878a2f17
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- idb (2.8.5)
4
+ idb (2.9.0)
5
5
  awesome_print
6
6
  coderay
7
7
  ffi
@@ -37,18 +37,24 @@ GEM
37
37
  libxml4r (0.2.6)
38
38
  libxml-ruby (>= 1.1.3)
39
39
  log4r (1.1.10)
40
+ method_source (0.8.2)
40
41
  mini_portile2 (2.0.0)
41
42
  net-sftp (2.1.2)
42
43
  net-ssh (>= 2.6.5)
43
44
  net-ssh (3.0.1)
44
- nokogiri (1.6.7.1)
45
+ nokogiri (1.6.7.2)
45
46
  mini_portile2 (~> 2.0.0.rc2)
46
47
  plist4r (1.2.2)
47
48
  haml
48
49
  libxml-ruby
49
50
  libxml4r
51
+ pry (0.10.4)
52
+ coderay (~> 1.1.0)
53
+ method_source (~> 0.8.1)
54
+ slop (~> 3.4)
50
55
  qtbindings (4.8.6.2)
51
56
  rake (10.4.2)
57
+ slop (3.6.0)
52
58
  sqlite3 (1.3.11)
53
59
  tilt (2.0.1)
54
60
 
@@ -58,4 +64,8 @@ PLATFORMS
58
64
  DEPENDENCIES
59
65
  bundler (~> 1.6)
60
66
  idb!
67
+ pry
61
68
  rake
69
+
70
+ BUNDLED WITH
71
+ 1.12.5
data/idb.gemspec CHANGED
@@ -20,6 +20,7 @@ Gem::Specification.new do |spec|
20
20
 
21
21
  spec.add_development_dependency "bundler", "~> 1.6"
22
22
  spec.add_development_dependency "rake"
23
+ spec.add_development_dependency "pry"
23
24
 
24
25
  spec.add_runtime_dependency 'launchy'
25
26
  spec.add_runtime_dependency 'plist4r'
@@ -44,7 +44,7 @@ module Idb
44
44
  end
45
45
 
46
46
  def refresh_app_list
47
- if $device.ios_version == 8
47
+ if $device.ios_version >= 8
48
48
  box = Qt::MessageBox.new 1, "Refreshing...", "Refreshing uicache to ensure app information is up-to-date. This may take a few seconds."
49
49
  box.setStandardButtons(0)
50
50
  box.show
@@ -15,12 +15,6 @@ module Idb
15
15
  setFixedHeight(sizeHint().height());
16
16
  end
17
17
 
18
- def mark_clutch_installed
19
- @clutch_label.text = @clutch_label.text + "<br>found: #{$device.clutch_path}"
20
- @layout.addWidget installed_check_mark, 8, 1
21
- setFixedHeight(sizeHint().height());
22
- end
23
-
24
18
  def mark_keychain_editor_installed
25
19
  @keychain_editor_label.text = @keychain_editor_label.text + "<br>found: #{$device.keychain_editor_path}"
26
20
  @layout.addWidget installed_check_mark, 6, 1
@@ -275,7 +269,6 @@ module Idb
275
269
  end
276
270
  end
277
271
 
278
-
279
272
  def initialize *args
280
273
  super *args
281
274
  @layout = Qt::GridLayout.new
@@ -287,7 +280,7 @@ module Idb
287
280
  reject()
288
281
  }
289
282
  #TODO: prevent closing
290
- @layout.addWidget @close_button, 9, 2
283
+ @layout.addWidget @close_button, 10, 2
291
284
 
292
285
  apt_get_section
293
286
  open_section
@@ -305,4 +298,4 @@ module Idb
305
298
 
306
299
 
307
300
  end
308
- end
301
+ end
@@ -53,7 +53,7 @@ module Idb
53
53
  @layout.addWidget @rsync, 0,4
54
54
  @rsync.connect(SIGNAL :released) {
55
55
  @manager.start_new_revision
56
- if $device.ios_version == 8
56
+ if $device.ios_version >= 8
57
57
  @manager.sync_dir $selected_app.app_dir, "app_bundle"
58
58
  @manager.sync_dir $selected_app.data_dir, "data_bundle"
59
59
  else
@@ -328,7 +328,7 @@ module Idb
328
328
 
329
329
  @controls.update_start
330
330
 
331
- if $device.ios_version == 8
331
+ if $device.ios_version >= 8
332
332
  start_ios_8
333
333
  else
334
334
  start_ios_pre8
data/lib/idb.rb CHANGED
@@ -24,71 +24,64 @@ module Idb
24
24
  $height = 768
25
25
 
26
26
  class Idb < Qt::MainWindow
27
+ def initialize
28
+ super
27
29
 
28
- def initialize
29
- super
30
+ # initialize log
31
+ $log = Log4r::Logger.new 'idb'
32
+ outputter = Log4r::Outputter.stdout
33
+ outputter.formatter = Log4r::PatternFormatter.new(:pattern => "[%l] %d :: %c :: %m")
30
34
 
35
+ $log.outputters = [ outputter ]
31
36
 
32
- # initialize log
33
- $log = Log4r::Logger.new 'idb'
34
- outputter = Log4r::Outputter.stdout
35
- outputter.formatter = Log4r::PatternFormatter.new(:pattern => "[%l] %d :: %c :: %m")
36
-
37
- $log.outputters = [ outputter ]
38
-
39
- if RUBY_VERSION.start_with? "2.0"
40
- error = Qt::MessageBox.new
41
- error.setInformativeText("You are using ruby 2.0 which does not work well with QT bindings: custom signals don't work. It is very likely that idb will not function as intended. Consider using ruby 1.9 or 2.1 instead.")
42
- error.setIcon(Qt::MessageBox::Critical)
43
- error.exec
44
- end
45
-
46
-
47
-
48
- # enable threading. See https://github.com/ryanmelt/qtbindings/issues/63
49
- @thread_fix = QtThreadFix.new
50
- settings_path = File.dirname(ENV['HOME'] + "/.idb/config/")
51
- $tmp_path = ENV['HOME'] + "/.idb/tmp/"
52
- puts $tmp_path
53
- unless File.directory?(settings_path)
54
- $log.info "Creating settings directory: #{settings_path}"
55
- FileUtils.mkdir_p(settings_path)
56
- end
37
+ if RUBY_VERSION.start_with? "2.0"
38
+ error = Qt::MessageBox.new
39
+ error.setInformativeText("You are using ruby 2.0 which does not work well with QT bindings: custom signals don't work. It is very likely that idb will not function as intended. Consider using ruby 1.9 or 2.1 instead.")
40
+ error.setIcon(Qt::MessageBox::Critical)
41
+ error.exec
42
+ end
57
43
 
58
- settings_filename = "settings.yml"
59
- $settings = Settings.new "#{settings_path}/#{settings_filename}"
44
+ # enable threading. See https://github.com/ryanmelt/qtbindings/issues/63
45
+ @thread_fix = QtThreadFix.new
46
+ settings_path = File.dirname(ENV['HOME'] + "/.idb/config/")
47
+ $tmp_path = ENV['HOME'] + "/.idb/tmp/"
48
+ puts $tmp_path
49
+ unless File.directory?(settings_path)
50
+ $log.info "Creating settings directory: #{settings_path}"
51
+ FileUtils.mkdir_p(settings_path)
52
+ end
60
53
 
61
- setWindowTitle "idb"
62
- Qt::CoreApplication::setApplicationName("idb")
63
- setWindowIconText('idb')
64
- init_ui
54
+ settings_filename = "settings.yml"
55
+ $settings = Settings.new "#{settings_path}/#{settings_filename}"
65
56
 
66
- # size = Qt::Size.new($width, $height)
67
- # size = size.expandedTo(self.minimumSizeHint())
68
- # resize(size)
69
- # resize $width, $height
57
+ setWindowTitle "idb"
58
+ Qt::CoreApplication::setApplicationName("idb")
59
+ setWindowIconText('idb')
60
+ init_ui
70
61
 
71
- # center
62
+ self.showMaximized()
63
+ self.raise
64
+ self.activateWindow
72
65
 
73
- self.showMaximized()
74
- self.raise
75
- self.activateWindow
66
+ end
76
67
 
77
- end
68
+ def self.root
69
+ File.expand_path('../..',__FILE__)
70
+ end
78
71
 
79
- def self.execute_in_main_thread(blocking = false, sleep_period = 0.001)
80
- if Thread.current != Thread.main
81
- complete = false
82
- QtThreadFix.ruby_thread_queue << lambda {|| yield; complete = true}
83
- if blocking
84
- until complete
85
- sleep(sleep_period)
86
- end
72
+ def self.execute_in_main_thread(blocking = false, sleep_period = 0.001)
73
+ if Thread.current != Thread.main
74
+ complete = false
75
+ QtThreadFix.ruby_thread_queue << lambda {|| yield; complete = true}
76
+ if blocking
77
+ until complete
78
+ sleep(sleep_period)
87
79
  end
88
- else
89
- yield
90
80
  end
81
+ else
82
+ yield
91
83
  end
84
+ end
92
85
 
93
86
  def init_ui
94
87
  # setup central widget and grid layout
@@ -290,6 +283,4 @@ module Idb
290
283
 
291
284
  end
292
285
  end
293
-
294
-
295
286
  end
data/lib/idb/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Idb
2
- VERSION = "2.8.5"
2
+ VERSION = "2.9.0"
3
3
  end
data/lib/lib/app.rb CHANGED
@@ -16,15 +16,18 @@ module Idb
16
16
  @app_dir = "#{$device.apps_dir}/#{@uuid}"
17
17
  parse_info_plist
18
18
 
19
- if $device.ios_version == 8
20
- mapping_file = "/var/mobile/Library/MobileInstallation/LastLaunchServicesMap.plist"
19
+ if $device.ios_version >= 8
20
+ if $device.ios_version == 8
21
+ mapping_file = "/var/mobile/Library/MobileInstallation/LastLaunchServicesMap.plist"
22
+ else
23
+ mapping_file = "/private/var/installd/Library/MobileInstallation/LastLaunchServicesMap.plist"
24
+ end
21
25
  local_mapping_file = cache_file mapping_file
22
26
  @services_map = IOS8LastLaunchServicesMapWrapper.new local_mapping_file
23
-
24
27
  @data_dir = @services_map.data_path_by_bundle_id @info_plist.bundle_identifier
25
28
  @keychain_access_groups = @services_map.keychain_access_groups_by_bundle_id @info_plist.bundle_identifier
26
29
 
27
- else
30
+ else
28
31
  @data_dir = @app_dir
29
32
  end
30
33
 
@@ -48,19 +51,29 @@ module Idb
48
51
  end
49
52
 
50
53
  def decrypt_binary!
54
+ $log.info "Running '#{binary_path}'"
55
+ full_remote_path = binary_path
56
+ $log.error "Decryption failed. Trying using dumpdecrypted..."
57
+
51
58
  unless $device.dumpdecrypted_installed?
52
59
  $log.error "dumpdecrypted not installed."
53
60
  return false
54
61
  end
55
62
 
56
- dylib = "dumpdecrypted_#{$device.arch}.dylib"
63
+ dylib_path = $device.path_for("dumpdecrypted_#{$device.arch}".to_sym)
57
64
 
58
- $log.info "Running '#{binary_path}'"
59
- full_remote_path = binary_path
60
- decrypted_path = "/var/root/#{File.basename full_remote_path}.decrypted"
65
+ # If the ios version is less than 9 then we execute dumpdecrypted as
66
+ # root. iOS 9 requires dumpdecrypted to be run as the mobile user.
67
+ if $device.ios_version < 9
68
+ #TODO: Is this the best way to do this?
69
+ decrypted_path = "/var/root/#{File.basename full_remote_path}.decrypted"
70
+ $device.ops.execute "DYLD_INSERT_LIBRARIES=#{dylib_path} \"#{full_remote_path}\""
71
+ else
72
+ #TODO: Is this the best way to do this?
73
+ decrypted_path = "/var/mobile/#{File.basename full_remote_path}.decrypted"
74
+ $device.ops.execute "DYLD_INSERT_LIBRARIES=#{dylib_path} \"#{full_remote_path}\"", { as_user: "mobile" }
75
+ end
61
76
 
62
- $device.ops.execute "cd /var/root/"
63
- $device.ops.execute "DYLD_INSERT_LIBRARIES=dumpdecrypted_armv7.dylib \"#{full_remote_path}\""
64
77
  $log.info "Checking if decrypted file #{decrypted_path} was created..."
65
78
  if not $device.ops.file_exists? decrypted_path
66
79
  $log.error "Decryption failed. Trying armv6 build for iOS 6 and earlier..."
@@ -164,8 +177,8 @@ module Idb
164
177
  end
165
178
 
166
179
  def data_directory
167
- if $device.ios_version != 8
168
- "[iOS 8 specific]"
180
+ if $device.ios_version < 8
181
+ "[iOS 8+ specific]"
169
182
  else
170
183
  @data_dir
171
184
  end
data/lib/lib/device.rb CHANGED
@@ -29,9 +29,8 @@ module Idb
29
29
  @device_app_paths[:keychaineditor] = [ "/var/root/keychaineditor"]
30
30
  @device_app_paths[:pcviewer] = ["/var/root/protectionclassviewer"]
31
31
  @device_app_paths[:pbwatcher] = ["/var/root/pbwatcher"]
32
- @device_app_paths[:dumpdecrypted_armv7] = ["/var/root/dumpdecrypted_armv7.dylib"]
33
- @device_app_paths[:dumpdecrypted_armv6] = ["/var/root/dumpdecrypted_armv6.dylib"]
34
- @device_app_paths[:clutch] = ["/usr/bin/Clutch"]
32
+ @device_app_paths[:dumpdecrypted_armv7] = ["/usr/lib/dumpdecrypted_armv7.dylib"]
33
+ @device_app_paths[:dumpdecrypted_armv6] = ["/usr/lib/dumpdecrypted_armv6.dylib"]
35
34
 
36
35
  if $settings['device_connection_mode'] == "ssh"
37
36
  $log.debug "Connecting via SSH"
@@ -66,8 +65,15 @@ module Idb
66
65
  @apps_dir_ios_8 = '/private/var/mobile/Containers/Bundle/Application'
67
66
  @data_dir_ios_8 = '/private/var/mobile/Containers/Data/Application'
68
67
 
68
+ @apps_dir_ios_9 = '/private/var/containers/Bundle/Application'
69
+ @data_dir_ios_9 = @data_dir_ios_8
69
70
 
70
- if @ops.directory? @apps_dir_ios_8
71
+ if @ops.directory? @apps_dir_ios_9
72
+ @ios_version = 9
73
+ @apps_dir = @apps_dir_ios_9
74
+ @data_dir = @data_dir_ios_9
75
+
76
+ elsif @ops.directory? @apps_dir_ios_8
71
77
  @ios_version = 8
72
78
  @apps_dir = @apps_dir_ios_8
73
79
  @data_dir = @data_dir_ios_8
@@ -124,10 +130,6 @@ module Idb
124
130
  @ops.launch_app(open_path, app.bundle_id)
125
131
  end
126
132
 
127
-
128
-
129
-
130
-
131
133
  def is_installed? tool
132
134
  $log.info "Checking if #{tool} is installed..."
133
135
  if path_for(tool).nil?
@@ -151,6 +153,9 @@ module Idb
151
153
 
152
154
  def install_dumpdecrypted
153
155
  upload_dumpdecrypted
156
+ # Change permissions as this needs to be run as the mobile user
157
+ @ops.chmod dumpdecrypted_path, 0755
158
+ @ops.chmod dumpdecrypted_path_armv6, 0755
154
159
  end
155
160
 
156
161
  def install_dumpdecrypted_old
@@ -216,8 +221,8 @@ module Idb
216
221
 
217
222
  def upload_dumpdecrypted
218
223
  $log.info "Uploading dumpdecrypted library..."
219
- @ops.upload("#{File.dirname(File.expand_path(__FILE__))}/../utils/dumpdecrypted/dumpdecrypted_armv6.dylib","/var/root/dumpdecrypted_armv6.dylib")
220
- @ops.upload("#{File.dirname(File.expand_path(__FILE__))}/../utils/dumpdecrypted/dumpdecrypted_armv7.dylib","/var/root/dumpdecrypted_armv7.dylib")
224
+ @ops.upload("#{Idb.root}/lib/utils/dumpdecrypted/dumpdecrypted_armv6.dylib", @device_app_paths[:dumpdecrypted_armv6].first)
225
+ @ops.upload("#{Idb.root}/lib/utils/dumpdecrypted/dumpdecrypted_armv7.dylib", @device_app_paths[:dumpdecrypted_armv7].first)
221
226
  $log.info "'dumpdecrypted' installed successfully."
222
227
  end
223
228
 
@@ -274,6 +279,7 @@ module Idb
274
279
  end
275
280
  end
276
281
  def upload_pbwatcher
282
+ # TODO What's happening here?
277
283
  begin
278
284
  $log.info "Uploading pbwatcher..."
279
285
  @ops.upload "#{File.dirname(File.expand_path(__FILE__))}/../utils/pbwatcher/pbwatcher", "/var/root/pbwatcher"
@@ -286,16 +292,15 @@ module Idb
286
292
  end
287
293
  end
288
294
 
289
- def setup_clutch_sources
290
- @ops.execute("echo “deb http://cydia.iphonecake.com ./“ > /etc/apt/sources.list.d/idb_clutch.list")
291
- end
292
295
 
293
296
  def install_from_cydia package
294
297
  if apt_get_installed?
295
298
  $log.info "Updating package repo..."
296
299
  @ops.execute("#{apt_get_path} -y update")
297
300
  $log.info "Installing #{package}..."
301
+
298
302
  @ops.execute("#{apt_get_path} -y install #{package}")
303
+
299
304
  return true
300
305
  else
301
306
  $log.error "apt-get or aptitude not found on the device"
@@ -307,10 +312,6 @@ module Idb
307
312
  install_from_cydia "com.conradkramer.open"
308
313
  end
309
314
 
310
- def install_clutch
311
- install_from_cydia "com.iphonecake.clutch"
312
- end
313
-
314
315
  def install_rsync
315
316
  install_from_cydia "rsync"
316
317
  end
@@ -350,7 +351,15 @@ module Idb
350
351
  end
351
352
 
352
353
  def configured?
353
- apt_get_installed? and open_installed? and openurl_installed? and dumpdecrypted_installed? and pbwatcher_installed? and pcviewer_installed? and keychain_editor_installed? and rsync_installed? and cycript_installed?
354
+ apt_get_installed? and
355
+ open_installed? and
356
+ openurl_installed? and
357
+ dumpdecrypted_installed? and
358
+ pbwatcher_installed? and
359
+ pcviewer_installed? and
360
+ keychain_editor_installed? and
361
+ rsync_installed? and
362
+ cycript_installed?
354
363
  end
355
364
 
356
365
 
@@ -391,16 +400,10 @@ module Idb
391
400
  is_installed? :aptget
392
401
  end
393
402
 
394
- def clutch_installed?
395
- is_installed? :clutch
396
- end
397
-
398
403
  def keychain_editor_path
399
404
  path_for :keychaineditor
400
405
  end
401
406
 
402
-
403
-
404
407
  def pcviewer_path
405
408
  path_for :pcviewer
406
409
  end
@@ -415,6 +418,10 @@ module Idb
415
418
  path_for :dumpdecrypted_armv7
416
419
  end
417
420
 
421
+ def dumpdecrypted_path_armv6
422
+ path_for :dumpdecrypted_armv6
423
+ end
424
+
418
425
  def rsync_path
419
426
  path_for :rsync
420
427
  end
@@ -434,10 +441,6 @@ module Idb
434
441
  path_for :aptget
435
442
  end
436
443
 
437
- def clutch_path
438
- path_for :clutch
439
- end
440
-
441
444
  def cycript_path
442
445
  path_for :cycript
443
446
  end
@@ -58,6 +58,25 @@ module Idb
58
58
  end
59
59
 
60
60
 
61
+ def hashify_otool_output(otool_output)
62
+ # otool output may contain multiple mach headers
63
+ mach_headers = otool_output.split("Mach header\n").map(&:strip)
64
+
65
+ # The newest otool version no longer echos the path of the binary being
66
+ # inspected. Here we reject that line if it shows up in the output of
67
+ # otool as well as any blank lines
68
+ mach_headers.reject!{|line| line == "" or line.include?(@binary)}
69
+
70
+ # convert otool output to a hash
71
+ mach_headers.map do |mach_header|
72
+ mach_hash = {}
73
+ headers, values = mach_header.split("\n").map(&:split)
74
+ headers.each_with_index do |header, index|
75
+ mach_hash[header] = values[index]
76
+ end
77
+ mach_hash
78
+ end
79
+ end
61
80
 
62
81
 
63
82
  def parse_header
@@ -68,19 +87,19 @@ module Idb
68
87
  pie_flag = 0x00200000
69
88
  @raw_load_output = `#{@otool_path} -h '#{@binary}'`
70
89
 
71
- # fourth row contains values. then split them up.
72
- vals = @raw_load_output.split("\n")[3].split(" ")
73
90
 
74
- #7th field contains the flags
75
- flags = vals[7].to_i(16)
91
+ mach_hashes = hashify_otool_output(@raw_load_output)
92
+ $log.info "Mach Hashes: #{mach_hashes}"
76
93
 
77
- if flags & pie_flag == pie_flag
78
- @pie = true
79
- else
80
- @pie = false
94
+ # extract the Position Independent Executable (PIE) flag from the flags
95
+ # value.
96
+ mach_hashes.each do |mach_hash|
97
+ if (mach_hash["flags"].to_i(16) & pie_flag) == pie_flag
98
+ @pie = true
99
+ else
100
+ @pie = false
101
+ end
81
102
  end
82
-
83
-
84
103
  end
85
104
 
86
105
  def parse_load_commands
@@ -108,9 +127,5 @@ module Idb
108
127
  end
109
128
  }
110
129
  end
111
-
112
-
113
-
114
-
115
130
  end
116
131
  end
@@ -36,8 +36,18 @@ module Idb
36
36
  end
37
37
 
38
38
 
39
- def execute(command)
40
- @ssh.exec! command
39
+ def execute(command, opts={})
40
+ if opts[:as_user]
41
+ command = "su - #{ opts[:as_user] } -c \"#{command}\""
42
+ end
43
+
44
+ if opts[:non_blocking]
45
+ $log.debug "Executing non-blocking SSH command: #{command}"
46
+ @ssh.exec command
47
+ else
48
+ $log.debug "Executing blocking SSH command: #{command}"
49
+ @ssh.exec! command
50
+ end
41
51
  end
42
52
 
43
53
  def chmod file, permissions
@@ -133,4 +143,4 @@ module Idb
133
143
  end
134
144
 
135
145
  end
136
- end
146
+ end
@@ -40,4 +40,4 @@ module Idb
40
40
 
41
41
 
42
42
  end
43
- end
43
+ end
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.8.5
4
+ version: 2.9.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: 2015-12-26 00:00:00.000000000 Z
11
+ date: 2016-09-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -38,6 +38,20 @@ dependencies:
38
38
  - - ">="
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: pry
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
41
55
  - !ruby/object:Gem::Dependency
42
56
  name: launchy
43
57
  requirement: !ruby/object:Gem::Requirement
@@ -383,7 +397,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
383
397
  version: '0'
384
398
  requirements: []
385
399
  rubyforge_project:
386
- rubygems_version: 2.2.2
400
+ rubygems_version: 2.4.8
387
401
  signing_key:
388
402
  specification_version: 4
389
403
  summary: idb is a tool to simplify some common tasks for iOS pentesting and research.