idb 1.3.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.
Files changed (103) hide show
  1. checksums.yaml +7 -0
  2. data/.DS_Store +0 -0
  3. data/.gitignore +19 -0
  4. data/Gemfile +4 -0
  5. data/Gemfile.lock +65 -0
  6. data/LICENSE.txt +22 -0
  7. data/README.md +29 -0
  8. data/Rakefile +2 -0
  9. data/bin/idb +5 -0
  10. data/idb.gemspec +41 -0
  11. data/lib/LICENSE +20 -0
  12. data/lib/README.md +54 -0
  13. data/lib/config/.dummy +0 -0
  14. data/lib/config/settings.yml +8 -0
  15. data/lib/gui/app_binary_tab_widget.rb +45 -0
  16. data/lib/gui/app_details_group_box.rb +213 -0
  17. data/lib/gui/app_list_dialog.rb +67 -0
  18. data/lib/gui/app_list_widget_item.rb +9 -0
  19. data/lib/gui/binary_strings_widget.rb +33 -0
  20. data/lib/gui/browse_filesystem_widget.rb +4 -0
  21. data/lib/gui/ca_manager_dialog.rb +137 -0
  22. data/lib/gui/cache_db_widget.rb +61 -0
  23. data/lib/gui/certificate_item.rb +5 -0
  24. data/lib/gui/console_widget.rb +163 -0
  25. data/lib/gui/cycript_console_widget.rb +68 -0
  26. data/lib/gui/cycript_thread.rb +81 -0
  27. data/lib/gui/device_info_group_box.rb +55 -0
  28. data/lib/gui/device_status_dialog.rb +351 -0
  29. data/lib/gui/file_system_events_widget.rb +4 -0
  30. data/lib/gui/fs_viewer_tab_widget.rb +245 -0
  31. data/lib/gui/i_device_syslog_thread.rb +47 -0
  32. data/lib/gui/images/check.png +0 -0
  33. data/lib/gui/images/folder.ico +0 -0
  34. data/lib/gui/images/iphone.ico +0 -0
  35. data/lib/gui/images/screenshot.png +0 -0
  36. data/lib/gui/key_chain_widget.rb +86 -0
  37. data/lib/gui/local_storage_tab_widget.rb +37 -0
  38. data/lib/gui/log_plain_text_edit.rb +18 -0
  39. data/lib/gui/log_widget.rb +71 -0
  40. data/lib/gui/main_tab_widget.rb +179 -0
  41. data/lib/gui/pasteboard_monitor_widget.rb +116 -0
  42. data/lib/gui/path_list_widget_item.rb +5 -0
  43. data/lib/gui/pb_watcher_thread.rb +63 -0
  44. data/lib/gui/plist_file_widget.rb +66 -0
  45. data/lib/gui/qt_ruby_variant.rb +16 -0
  46. data/lib/gui/screenshot_wizard.rb +169 -0
  47. data/lib/gui/settings_dialog.rb +69 -0
  48. data/lib/gui/settings_tab_widget.rb +149 -0
  49. data/lib/gui/shared_libraries_widget.rb +47 -0
  50. data/lib/gui/snoop_it_fs_events_widget.rb +150 -0
  51. data/lib/gui/snoop_it_keychain_widget.rb +172 -0
  52. data/lib/gui/snoop_it_sensitive_api_widget.rb +128 -0
  53. data/lib/gui/snoop_it_tab_widget.rb +27 -0
  54. data/lib/gui/snoop_it_update_thread.rb +48 -0
  55. data/lib/gui/sqlite_widget.rb +73 -0
  56. data/lib/gui/ssh_port_forward_tab_widget.rb +209 -0
  57. data/lib/gui/tool_widget.rb +94 -0
  58. data/lib/gui/url_handler_widget.rb +26 -0
  59. data/lib/gui/url_scheme_fuzz_widget.rb +103 -0
  60. data/lib/gui/url_scheme_widget.rb +60 -0
  61. data/lib/gui/weak_class_dump_widget.rb +89 -0
  62. data/lib/helper/ssh_port_forwarder.rb +72 -0
  63. data/lib/idb.rb +295 -0
  64. data/lib/idb/version.rb +3 -0
  65. data/lib/lib/CgBI.rb +153 -0
  66. data/lib/lib/abstract_device.rb +31 -0
  67. data/lib/lib/app.rb +286 -0
  68. data/lib/lib/app_binary.rb +57 -0
  69. data/lib/lib/ca_interface.rb +151 -0
  70. data/lib/lib/configuration.rb +0 -0
  71. data/lib/lib/console_launcher.rb +24 -0
  72. data/lib/lib/device.rb +438 -0
  73. data/lib/lib/device_ca_interface.rb +36 -0
  74. data/lib/lib/host_file_wrapper.rb +27 -0
  75. data/lib/lib/i_device_diagnostics_wrapper.rb +90 -0
  76. data/lib/lib/keychain_plist_parser.rb +15 -0
  77. data/lib/lib/local_operations.rb +67 -0
  78. data/lib/lib/otool_wrapper.rb +116 -0
  79. data/lib/lib/plist_util.rb +72 -0
  80. data/lib/lib/qt_thread_fix.rb +29 -0
  81. data/lib/lib/rsync_git_manager.rb +81 -0
  82. data/lib/lib/screen_shot_util.rb +59 -0
  83. data/lib/lib/settings.rb +67 -0
  84. data/lib/lib/simulator.rb +60 -0
  85. data/lib/lib/simulator_ca_interface.rb +16 -0
  86. data/lib/lib/snoop_it_wrapper.rb +80 -0
  87. data/lib/lib/ssh_operations.rb +136 -0
  88. data/lib/lib/ssh_port_forwarder.rb +43 -0
  89. data/lib/lib/tools.rb +11 -0
  90. data/lib/lib/url_scheme_fuzzer.rb +98 -0
  91. data/lib/lib/usb_muxd_wrapper.rb +32 -0
  92. data/lib/lib/weak_class_dump_wrapper.rb +62 -0
  93. data/lib/utils/dumpdecrypted/README +4 -0
  94. data/lib/utils/dumpdecrypted/dumpdecrypted_armv6.dylib +0 -0
  95. data/lib/utils/dumpdecrypted/dumpdecrypted_armv7.dylib +0 -0
  96. data/lib/utils/ios-ssl-kill-switch/com.isecpartners.nabla.sslkillswitch_v0.5-iOS_6.1.deb +0 -0
  97. data/lib/utils/keychain_dump/README +2 -0
  98. data/lib/utils/keychain_dump/keychain_dump +0 -0
  99. data/lib/utils/pbwatcher/pbwatcher +0 -0
  100. data/lib/utils/pcviewer/protectionclassviewer +0 -0
  101. data/lib/utils/weak_class_dump/README +5 -0
  102. data/lib/utils/weak_class_dump/weak_classdump.cy +726 -0
  103. metadata +412 -0
