idb 2.9.0 → 2.9.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +30 -0
- data/Gemfile.lock +5 -0
- data/idb.gemspec +1 -0
- data/lib/gui/app_binary_tab_widget.rb +7 -14
- data/lib/gui/app_details_group_box.rb +63 -88
- data/lib/gui/app_list_dialog.rb +29 -35
- data/lib/gui/app_list_widget_item.rb +1 -5
- data/lib/gui/app_tab_widget.rb +17 -22
- data/lib/gui/binary_strings_widget.rb +7 -15
- data/lib/gui/ca_manager_dialog.rb +32 -54
- data/lib/gui/cache_db_widget.rb +21 -26
- data/lib/gui/certificate_item.rb +2 -2
- data/lib/gui/default_protection_class_group_widget.rb +7 -12
- data/lib/gui/device_info_group_box.rb +26 -23
- data/lib/gui/main_tab_widget.rb +2 -21
- data/lib/gui/shared_libraries_widget.rb +1 -1
- data/lib/gui/sqlite_widget.rb +1 -3
- data/lib/gui/weak_class_dump_widget.rb +1 -1
- data/lib/idb.rb +3 -3
- data/lib/idb/version.rb +1 -1
- data/lib/lib/abstract_device.rb +7 -11
- data/lib/lib/app.rb +49 -59
- data/lib/lib/app_binary.rb +18 -29
- data/lib/lib/ca_interface.rb +46 -59
- data/lib/lib/device.rb +68 -155
- data/lib/lib/device_ca_interface.rb +7 -13
- data/lib/lib/host_file_wrapper.rb +6 -8
- data/lib/lib/ios8_last_launch_services_map_wrapper.rb +11 -18
- data/lib/lib/local_operations.rb +24 -32
- data/lib/lib/otool_wrapper.rb +30 -33
- data/lib/lib/rsync_git_manager.rb +26 -22
- data/lib/lib/screen_shot_util.rb +20 -28
- data/lib/lib/settings.rb +14 -17
- data/lib/lib/simulator.rb +11 -16
- data/lib/lib/simulator_ca_interface.rb +1 -3
- data/lib/lib/ssh_operations.rb +49 -65
- data/lib/lib/ssh_port_forwarder.rb +9 -13
- data/lib/lib/tools.rb +3 -3
- data/lib/lib/url_scheme_fuzzer.rb +41 -49
- data/lib/lib/usb_muxd_wrapper.rb +6 -8
- data/lib/lib/weak_class_dump_wrapper.rb +15 -16
- metadata +19 -9
- data/lib/gui/console_widget.rb +0 -163
- data/lib/gui/cycript_console_widget.rb +0 -68
- data/lib/gui/cycript_thread.rb +0 -81
- data/lib/lib/console_launcher.rb +0 -24
- data/lib/lib/i_device_diagnostics_wrapper.rb +0 -90
- data/lib/lib/snoop_it_wrapper.rb +0 -80
data/lib/lib/ca_interface.rb
CHANGED
@@ -3,42 +3,36 @@ require 'digest/sha1'
|
|
3
3
|
require 'sqlite3'
|
4
4
|
require "webrick"
|
5
5
|
|
6
|
-
|
7
|
-
|
8
6
|
module Idb
|
9
7
|
class CAInterface
|
10
|
-
|
11
8
|
# performs uninstall based on sha1 hash provided in certfile
|
12
|
-
def remove_cert
|
9
|
+
def remove_cert(cert)
|
13
10
|
der = cert.to_der
|
14
11
|
|
15
|
-
query = %
|
12
|
+
query = %(DELETE FROM "tsettings" WHERE sha1 = #{blobify(sha1_from_der(der))};)
|
16
13
|
begin
|
17
14
|
db = SQLite3::Database.new(@db_path)
|
18
15
|
db.execute(query)
|
19
16
|
db.close
|
20
|
-
rescue
|
17
|
+
rescue StandardError => e
|
21
18
|
raise "[*] Error writing to SQLite database at #{@db_path}: #{e.message}"
|
22
|
-
return
|
23
19
|
end
|
24
|
-
puts "[*] Operation complete"
|
25
20
|
end
|
26
21
|
|
27
|
-
def server_cert
|
22
|
+
def server_cert(cert_file)
|
28
23
|
FileUtils.mkpath "#{$tmp_path}/CAs"
|
29
24
|
cert_file_cache = "#{$tmp_path}/CAs/CA.pem"
|
30
25
|
|
31
26
|
FileUtils.copy cert_file, cert_file_cache
|
32
|
-
#copy cert file to tmp
|
33
|
-
@server_thread = Thread.new
|
34
|
-
@server = WEBrick::HTTPServer.new(:
|
27
|
+
# copy cert file to tmp
|
28
|
+
@server_thread = Thread.new do
|
29
|
+
@server = WEBrick::HTTPServer.new(Port: $settings['idb_utility_port'])
|
35
30
|
@server.mount "/", WEBrick::HTTPServlet::FileHandler, "#{$tmp_path}/CAs/"
|
36
31
|
@server.start
|
37
|
-
|
32
|
+
end
|
38
33
|
|
39
34
|
sleep 0.5
|
40
35
|
$device.open_url "http://localhost:#{$settings['idb_utility_port']}/CA.pem"
|
41
|
-
|
42
36
|
end
|
43
37
|
|
44
38
|
def stop_cert_server
|
@@ -46,53 +40,58 @@ module Idb
|
|
46
40
|
@server_thread.terminate unless @server_thread.nil?
|
47
41
|
end
|
48
42
|
|
49
|
-
|
50
|
-
def add_cert cert_file
|
43
|
+
def read_cert(cert_file)
|
51
44
|
cert_file = File.expand_path(cert_file)
|
52
|
-
|
53
|
-
raise "File #{cert_file} does not exist."
|
54
|
-
end
|
45
|
+
raise "File #{cert_file} does not exist." unless File.exist? cert_file
|
55
46
|
|
56
|
-
|
47
|
+
parse_certificate cert_file
|
48
|
+
end
|
49
|
+
|
50
|
+
def add_cert(cert_file)
|
51
|
+
cert = read_cert cert_file
|
57
52
|
|
58
53
|
# create plist file
|
59
|
-
#TODO might want to use the plist library instead
|
60
|
-
tset
|
61
|
-
|
54
|
+
# TODO might want to use the plist library instead
|
55
|
+
tset = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" \
|
56
|
+
"<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\"" \
|
57
|
+
" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n" \
|
58
|
+
"<plist version=\"1.0\">\n<array/>\n</plist>\n"
|
59
|
+
data = cert[:cert].to_der
|
60
|
+
|
61
|
+
insert_cert_into_trust_store cert[:fprint], cert[:subject], tset, data
|
62
|
+
end
|
62
63
|
|
64
|
+
def insert_cert_into_trust_store(fprint, subject, tset, data)
|
63
65
|
puts "[*] Inserting certificate into trust store..."
|
64
66
|
|
65
|
-
query =
|
67
|
+
query = %|INSERT INTO "tsettings" VALUES(#{blobify(fprint)},
|
68
|
+
#{blobify(subject)},#{blobify(tset)},#{blobify(data)});|
|
66
69
|
begin
|
67
70
|
db = SQLite3::Database.new(@db_path)
|
68
71
|
db.execute(query)
|
69
72
|
db.close
|
70
|
-
rescue
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
raise "Error writing to SQLite database at #{@db_path}: #{e.message}"
|
75
|
-
end
|
76
|
-
return
|
73
|
+
rescue StandardError => e
|
74
|
+
error = "column sha1 is not unique"
|
75
|
+
raise "The certificate is installed already." if e.message.include? error
|
76
|
+
raise "Error writing to SQLite database at #{@db_path}: #{e.message}"
|
77
77
|
end
|
78
78
|
end
|
79
79
|
|
80
|
-
def
|
81
|
-
query = %
|
80
|
+
def certs
|
81
|
+
query = %(SELECT * FROM "tsettings";)
|
82
82
|
begin
|
83
83
|
db = SQLite3::Database.new(@db_path)
|
84
84
|
result = db.execute(query)
|
85
85
|
db.close
|
86
|
-
rescue
|
86
|
+
rescue StandardError => e
|
87
87
|
raise "Error reading from SQLite database at #{@db_path}: #{e.message}"
|
88
88
|
end
|
89
|
-
result.map
|
89
|
+
result.map do |x|
|
90
90
|
OpenSSL::X509::Certificate.new(x[3])
|
91
|
-
|
91
|
+
end
|
92
92
|
end
|
93
93
|
|
94
|
-
|
95
|
-
def sha1_from_der der
|
94
|
+
def sha1_from_der(der)
|
96
95
|
Digest::SHA1.digest(der)
|
97
96
|
end
|
98
97
|
|
@@ -106,7 +105,7 @@ module Idb
|
|
106
105
|
"X'#{string_to_hex bin}'"
|
107
106
|
end
|
108
107
|
|
109
|
-
def parse_certificate
|
108
|
+
def parse_certificate(cert_file)
|
110
109
|
puts "[*] Reading and converting certificate..."
|
111
110
|
# Open and convert certificate
|
112
111
|
cert = OpenSSL::X509::Certificate.new(File.read(cert_file))
|
@@ -114,38 +113,26 @@ module Idb
|
|
114
113
|
subj = cert.subject.to_der
|
115
114
|
puts subj.inspect
|
116
115
|
# Thanks Andy Schmitz
|
117
|
-
#
|
118
|
-
|
119
|
-
subj
|
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"
|
116
|
+
# to_skip = (subj[1].ord & 0x80) == 0 ? 2 : ((subj[2].ord & 0x7f) + 2)
|
117
|
+
to_skip = 3
|
118
|
+
subj = subj[to_skip..-1]
|
122
119
|
puts subj.inspect
|
123
120
|
|
124
|
-
|
125
|
-
|
126
|
-
return {:cert => cert, :fprint => fprint, :subject => subj}
|
121
|
+
{ cert: cert, fprint: fprint, subject: subj }
|
127
122
|
end
|
128
123
|
|
129
|
-
|
130
|
-
|
131
|
-
if not File.exist? cert_file
|
124
|
+
def validate?(cert_file)
|
125
|
+
unless File.exist? cert_file
|
132
126
|
puts "File #{cert_file} does not exist."
|
133
127
|
return false
|
134
128
|
end
|
135
129
|
|
136
|
-
|
130
|
+
unless File.file? cert_file
|
137
131
|
puts "#{cert_file} is not a file."
|
138
132
|
return false
|
139
133
|
end
|
140
134
|
|
141
|
-
|
135
|
+
true
|
142
136
|
end
|
143
137
|
end
|
144
|
-
|
145
|
-
class CAServlet < WEBrick::HTTPServlet::AbstractServlet
|
146
|
-
def do_GET (request, response)
|
147
|
-
|
148
|
-
end
|
149
|
-
|
150
|
-
end
|
151
138
|
end
|
data/lib/lib/device.rb
CHANGED
@@ -9,10 +9,9 @@ require 'json'
|
|
9
9
|
module Idb
|
10
10
|
class Device < AbstractDevice
|
11
11
|
attr_accessor :usb_ssh_port, :mode, :tool_port, :ios_version
|
12
|
+
attr_reader :data_dir
|
12
13
|
|
13
|
-
def initialize
|
14
|
-
|
15
|
-
|
14
|
+
def initialize(username, password, hostname, port)
|
16
15
|
@username = username
|
17
16
|
@password = password
|
18
17
|
@hostname = hostname
|
@@ -20,13 +19,15 @@ module Idb
|
|
20
19
|
|
21
20
|
@app = nil
|
22
21
|
|
23
|
-
@device_app_paths =
|
24
|
-
@device_app_paths[:cycript] = [
|
25
|
-
@device_app_paths[:rsync] = [
|
22
|
+
@device_app_paths = {}
|
23
|
+
@device_app_paths[:cycript] = ["/usr/bin/cycript"]
|
24
|
+
@device_app_paths[:rsync] = ["/usr/bin/rsync"]
|
26
25
|
@device_app_paths[:open] = ["/usr/bin/open"]
|
27
|
-
@device_app_paths[:openurl] = ["/usr/bin/uiopen",
|
28
|
-
|
29
|
-
|
26
|
+
@device_app_paths[:openurl] = ["/usr/bin/uiopen",
|
27
|
+
"/usr/bin/openurl",
|
28
|
+
"/usr/bin/openURL"]
|
29
|
+
@device_app_paths[:aptget] = ["/usr/bin/apt-get", "/usr/bin/aptitude"]
|
30
|
+
@device_app_paths[:keychaineditor] = ["/var/root/keychaineditor"]
|
30
31
|
@device_app_paths[:pcviewer] = ["/var/root/protectionclassviewer"]
|
31
32
|
@device_app_paths[:pbwatcher] = ["/var/root/pbwatcher"]
|
32
33
|
@device_app_paths[:dumpdecrypted_armv7] = ["/usr/lib/dumpdecrypted_armv7.dylib"]
|
@@ -45,10 +46,7 @@ module Idb
|
|
45
46
|
|
46
47
|
@usbmuxd.proxy proxy_port, $settings['ssh_port']
|
47
48
|
sleep 1
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
49
|
+
|
52
50
|
@ops = SSHOperations.new username, password, 'localhost', proxy_port
|
53
51
|
|
54
52
|
@usb_ssh_port = $settings['manual_ssh_port']
|
@@ -87,6 +85,7 @@ module Idb
|
|
87
85
|
$log.error "Unsupported iOS Version."
|
88
86
|
raise
|
89
87
|
end
|
88
|
+
$log.info "iOS Version: #{@ios_version} with apps dir: #{@apps_dir} and data dir: #{@data_dir}"
|
90
89
|
|
91
90
|
start_port_forwarding
|
92
91
|
end
|
@@ -95,7 +94,6 @@ module Idb
|
|
95
94
|
@ops.ssh
|
96
95
|
end
|
97
96
|
|
98
|
-
|
99
97
|
def disconnect
|
100
98
|
@ops.disconnect
|
101
99
|
end
|
@@ -109,7 +107,8 @@ module Idb
|
|
109
107
|
end
|
110
108
|
|
111
109
|
def start_port_forwarding
|
112
|
-
|
110
|
+
command = "#{RbConfig.ruby} #{Idb.root}/lib/helper/ssh_port_forwarder.rb"
|
111
|
+
@port_forward_pid = Process.spawn(command)
|
113
112
|
end
|
114
113
|
|
115
114
|
def restart_port_forwarding
|
@@ -118,7 +117,7 @@ module Idb
|
|
118
117
|
start_port_forwarding
|
119
118
|
end
|
120
119
|
|
121
|
-
def protection_class
|
120
|
+
def protection_class(file)
|
122
121
|
@ops.execute "#{pcviewer_path} '#{file}'"
|
123
122
|
end
|
124
123
|
|
@@ -126,11 +125,11 @@ module Idb
|
|
126
125
|
false
|
127
126
|
end
|
128
127
|
|
129
|
-
def app_launch
|
128
|
+
def app_launch(app)
|
130
129
|
@ops.launch_app(open_path, app.bundle_id)
|
131
130
|
end
|
132
131
|
|
133
|
-
def is_installed?
|
132
|
+
def is_installed?(tool)
|
134
133
|
$log.info "Checking if #{tool} is installed..."
|
135
134
|
if path_for(tool).nil?
|
136
135
|
$log.warn "#{tool} not found."
|
@@ -141,16 +140,13 @@ module Idb
|
|
141
140
|
end
|
142
141
|
end
|
143
142
|
|
144
|
-
def path_for
|
145
|
-
@device_app_paths[tool].each
|
146
|
-
if @ops.file_exists?
|
147
|
-
|
148
|
-
|
149
|
-
}
|
150
|
-
return nil
|
143
|
+
def path_for(tool)
|
144
|
+
@device_app_paths[tool].each do |device_app_path|
|
145
|
+
return device_app_path if @ops.file_exists? device_app_path
|
146
|
+
end
|
147
|
+
nil
|
151
148
|
end
|
152
149
|
|
153
|
-
|
154
150
|
def install_dumpdecrypted
|
155
151
|
upload_dumpdecrypted
|
156
152
|
# Change permissions as this needs to be run as the mobile user
|
@@ -158,142 +154,70 @@ module Idb
|
|
158
154
|
@ops.chmod dumpdecrypted_path_armv6, 0755
|
159
155
|
end
|
160
156
|
|
161
|
-
def install_dumpdecrypted_old
|
162
|
-
unless File.exist? "utils/dumpdecrypted/dumpdecrypted.dylib"
|
163
|
-
puts "[**] Warning: dumpdecrypted not compiled."
|
164
|
-
puts "[**] Due to licensing issue we cannot ship the compiled library with this tool."
|
165
|
-
puts "[**] Attempting compilation (requires a valid iOS SDK installation)..."
|
166
|
-
compile_dumpdecrypted
|
167
|
-
|
168
|
-
if File.exist? "utils/dumpdecrypted/dumpdecrypted.dylib"
|
169
|
-
puts "[**] Compilation successful."
|
170
|
-
upload_dumpdecryted
|
171
|
-
else
|
172
|
-
puts "[**] Error: Compilation failed."
|
173
|
-
puts "[**] Change into the utils/dumpdecrypted directory, adjust the makefile, and compile."
|
174
|
-
end
|
175
|
-
else
|
176
|
-
upload_dumpdecryted
|
177
|
-
end
|
178
|
-
end
|
179
|
-
|
180
|
-
|
181
|
-
def compile_dumpdecrypted
|
182
|
-
base_dir = '/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer'
|
183
|
-
unless Dir.exist? base_dir
|
184
|
-
puts "[**] Error, iOS Platform tools not found at #{base_dir}"
|
185
|
-
return
|
186
|
-
end
|
187
|
-
|
188
|
-
|
189
|
-
bin_dir = "#{base_dir}/usr/bin"
|
190
|
-
sdk_dir = Dir.glob("#{base_dir}/SDKs/iPhoneOS*.sdk/").first
|
191
|
-
puts "[*] Found SDK dir: #{sdk_dir}"
|
192
|
-
|
193
|
-
library_name = "dumpdecrypted.dylib"
|
194
|
-
gcc = "#{bin_dir}/gcc"
|
195
|
-
|
196
|
-
unless File.exist? gcc
|
197
|
-
puts "[**] Error: gcc not found at #{gcc}"
|
198
|
-
puts "[**] Ensure that the Command Line Utilities are installed in XCode 4."
|
199
|
-
puts "[**] XCode 5 does not ship with llvm-gcc anymore."
|
200
|
-
return
|
201
|
-
end
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
params = ["-arch armv7", # adjust if necessary
|
206
|
-
"-wimplicit",
|
207
|
-
"-isysroot #{sdk_dir}",
|
208
|
-
"-F#{sdk_dir}System/Library/Frameworks",
|
209
|
-
"-F#{sdk_dir}System/Library/PrivateFrameworks",
|
210
|
-
"-dynamiclib",
|
211
|
-
"-o #{library_name}"].join(' ')
|
212
|
-
|
213
|
-
compile_cmd = "#{gcc} #{params} dumpdecrypted.c"
|
214
|
-
puts "Running #{compile_cmd}"
|
215
|
-
|
216
|
-
Dir.chdir("utils/dumpdecrypted") do
|
217
|
-
`#{compile_cmd}`
|
218
|
-
end
|
219
|
-
end
|
220
|
-
|
221
|
-
|
222
157
|
def upload_dumpdecrypted
|
223
158
|
$log.info "Uploading dumpdecrypted library..."
|
224
|
-
@ops.upload("#{Idb.root}/lib/utils/dumpdecrypted/dumpdecrypted_armv6.dylib",
|
225
|
-
|
159
|
+
@ops.upload("#{Idb.root}/lib/utils/dumpdecrypted/dumpdecrypted_armv6.dylib",
|
160
|
+
@device_app_paths[:dumpdecrypted_armv6].first)
|
161
|
+
@ops.upload("#{Idb.root}/lib/utils/dumpdecrypted/dumpdecrypted_armv7.dylib",
|
162
|
+
@device_app_paths[:dumpdecrypted_armv7].first)
|
226
163
|
$log.info "'dumpdecrypted' installed successfully."
|
227
164
|
end
|
228
165
|
|
229
166
|
def install_keychain_editor
|
230
|
-
|
167
|
+
keychaineditor_path = "#{Idb.root}/lib/utils/keychain_editor/keychaineditor"
|
168
|
+
if File.exist? keychaineditor_path
|
231
169
|
upload_keychain_editor
|
232
170
|
else
|
233
|
-
$log.error "keychain_editor not found at '#{
|
171
|
+
$log.error "keychain_editor not found at '#{keychaineditor_path}'."
|
234
172
|
false
|
235
173
|
end
|
236
174
|
end
|
175
|
+
|
237
176
|
def install_pcviewer
|
238
|
-
|
177
|
+
pcviewer_path = "#{Idb.root}/lib/utils/pcviewer/protectionclassviewer"
|
178
|
+
if File.exist? pcviewer_path
|
239
179
|
upload_pcviewer
|
240
180
|
else
|
241
|
-
$log.error "protectionclassviewer not found at '#{
|
181
|
+
$log.error "protectionclassviewer not found at '#{pcviewer_path}'."
|
242
182
|
false
|
243
183
|
end
|
244
184
|
end
|
245
185
|
|
246
|
-
|
247
186
|
def install_pbwatcher
|
248
|
-
|
187
|
+
pbwatcher_path = "#{Idb.root}/lib/utils/pbwatcher/pbwatcher"
|
188
|
+
if File.exist? pbwatcher_path
|
249
189
|
upload_pbwatcher
|
250
190
|
else
|
251
|
-
$log.error "pbwatcher not found at '#{
|
191
|
+
$log.error "pbwatcher not found at '#{pbwatcher_path}'."
|
252
192
|
false
|
253
193
|
end
|
254
194
|
end
|
255
195
|
|
256
196
|
def upload_pcviewer
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
# true
|
263
|
-
# rescue
|
264
|
-
$log.error "Exception encountered when uploading pcviewer"
|
265
|
-
# false
|
266
|
-
end
|
197
|
+
local_pcviewer_path = "#{Idb.root}/lib/utils/pcviewer/protectionclassviewer"
|
198
|
+
$log.info "Uploading pcviewer..."
|
199
|
+
@ops.upload local_pcviewer_path, "/var/root/protectionclassviewer"
|
200
|
+
@ops.chmod "/var/root/protectionclassviewer", 0744
|
201
|
+
$log.info "'pcviewer' installed successfully."
|
267
202
|
end
|
268
203
|
|
269
204
|
def upload_keychain_editor
|
270
|
-
|
271
|
-
|
272
|
-
|
273
|
-
|
274
|
-
|
275
|
-
# true
|
276
|
-
# rescue
|
277
|
-
$log.error "Exception encountered when uploading keychain_editor"
|
278
|
-
# false
|
279
|
-
end
|
205
|
+
local_keychaineditor_path = "#{Idb.root}/lib/utils/keychain_editor/keychaineditor"
|
206
|
+
$log.info "Uploading keychain_editor..."
|
207
|
+
@ops.upload local_keychaineditor_path, "/var/root/keychaineditor"
|
208
|
+
@ops.chmod "/var/root/keychaineditor", 0744
|
209
|
+
$log.info "'keychain_editor' installed successfully."
|
280
210
|
end
|
211
|
+
|
281
212
|
def upload_pbwatcher
|
282
|
-
|
283
|
-
|
284
|
-
|
285
|
-
|
286
|
-
|
287
|
-
$log.info "'pbwatcher' installed successfully."
|
288
|
-
# true
|
289
|
-
# rescue
|
290
|
-
$log.error "Exception encountered when uploading pbwatcher"
|
291
|
-
# false
|
292
|
-
end
|
213
|
+
local_pbwatcher_path = "#{Idb.root}/lib/utils/pbwatcher/pbwatcher"
|
214
|
+
$log.info "Uploading pbwatcher..."
|
215
|
+
@ops.upload local_pbwatcher_path, "/var/root/pbwatcher"
|
216
|
+
@ops.chmod "/var/root/pbwatcher", 0744
|
217
|
+
$log.info "'pbwatcher' installed successfully."
|
293
218
|
end
|
294
219
|
|
295
|
-
|
296
|
-
def install_from_cydia package
|
220
|
+
def install_from_cydia(package)
|
297
221
|
if apt_get_installed?
|
298
222
|
$log.info "Updating package repo..."
|
299
223
|
@ops.execute("#{apt_get_path} -y update")
|
@@ -325,13 +249,11 @@ module Idb
|
|
325
249
|
Process.kill("INT", @port_forward_pid)
|
326
250
|
$log.info "Stopping any SSH via USB forwarding"
|
327
251
|
|
328
|
-
if $settings['device_connection_mode'] != "ssh"
|
329
|
-
@usbmuxd.stop_all
|
330
|
-
end
|
252
|
+
@usbmuxd.stop_all if $settings['device_connection_mode'] != "ssh"
|
331
253
|
end
|
332
254
|
|
333
|
-
def open_url
|
334
|
-
command = "#{openurl_path} \"#{url.gsub('&','\&')}\""
|
255
|
+
def open_url(url)
|
256
|
+
command = "#{openurl_path} \"#{url.gsub('&', '\&')}\""
|
335
257
|
$log.info "Executing: #{command}"
|
336
258
|
@ops.execute command
|
337
259
|
end
|
@@ -340,29 +262,27 @@ module Idb
|
|
340
262
|
DeviceCAInterface.new self
|
341
263
|
end
|
342
264
|
|
343
|
-
def kill_by_name
|
265
|
+
def kill_by_name(process_name)
|
344
266
|
@ops.execute "killall -9 #{process_name}"
|
345
267
|
end
|
346
268
|
|
347
269
|
def device_id
|
348
|
-
|
349
270
|
$log.error "Not implemented"
|
350
271
|
nil
|
351
272
|
end
|
352
273
|
|
353
274
|
def configured?
|
354
|
-
apt_get_installed?
|
355
|
-
|
356
|
-
|
357
|
-
|
358
|
-
|
359
|
-
|
360
|
-
|
361
|
-
|
362
|
-
|
275
|
+
apt_get_installed? &&
|
276
|
+
open_installed? &&
|
277
|
+
openurl_installed? &&
|
278
|
+
dumpdecrypted_installed? &&
|
279
|
+
pbwatcher_installed? &&
|
280
|
+
pcviewer_installed? &&
|
281
|
+
keychain_editor_installed? &&
|
282
|
+
rsync_installed? &&
|
283
|
+
cycript_installed?
|
363
284
|
end
|
364
285
|
|
365
|
-
|
366
286
|
def cycript_installed?
|
367
287
|
is_installed? :cycript
|
368
288
|
end
|
@@ -380,10 +300,9 @@ module Idb
|
|
380
300
|
end
|
381
301
|
|
382
302
|
def dumpdecrypted_installed?
|
383
|
-
is_installed?
|
303
|
+
is_installed?(:dumpdecrypted_armv6) && is_installed?(:dumpdecrypted_armv7)
|
384
304
|
end
|
385
305
|
|
386
|
-
|
387
306
|
def rsync_installed?
|
388
307
|
is_installed? :rsync
|
389
308
|
end
|
@@ -405,15 +324,13 @@ module Idb
|
|
405
324
|
end
|
406
325
|
|
407
326
|
def pcviewer_path
|
408
|
-
path_for
|
327
|
+
path_for :pcviewer
|
409
328
|
end
|
410
329
|
|
411
|
-
|
412
330
|
def pbwatcher_path
|
413
331
|
path_for :pbwatcher
|
414
332
|
end
|
415
333
|
|
416
|
-
|
417
334
|
def dumpdecrypted_path
|
418
335
|
path_for :dumpdecrypted_armv7
|
419
336
|
end
|
@@ -426,17 +343,14 @@ module Idb
|
|
426
343
|
path_for :rsync
|
427
344
|
end
|
428
345
|
|
429
|
-
|
430
346
|
def open_path
|
431
347
|
path_for :open
|
432
348
|
end
|
433
349
|
|
434
|
-
|
435
350
|
def openurl_path
|
436
351
|
path_for :openurl
|
437
352
|
end
|
438
353
|
|
439
|
-
|
440
354
|
def apt_get_path
|
441
355
|
path_for :aptget
|
442
356
|
end
|
@@ -444,6 +358,5 @@ module Idb
|
|
444
358
|
def cycript_path
|
445
359
|
path_for :cycript
|
446
360
|
end
|
447
|
-
|
448
361
|
end
|
449
362
|
end
|