idb 2.9.0 → 2.9.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.
- 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
|