@@ -0,0 +1,57 @@
1
+ require_relative 'otool_wrapper'
2
+ require_relative 'app'
3
+
4
+ module Idb
5
+ class AppBinary
6
+
7
+ def initialize app_binary
8
+ @otool = OtoolWrapper.new app_binary
9
+ end
10
+
11
+ def get_shared_libraries
12
+ @otool.shared_libraries
13
+ end
14
+
15
+ def setDecryptedPath path
16
+ @decrypted_path = path
17
+ end
18
+
19
+ def is_pie?
20
+ @otool.pie
21
+ end
22
+
23
+
24
+ def is_stack_protected?
25
+ @otool.canaries
26
+ end
27
+
28
+ def uses_arc?
29
+ @otool.arc
30
+ end
31
+
32
+ def is_encrypted?
33
+ encrypted = false
34
+ if @otool.load_commands.nil?
35
+ return "Error"
36
+ end
37
+ @otool.load_commands.each {|key, val|
38
+ if val['cmd'].strip.start_with?('LC_ENCRYPTION_INFO') and val['cryptid'].strip == 1.to_s
39
+ encrypted = true
40
+ end
41
+ }
42
+ return encrypted
43
+ end
44
+
45
+ def get_cryptid
46
+ if @otool.load_commands.nil?
47
+ return "Error"
48
+ end
49
+ @otool.load_commands.each {|key, val|
50
+ if val['cmd'] == 'LC_ENCRYPTION_INFO'
51
+ return val['cryptid']
52
+ end
53
+ }
54
+ return nil
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,151 @@
1
+ require 'openssl'
2
+ require 'digest/sha1'
3
+ require 'sqlite3'
4
+ require "webrick"
5
+
6
+
7
+
8
+ module Idb
9
+ class CAInterface
10
+
11
+ # performs uninstall based on sha1 hash provided in certfile
12
+ def remove_cert cert
13
+ der = cert.to_der
14
+
15
+ query = %Q|DELETE FROM "tsettings" WHERE sha1 = #{blobify(sha1_from_der der)};|
16
+ begin
17
+ db = SQLite3::Database.new(@db_path)
18
+ db.execute(query)
19
+ db.close
20
+ rescue Exception => e
21
+ raise "[*] Error writing to SQLite database at #{@db_path}: #{e.message}"
22
+ return
23
+ end
24
+ puts "[*] Operation complete"
25
+ end
26
+
27
+ def server_cert cert_file
28
+ FileUtils.mkpath "#{$tmp_path}/CAs"
29
+ cert_file_cache = "#{$tmp_path}/CAs/CA.pem"
30
+
31
+ FileUtils.copy cert_file, cert_file_cache
32
+ #copy cert file to tmp
33
+ @server_thread = Thread.new {
34
+ @server = WEBrick::HTTPServer.new(:Port => $settings['idb_utility_port'])
35
+ @server.mount "/", WEBrick::HTTPServlet::FileHandler, "#{$tmp_path}/CAs/"
36
+ @server.start
37
+ }
38
+
39
+ sleep 0.5
40
+ $device.open_url "http://localhost:#{$settings['idb_utility_port']}/CA.pem"
41
+
42
+ end
43
+
44
+ def stop_cert_server
45
+ @server.stop unless @server.nil?
46
+ @server_thread.terminate unless @server_thread.nil?
47
+ end
48
+
49
+
50
+ def add_cert cert_file
51
+ cert_file = File.expand_path(cert_file)
52
+ if not File.exist? cert_file
53
+ raise "File #{cert_file} does not exist."
54
+ end
55
+
56
+ cert = parse_certificate cert_file
57
+
58
+ # create plist file
59
+ #TODO might want to use the plist library instead
60
+ tset = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<array/>\n</plist>\n"
61
+ data = cert[:cert].to_der
62
+
63
+ puts "[*] Inserting certificate into trust store..."
64
+
65
+ query = %Q|INSERT INTO "tsettings" VALUES(#{blobify(cert[:fprint])},#{blobify(cert[:subject])},#{blobify(tset)},#{blobify(data)});|
66
+ begin
67
+ db = SQLite3::Database.new(@db_path)
68
+ db.execute(query)
69
+ db.close
70
+ rescue Exception => e
71
+ if e.message.include? "column sha1 is not unique"
72
+ raise "The same certificate is installed already."
73
+ else
74
+ raise "Error writing to SQLite database at #{@db_path}: #{e.message}"
75
+ end
76
+ return
77
+ end
78
+ end
79
+
80
+ def get_certs
81
+ query = %Q|SELECT * FROM "tsettings";|
82
+ begin
83
+ db = SQLite3::Database.new(@db_path)
84
+ result = db.execute(query)
85
+ db.close
86
+ rescue Exception => e
87
+ raise "Error reading from SQLite database at #{@db_path}: #{e.message}"
88
+ end
89
+ result.map { |x|
90
+ OpenSSL::X509::Certificate.new(x[3])
91
+ }
92
+ end
93
+
94
+
95
+ def sha1_from_der der
96
+ Digest::SHA1.digest(der)
97
+ end
98
+
99
+ private
100
+
101
+ def string_to_hex(s)
102
+ s.unpack('H*')[0]
103
+ end
104
+
105
+ def blobify(bin)
106
+ "X'#{string_to_hex bin}'"
107
+ end
108
+
109
+ def parse_certificate cert_file
110
+ puts "[*] Reading and converting certificate..."
111
+ # Open and convert certificate
112
+ cert = OpenSSL::X509::Certificate.new(File.read(cert_file))
113
+ fprint = sha1_from_der cert.to_der
114
+ subj = cert.subject.to_der
115
+ puts subj.inspect
116
+ # Thanks Andy Schmitz
117
+ #toSkip = (subj[1].ord & 0x80) == 0 ? 2 : ((subj[2].ord & 0x7f) + 2)
118
+ toSkip = 3
119
+ subj = subj[toSkip..-1]
120
+ # subj = subj.gsub("PortSwigger","PORTSWIGGER")
121
+ #subj = "1\v0\t\x06\x03U\x04\x06\x13\x02US1\v0\t\x06\x03U\x04\b\x13\x02IL1\x100\x0E\x06\x03U\x04\a\x13\aCHICAGO1\x1A0\x18\x06\x03U\x04\n\x13\x11MATASANO SECURITY1\e0\x19\x06\x03U\x04\v\x13\x12PENTESTING MADNESS1\x1F0\x1D\x06\x03U\x04\x03\x13\x16CA.DANIEL.MATASANO.COM"
122
+ puts subj.inspect
123
+
124
+ #subj = "1\x140\x12\x06\x03U\x04\x06\x13\vPORTSWIGGER1\x140\x12\x06\x03U\x04\b\x13\vPORTSWIGGER1\x140\x12\x06\x03U\x04\a\x13\vPORTSWIGGER1\x140\x12\x06\x03U\x04\n\x13\vPORTSWIGGER1\x170\x15\x06\x03U\x04\v\x13\x0EPORTSWIGGER CA1\x170\x15\x06\x03U\x04\x03\x13\x0EPORTSWIGGER CA"
125
+
126
+ return {:cert => cert, :fprint => fprint, :subject => subj}
127
+ end
128
+
129
+
130
+ def validate? cert_file
131
+ if not File.exist? cert_file
132
+ puts "File #{cert_file} does not exist."
133
+ return false
134
+ end
135
+
136
+ if not File.file? cert_file
137
+ puts "#{cert_file} is not a file."
138
+ return false
139
+ end
140
+
141
+ return true
142
+ end
143
+ end
144
+
145
+ class CAServlet < WEBrick::HTTPServlet::AbstractServlet
146
+ def do_GET (request, response)
147
+
148
+ end
149
+
150
+ end
151
+ end
File without changes
@@ -0,0 +1,24 @@
1
+ module Idb
2
+ class ConsoleLauncher
3
+
4
+ def initialize
5
+ # if os x
6
+ #'/Applications/iTerm.app'
7
+ # '/Applications/Utilities/Terminal.app/ '
8
+ #if linux
9
+ # terminator, gnome-terminal, Konsole(?), xterm
10
+ @term = "terminator"
11
+ end
12
+
13
+
14
+ def run cmd
15
+ command = "#{@term} -x sh -c '#{cmd}'"
16
+ puts command
17
+ Process.spawn command
18
+
19
+ end
20
+
21
+
22
+
23
+ end
24
+ end
@@ -0,0 +1,438 @@
1
+ # encoding: utf-8
2
+
3
+ require_relative 'abstract_device'
4
+ require_relative 'ssh_port_forwarder'
5
+ require_relative 'device_ca_interface'
6
+ require_relative 'usb_muxd_wrapper'
7
+
8
+ module Idb
9
+ class Device < AbstractDevice
10
+ attr_accessor :usb_ssh_port, :mode, :tool_port
11
+
12
+ def initialize username, password, hostname, port
13
+ @apps_dir = '/private/var/mobile/Applications'
14
+ @username = username
15
+ @password = password
16
+ @hostname = hostname
17
+ @port = port
18
+
19
+ @app = nil
20
+
21
+ @device_app_paths = Hash.new
22
+ @device_app_paths[:cycript] = [ "/usr/bin/cycript" ]
23
+ @device_app_paths[:rsync] = [ "/usr/bin/rsync" ]
24
+ @device_app_paths[:open] = ["/usr/bin/open"]
25
+ @device_app_paths[:openurl] = ["/usr/bin/uiopen", "/usr/bin/openurl", "/usr/bin/openURL"]
26
+ @device_app_paths[:aptget] = ["/usr/bin/apt-get", "/usr/bin/aptitude"]
27
+ @device_app_paths[:keychaindump] = [ "/var/root/keychain_dump"]
28
+ @device_app_paths[:pcviewer] = ["/var/root/protectionclassviewer"]
29
+ @device_app_paths[:pbwatcher] = ["/var/root/pbwatcher"]
30
+ @device_app_paths[:dumpdecrypted_armv7] = ["/var/root/dumpdecrypted_armv7.dylib"]
31
+ @device_app_paths[:dumpdecrypted_armv6] = ["/var/root/dumpdecrypted_armv6.dylib"]
32
+ @device_app_paths[:clutch] = ["/usr/bin/Clutch"]
33
+
34
+ if $settings['device_connection_mode'] == "ssh"
35
+ $log.debug "Connecting via SSH"
36
+ @mode = 'ssh'
37
+ @ops = SSHOperations.new username, password, hostname, port
38
+ else
39
+ $log.debug "Connecting via USB"
40
+ @mode = 'usb'
41
+ @usbmuxd = USBMuxdWrapper.new
42
+ proxy_port = @usbmuxd.find_available_port
43
+ $log.debug "Using port #{proxy_port} for SSH forwarding"
44
+
45
+ @usbmuxd.proxy proxy_port, $settings['ssh_port']
46
+ sleep 1
47
+
48
+
49
+
50
+
51
+ @ops = SSHOperations.new username, password, 'localhost', proxy_port
52
+
53
+ @usb_ssh_port = $settings['manual_ssh_port']
54
+ $log.debug "opening port #{proxy_port} for manual ssh connection"
55
+ @usbmuxd.proxy @usb_ssh_port, $settings['ssh_port']
56
+
57
+ @tool_port = @usbmuxd.find_available_port
58
+ $log.debug "opening tool port #{@tool_port} for internal ssh connection"
59
+ @usbmuxd.proxy @tool_port, $settings['ssh_port']
60
+
61
+ end
62
+
63
+ start_port_forwarding
64
+ end
65
+
66
+ def ssh
67
+ @ops.ssh
68
+ end
69
+
70
+
71
+ def disconnect
72
+ @ops.disconnect
73
+ end
74
+
75
+ def device?
76
+ true
77
+ end
78
+
79
+ def arch
80
+ "armv7"
81
+ end
82
+
83
+ def start_port_forwarding
84
+ @port_forward_pid = Process.spawn("#{RbConfig.ruby} lib/helper/ssh_port_forwarder.rb" )
85
+ end
86
+
87
+ def restart_port_forwarding
88
+ $log.info "Restarting SSH port forwarding"
89
+ Process.kill("INT", @port_forward_pid)
90
+ start_port_forwarding
91
+ end
92
+
93
+ def protection_class file
94
+ @ops.execute "#{pcviewer_path} '#{file}'"
95
+ end
96
+
97
+ def simulator?
98
+ false
99
+ end
100
+
101
+ def app_launch app
102
+ @ops.launch_app(open_path, app.bundle_id)
103
+ end
104
+
105
+
106
+ def dump_keychain
107
+ device_store_path = "/var/root/genp.plist"
108
+ local_dir = "#{$tmp_path}/device/"
109
+ local_path = "#{local_dir}/genp.plist"
110
+ FileUtils.mkdir_p local_dir unless Dir.exist? local_dir
111
+
112
+ $log.info "Dumping keychain..."
113
+ @ops.execute "#{keychain_dump_path}"
114
+ $log.info "Downloading dumped keychain..."
115
+ @ops.download device_store_path, local_path
116
+ end
117
+
118
+
119
+
120
+
121
+ def is_installed? tool
122
+ $log.info "Checking if #{tool} is installed..."
123
+ if path_for(tool).nil?
124
+ $log.warn "#{tool} not found."
125
+ false
126
+ else
127
+ $log.info "#{tool} found at #{path_for(tool)}."
128
+ true
129
+ end
130
+ end
131
+
132
+ def path_for tool
133
+ @device_app_paths[tool].each { |x|
134
+ if @ops.file_exists? x
135
+ return x
136
+ end
137
+ }
138
+ return nil
139
+ end
140
+
141
+
142
+ def install_dumpdecrypted
143
+ upload_dumpdecrypted
144
+ end
145
+
146
+ def install_dumpdecrypted_old
147
+ unless File.exist? "utils/dumpdecrypted/dumpdecrypted.dylib"
148
+ puts "[**] Warning: dumpdecrypted not compiled."
149
+ puts "[**] Due to licensing issue we cannot ship the compiled library with this tool."
150
+ puts "[**] Attempting compilation (requires a valid iOS SDK installation)..."
151
+ compile_dumpdecrypted
152
+
153
+ if File.exist? "utils/dumpdecrypted/dumpdecrypted.dylib"
154
+ puts "[**] Compilation successful."
155
+ upload_dumpdecryted
156
+ else
157
+ puts "[**] Error: Compilation failed."
158
+ puts "[**] Change into the utils/dumpdecrypted directory, adjust the makefile, and compile."
159
+ end
160
+ else
161
+ upload_dumpdecryted
162
+ end
163
+ end
164
+
165
+
166
+ def compile_dumpdecrypted
167
+ base_dir = '/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer'
168
+ unless Dir.exist? base_dir
169
+ puts "[**] Error, iOS Platform tools not found at #{base_dir}"
170
+ return
171
+ end
172
+
173
+
174
+ bin_dir = "#{base_dir}/usr/bin"
175
+ sdk_dir = Dir.glob("#{base_dir}/SDKs/iPhoneOS*.sdk/").first
176
+ puts "[*] Found SDK dir: #{sdk_dir}"
177
+
178
+ library_name = "dumpdecrypted.dylib"
179
+ gcc = "#{bin_dir}/gcc"
180
+
181
+ unless File.exist? gcc
182
+ puts "[**] Error: gcc not found at #{gcc}"
183
+ puts "[**] Ensure that the Command Line Utilities are installed in XCode 4."
184
+ puts "[**] XCode 5 does not ship with llvm-gcc anymore."
185
+ return
186
+ end
187
+
188
+
189
+
190
+ params = ["-arch armv7", # adjust if necessary
191
+ "-wimplicit",
192
+ "-isysroot #{sdk_dir}",
193
+ "-F#{sdk_dir}System/Library/Frameworks",
194
+ "-F#{sdk_dir}System/Library/PrivateFrameworks",
195
+ "-dynamiclib",
196
+ "-o #{library_name}"].join(' ')
197
+
198
+ compile_cmd = "#{gcc} #{params} dumpdecrypted.c"
199
+ puts "Running #{compile_cmd}"
200
+
201
+ Dir.chdir("utils/dumpdecrypted") do
202
+ `#{compile_cmd}`
203
+ end
204
+ end
205
+
206
+
207
+ def upload_dumpdecrypted
208
+ $log.info "Uploading dumpdecrypted library..."
209
+ @ops.upload("utils/dumpdecrypted/dumpdecrypted_armv6.dylib","/var/root/dumpdecrypted_armv6.dylib")
210
+ @ops.upload("utils/dumpdecrypted/dumpdecrypted_armv7.dylib","/var/root/dumpdecrypted_armv7.dylib")
211
+ $log.info "'dumpdecrypted' installed successfully."
212
+ end
213
+
214
+ def install_keychain_dump
215
+ if File.exist? "utils/keychain_dump/keychain_dump"
216
+ upload_keychain_dump
217
+ else
218
+ $log.error "keychain_dump not found at 'utils/keychain_dump/keychain_dump'."
219
+ false
220
+ end
221
+ end
222
+ def install_pcviewer
223
+ if File.exist? "utils/pcviewer/protectionclassviewer"
224
+ upload_pcviewer
225
+ else
226
+ $log.error "protectionclassviewer not found at 'utils/pcviewer/protectionclassviewer'."
227
+ false
228
+ end
229
+ end
230
+
231
+
232
+ def install_pbwatcher
233
+ if File.exist? "utils/pbwatcher/pbwatcher"
234
+ upload_pbwatcher
235
+ else
236
+ $log.error "pbwatcher not found at 'utils/pbwatcher/pbwatcher'."
237
+ false
238
+ end
239
+ end
240
+
241
+ def upload_pcviewer
242
+ begin
243
+ $log.info "Uploading pcviewer..."
244
+ @ops.upload "utils/pcviewer/protectionclassviewer", "/var/root/protectionclassviewer"
245
+ @ops.chmod "/var/root/protectionclassviewer", 0744
246
+ $log.info "'pcviewer' installed successfully."
247
+ # true
248
+ # rescue
249
+ $log.error "Exception encountered when uploading pcviewer"
250
+ # false
251
+ end
252
+ end
253
+
254
+ def upload_keychain_dump
255
+ begin
256
+ $log.info "Uploading keychain_dump..."
257
+ @ops.upload "utils/keychain_dump/keychain_dump", "/var/root/keychain_dump"
258
+ @ops.chmod "/var/root/keychain_dump", 0744
259
+ $log.info "'keychain_dump' installed successfully."
260
+ # true
261
+ # rescue
262
+ $log.error "Exception encountered when uploading keychain_dump"
263
+ # false
264
+ end
265
+ end
266
+ def upload_pbwatcher
267
+ begin
268
+ $log.info "Uploading pbwatcher..."
269
+ @ops.upload "utils/pbwatcher/pbwatcher", "/var/root/pbwatcher"
270
+ @ops.chmod "/var/root/pbwatcher", 0744
271
+ $log.info "'pbwatcher' installed successfully."
272
+ # true
273
+ # rescue
274
+ $log.error "Exception encountered when uploading pbwatcher"
275
+ # false
276
+ end
277
+ end
278
+
279
+ def setup_clutch_sources
280
+ @ops.execute("echo “deb http://cydia.iphonecake.com ./“ > /etc/apt/sources.list.d/idb_clutch.list")
281
+ end
282
+
283
+ def install_from_cydia package
284
+ if apt_get_installed?
285
+ $log.info "Updating package repo..."
286
+ @ops.execute("#{apt_get_path} -y update")
287
+ $log.info "Installing #{package}..."
288
+ @ops.execute("#{apt_get_path} -y install #{package}")
289
+ return true
290
+ else
291
+ $log.error "apt-get or aptitude not found on the device"
292
+ return false
293
+ end
294
+ end
295
+
296
+ def install_open
297
+ install_from_cydia "com.conradkramer.open"
298
+ end
299
+
300
+ def install_clutch
301
+ install_from_cydia "com.iphonecake.clutch"
302
+ end
303
+
304
+ def install_rsync
305
+ install_from_cydia "rsync"
306
+ end
307
+
308
+ def install_cycript
309
+ install_from_cydia "cycript"
310
+ end
311
+
312
+ def close
313
+ $log.info "Terminating port forwarding helper..."
314
+ Process.kill("INT", @port_forward_pid)
315
+ $log.info "Stopping any SSH via USB forwarding"
316
+ @usbmuxd.stop_all
317
+ end
318
+
319
+ def open_url url
320
+ $log.info "Executing: #{openurl_path} #{url}"
321
+ @ops.execute "#{openurl_path} #{url}"
322
+ end
323
+
324
+ def ca_interface
325
+ DeviceCAInterface.new self
326
+ end
327
+
328
+ def kill_by_name process_name
329
+ @ops.execute "killall -9 #{process_name}"
330
+ end
331
+
332
+ def DEVICE_ID
333
+ $log.error "Not implemented"
334
+ nil
335
+ end
336
+
337
+ def configured?
338
+ if $settings['devices'].nil?
339
+ false
340
+ elsif $settings['devices'][device_id].nil?
341
+ false
342
+ else
343
+ true
344
+ end
345
+ end
346
+
347
+
348
+
349
+ def cycript_installed?
350
+ is_installed? :cycript
351
+ end
352
+
353
+ def keychain_dump_installed?
354
+ is_installed? :keychaindump
355
+ end
356
+
357
+ def pcviewer_installed?
358
+ is_installed? :pcviewer
359
+ end
360
+
361
+ def pbwatcher_installed?
362
+ is_installed? :pbwatcher
363
+ end
364
+
365
+ def dumpdecrypted_installed?
366
+ is_installed? :dumpdecrypted_armv6 and is_installed? :dumpdecrypted_armv7
367
+ end
368
+
369
+
370
+ def rsync_installed?
371
+ is_installed? :rsync
372
+ end
373
+
374
+ def open_installed?
375
+ is_installed? :open
376
+ end
377
+
378
+ def openurl_installed?
379
+ is_installed? :openurl
380
+ end
381
+
382
+ def apt_get_installed?
383
+ is_installed? :aptget
384
+ end
385
+
386
+ def clutch_installed?
387
+ is_installed? :clutch
388
+ end
389
+
390
+ def keychain_dump_path
391
+ path_for :keychaindump
392
+ end
393
+
394
+
395
+
396
+ def pcviewer_path
397
+ path_for :pcviewer
398
+ end
399
+
400
+
401
+ def pbwatcher_path
402
+ path_for :pbwatcher
403
+ end
404
+
405
+
406
+ def dumpdecrypted_path
407
+ path_for :dumpdecrypted_armv7
408
+ end
409
+
410
+ def rsync_path
411
+ path_for :rsync
412
+ end
413
+
414
+
415
+ def open_path
416
+ path_for :open
417
+ end
418
+
419
+
420
+ def openurl_path
421
+ path_for :openurl
422
+ end
423
+
424
+
425
+ def apt_get_path
426
+ path_for :aptget
427
+ end
428
+
429
+ def clutch_path
430
+ path_for :clutch
431
+ end
432
+
433
+ def cycript_path
434
+ path_for :cycript
435
+ end
436
+
437
+ end
438
+ end