idb 1.3.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.DS_Store +0 -0
- data/.gitignore +19 -0
- data/Gemfile +4 -0
- data/Gemfile.lock +65 -0
- data/LICENSE.txt +22 -0
- data/README.md +29 -0
- data/Rakefile +2 -0
- data/bin/idb +5 -0
- data/idb.gemspec +41 -0
- data/lib/LICENSE +20 -0
- data/lib/README.md +54 -0
- data/lib/config/.dummy +0 -0
- data/lib/config/settings.yml +8 -0
- data/lib/gui/app_binary_tab_widget.rb +45 -0
- data/lib/gui/app_details_group_box.rb +213 -0
- data/lib/gui/app_list_dialog.rb +67 -0
- data/lib/gui/app_list_widget_item.rb +9 -0
- data/lib/gui/binary_strings_widget.rb +33 -0
- data/lib/gui/browse_filesystem_widget.rb +4 -0
- data/lib/gui/ca_manager_dialog.rb +137 -0
- data/lib/gui/cache_db_widget.rb +61 -0
- data/lib/gui/certificate_item.rb +5 -0
- data/lib/gui/console_widget.rb +163 -0
- data/lib/gui/cycript_console_widget.rb +68 -0
- data/lib/gui/cycript_thread.rb +81 -0
- data/lib/gui/device_info_group_box.rb +55 -0
- data/lib/gui/device_status_dialog.rb +351 -0
- data/lib/gui/file_system_events_widget.rb +4 -0
- data/lib/gui/fs_viewer_tab_widget.rb +245 -0
- data/lib/gui/i_device_syslog_thread.rb +47 -0
- data/lib/gui/images/check.png +0 -0
- data/lib/gui/images/folder.ico +0 -0
- data/lib/gui/images/iphone.ico +0 -0
- data/lib/gui/images/screenshot.png +0 -0
- data/lib/gui/key_chain_widget.rb +86 -0
- data/lib/gui/local_storage_tab_widget.rb +37 -0
- data/lib/gui/log_plain_text_edit.rb +18 -0
- data/lib/gui/log_widget.rb +71 -0
- data/lib/gui/main_tab_widget.rb +179 -0
- data/lib/gui/pasteboard_monitor_widget.rb +116 -0
- data/lib/gui/path_list_widget_item.rb +5 -0
- data/lib/gui/pb_watcher_thread.rb +63 -0
- data/lib/gui/plist_file_widget.rb +66 -0
- data/lib/gui/qt_ruby_variant.rb +16 -0
- data/lib/gui/screenshot_wizard.rb +169 -0
- data/lib/gui/settings_dialog.rb +69 -0
- data/lib/gui/settings_tab_widget.rb +149 -0
- data/lib/gui/shared_libraries_widget.rb +47 -0
- data/lib/gui/snoop_it_fs_events_widget.rb +150 -0
- data/lib/gui/snoop_it_keychain_widget.rb +172 -0
- data/lib/gui/snoop_it_sensitive_api_widget.rb +128 -0
- data/lib/gui/snoop_it_tab_widget.rb +27 -0
- data/lib/gui/snoop_it_update_thread.rb +48 -0
- data/lib/gui/sqlite_widget.rb +73 -0
- data/lib/gui/ssh_port_forward_tab_widget.rb +209 -0
- data/lib/gui/tool_widget.rb +94 -0
- data/lib/gui/url_handler_widget.rb +26 -0
- data/lib/gui/url_scheme_fuzz_widget.rb +103 -0
- data/lib/gui/url_scheme_widget.rb +60 -0
- data/lib/gui/weak_class_dump_widget.rb +89 -0
- data/lib/helper/ssh_port_forwarder.rb +72 -0
- data/lib/idb.rb +295 -0
- data/lib/idb/version.rb +3 -0
- data/lib/lib/CgBI.rb +153 -0
- data/lib/lib/abstract_device.rb +31 -0
- data/lib/lib/app.rb +286 -0
- data/lib/lib/app_binary.rb +57 -0
- data/lib/lib/ca_interface.rb +151 -0
- data/lib/lib/configuration.rb +0 -0
- data/lib/lib/console_launcher.rb +24 -0
- data/lib/lib/device.rb +438 -0
- data/lib/lib/device_ca_interface.rb +36 -0
- data/lib/lib/host_file_wrapper.rb +27 -0
- data/lib/lib/i_device_diagnostics_wrapper.rb +90 -0
- data/lib/lib/keychain_plist_parser.rb +15 -0
- data/lib/lib/local_operations.rb +67 -0
- data/lib/lib/otool_wrapper.rb +116 -0
- data/lib/lib/plist_util.rb +72 -0
- data/lib/lib/qt_thread_fix.rb +29 -0
- data/lib/lib/rsync_git_manager.rb +81 -0
- data/lib/lib/screen_shot_util.rb +59 -0
- data/lib/lib/settings.rb +67 -0
- data/lib/lib/simulator.rb +60 -0
- data/lib/lib/simulator_ca_interface.rb +16 -0
- data/lib/lib/snoop_it_wrapper.rb +80 -0
- data/lib/lib/ssh_operations.rb +136 -0
- data/lib/lib/ssh_port_forwarder.rb +43 -0
- data/lib/lib/tools.rb +11 -0
- data/lib/lib/url_scheme_fuzzer.rb +98 -0
- data/lib/lib/usb_muxd_wrapper.rb +32 -0
- data/lib/lib/weak_class_dump_wrapper.rb +62 -0
- data/lib/utils/dumpdecrypted/README +4 -0
- data/lib/utils/dumpdecrypted/dumpdecrypted_armv6.dylib +0 -0
- data/lib/utils/dumpdecrypted/dumpdecrypted_armv7.dylib +0 -0
- data/lib/utils/ios-ssl-kill-switch/com.isecpartners.nabla.sslkillswitch_v0.5-iOS_6.1.deb +0 -0
- data/lib/utils/keychain_dump/README +2 -0
- data/lib/utils/keychain_dump/keychain_dump +0 -0
- data/lib/utils/pbwatcher/pbwatcher +0 -0
- data/lib/utils/pcviewer/protectionclassviewer +0 -0
- data/lib/utils/weak_class_dump/README +5 -0
- data/lib/utils/weak_class_dump/weak_classdump.cy +726 -0
- metadata +412 -0
@@ -0,0 +1,68 @@
|
|
1
|
+
require_relative 'console_widget'
|
2
|
+
require_relative 'cycript_thread'
|
3
|
+
require 'open3'
|
4
|
+
|
5
|
+
module Idb
|
6
|
+
class CycriptConsoleWidget < Qt::Widget
|
7
|
+
|
8
|
+
def initialize *args
|
9
|
+
super *args
|
10
|
+
@to_send = nil
|
11
|
+
@console = ConsoleWidget.new
|
12
|
+
@console.connect(SIGNAL('command(QString)')) {|cmd|
|
13
|
+
puts cmd.inspect
|
14
|
+
@cycript_thread.send_data cmd + "\n"
|
15
|
+
# @cycript_thread.send_data "testtest\n"
|
16
|
+
}
|
17
|
+
|
18
|
+
@start = Qt::PushButton.new "Start"
|
19
|
+
@start.connect(SIGNAL :released) {
|
20
|
+
# @start.setEnabled(false)
|
21
|
+
# @stop.setEnabled(true)
|
22
|
+
start
|
23
|
+
|
24
|
+
#@console.result data
|
25
|
+
|
26
|
+
}
|
27
|
+
|
28
|
+
@stop = Qt::PushButton.new "Stop"
|
29
|
+
@stop.connect(SIGNAL :released) {
|
30
|
+
Thread.list.each {|t| p t}
|
31
|
+
@cycript_thread.send_data "testtest\n"
|
32
|
+
Thread.pass
|
33
|
+
|
34
|
+
}
|
35
|
+
|
36
|
+
layout = Qt::VBoxLayout.new do |v|
|
37
|
+
v.add_widget(@console)
|
38
|
+
v.add_widget(@start)
|
39
|
+
v.add_widget(@stop)
|
40
|
+
end
|
41
|
+
setLayout(layout)
|
42
|
+
|
43
|
+
|
44
|
+
end
|
45
|
+
def pure_string s
|
46
|
+
x = loop{ s[/\033\[\d+m/] = "" }
|
47
|
+
rescue IndexError
|
48
|
+
return s
|
49
|
+
x
|
50
|
+
end
|
51
|
+
|
52
|
+
def start
|
53
|
+
@cycript_thread = CycriptThread.new
|
54
|
+
@cycript_thread.connect(SIGNAL('new_entry(QString)')) {|line|
|
55
|
+
@console.result line
|
56
|
+
}
|
57
|
+
@cycript_thread.launch_process
|
58
|
+
end
|
59
|
+
|
60
|
+
def stop
|
61
|
+
@cycript_thread.stop
|
62
|
+
end
|
63
|
+
|
64
|
+
|
65
|
+
|
66
|
+
|
67
|
+
end
|
68
|
+
end
|
@@ -0,0 +1,81 @@
|
|
1
|
+
require 'net/ssh'
|
2
|
+
|
3
|
+
module Idb
|
4
|
+
class CycriptThread < Qt::Object
|
5
|
+
signals "new_entry(QString)"
|
6
|
+
|
7
|
+
attr_accessor :channel
|
8
|
+
|
9
|
+
def initialize *args
|
10
|
+
super *args
|
11
|
+
$terminate_cycript_thread = false
|
12
|
+
@queue = Queue.new
|
13
|
+
|
14
|
+
|
15
|
+
|
16
|
+
end
|
17
|
+
|
18
|
+
def send_data data
|
19
|
+
puts "sending data"
|
20
|
+
# @queue << data
|
21
|
+
@channel.send_data data
|
22
|
+
# @channel.send_data "testtest\n"
|
23
|
+
end
|
24
|
+
|
25
|
+
|
26
|
+
def stop
|
27
|
+
$terminate_cycript_thread = true
|
28
|
+
end
|
29
|
+
|
30
|
+
def launch_process
|
31
|
+
|
32
|
+
@channel = $device.ssh.open_channel do |ch|
|
33
|
+
channel.request_pty do |ch, success|
|
34
|
+
raise "Error requesting pty" unless success
|
35
|
+
ch.exec("export TERM=vt220; stty -echo -icanon; cycript -p SpringBoard") do |ch, success|
|
36
|
+
raise "Error opening shell" unless success
|
37
|
+
|
38
|
+
ch.on_extended_data do |ch, type, data|
|
39
|
+
STDOUT.print "Error: #{data}\n"
|
40
|
+
end
|
41
|
+
|
42
|
+
ch.on_data do |ch, data|
|
43
|
+
puts "emitting"
|
44
|
+
emit new_entry(data)
|
45
|
+
puts "done"
|
46
|
+
end
|
47
|
+
|
48
|
+
ch.on_close { |ch|
|
49
|
+
$log.info "cycript terminated"
|
50
|
+
}
|
51
|
+
|
52
|
+
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
|
58
|
+
puts "thred"
|
59
|
+
@abc = Thread.new do
|
60
|
+
loop do
|
61
|
+
#TODO mutex to protect device?
|
62
|
+
#even better: make one central thread that calls process.
|
63
|
+
# and all functions using it call it to ensure its running. or auto start it.
|
64
|
+
sleep 0.5
|
65
|
+
puts "loop"
|
66
|
+
$device.ssh.loop 0.1
|
67
|
+
puts "done"
|
68
|
+
if $terminate_cycript_thread
|
69
|
+
$log.info "Terminating cycript"
|
70
|
+
channel.close
|
71
|
+
break
|
72
|
+
end
|
73
|
+
end
|
74
|
+
$log.info "Terminating thread"
|
75
|
+
end
|
76
|
+
|
77
|
+
|
78
|
+
end
|
79
|
+
|
80
|
+
end
|
81
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
require_relative 'device_status_dialog'
|
2
|
+
|
3
|
+
module Idb
|
4
|
+
class DeviceInfoGroupBox < Qt::GroupBox
|
5
|
+
signals "disconnect()"
|
6
|
+
|
7
|
+
def initialize *args
|
8
|
+
super *args
|
9
|
+
|
10
|
+
# details on selected app
|
11
|
+
@layout = Qt::GridLayout.new
|
12
|
+
setLayout(@layout)
|
13
|
+
setTitle "Selected Device"
|
14
|
+
|
15
|
+
@device = Qt::Label.new "<b><font color='red'>Please select a device from the 'Devices' menu.</font></b>", self, 0
|
16
|
+
@layout.addWidget @device, 0, 0, 2, 1
|
17
|
+
end
|
18
|
+
|
19
|
+
def update_device
|
20
|
+
if $device.device?
|
21
|
+
uname = $device.ops.execute("/bin/uname -a")
|
22
|
+
ssh_connection_info = ""
|
23
|
+
if $device.mode == "usb"
|
24
|
+
ssh_connection_info = " "
|
25
|
+
@device.setText "<b>USB device:</b> <b><font color='red'>Manually connect via SSH as #{$settings.ssh_username}@localhost:#{$device.usb_ssh_port}</font></b><br>#{uname}"
|
26
|
+
else
|
27
|
+
@device.setText "<b>USB device:</b> ssh://#{$settings.ssh_username}:[redacted]@#{$settings.ssh_host}:#{$settings.ssh_port}<br>#{uname}"
|
28
|
+
end
|
29
|
+
|
30
|
+
@status = Qt::PushButton.new "Status"
|
31
|
+
@status.connect(SIGNAL(:released)) {
|
32
|
+
@device_status = DeviceStatusDialog.new
|
33
|
+
@device_status.exec
|
34
|
+
}
|
35
|
+
@layout.addWidget @status, 0, 1
|
36
|
+
|
37
|
+
@disconnect = Qt::PushButton.new "Disconnect"
|
38
|
+
@disconnect.connect(SIGNAL(:released)) {
|
39
|
+
$device.close unless $device.nil?
|
40
|
+
$device = nil
|
41
|
+
emit disconnect()
|
42
|
+
@disconnect.setEnabled(false)
|
43
|
+
@status.setEnabled(false)
|
44
|
+
@device.setText("<b><font color='red'>Please select a device from the 'Devices' menu.</font></b>")
|
45
|
+
}
|
46
|
+
@layout.addWidget @disconnect, 1, 1
|
47
|
+
|
48
|
+
else
|
49
|
+
@device.setText "<b>Simulator:</b> #{$device.sim_dir}"
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
|
54
|
+
end
|
55
|
+
end
|
@@ -0,0 +1,351 @@
|
|
1
|
+
module Idb
|
2
|
+
class DeviceStatusDialog < Qt::Dialog
|
3
|
+
|
4
|
+
|
5
|
+
def installed_check_mark
|
6
|
+
installed_check_mark = Qt::Label.new
|
7
|
+
pixmap = Qt::Pixmap.new File.join(File.dirname(File.expand_path(__FILE__)), '/images/check.png')
|
8
|
+
installed_check_mark.setPixmap pixmap
|
9
|
+
installed_check_mark
|
10
|
+
end
|
11
|
+
|
12
|
+
def mark_rsync_installed
|
13
|
+
@rsync_label.text = @rsync_label.text + "<br>found: #{$device.rsync_path}"
|
14
|
+
@layout.addWidget installed_check_mark, 7, 1
|
15
|
+
setFixedHeight(sizeHint().height());
|
16
|
+
end
|
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
|
+
def mark_keychain_dump_installed
|
25
|
+
@keychain_dump_label.text = @keychain_dump_label.text + "<br>found: #{$device.keychain_dump_path}"
|
26
|
+
@layout.addWidget installed_check_mark, 6, 1
|
27
|
+
setFixedHeight(sizeHint().height());
|
28
|
+
end
|
29
|
+
|
30
|
+
def mark_pcviewer_installed
|
31
|
+
@pcviewer_label.text = @pcviewer_label.text + "<br>found: #{$device.pcviewer_path}"
|
32
|
+
@layout.addWidget installed_check_mark, 5, 1
|
33
|
+
setFixedHeight(sizeHint().height());
|
34
|
+
end
|
35
|
+
|
36
|
+
def mark_pbwatcher_installed
|
37
|
+
@pbwatcher_label.text = @pbwatcher_label.text + "<br>found: #{$device.pbwatcher_path}"
|
38
|
+
@layout.addWidget installed_check_mark, 4, 1
|
39
|
+
setFixedHeight(sizeHint().height());
|
40
|
+
end
|
41
|
+
|
42
|
+
def mark_dumpdecrypted_installed
|
43
|
+
@dumpdecrypted_label.text = @dumpdecrypted_label.text + "<br>Found: #{$device.dumpdecrypted_path}"
|
44
|
+
@layout.addWidget installed_check_mark, 3, 1
|
45
|
+
setFixedHeight(sizeHint().height());
|
46
|
+
end
|
47
|
+
|
48
|
+
|
49
|
+
def mark_apt_get_installed
|
50
|
+
@aptget_label.text = @aptget_label.text + "<br>Found: #{$device.apt_get_path}"
|
51
|
+
@layout.addWidget installed_check_mark, 0, 1
|
52
|
+
setFixedHeight(sizeHint().height());
|
53
|
+
end
|
54
|
+
|
55
|
+
def mark_open_installed
|
56
|
+
@open_label.text = @open_label.text + "<br>Found: #{$device.open_path}"
|
57
|
+
@layout.addWidget installed_check_mark, 1, 1
|
58
|
+
setFixedHeight(sizeHint().height());
|
59
|
+
end
|
60
|
+
|
61
|
+
def mark_openurl_installed
|
62
|
+
@openurl_label.text = @openurl_label.text + "<br>Found: #{$device.openurl_path}"
|
63
|
+
@layout.addWidget installed_check_mark, 2, 1
|
64
|
+
setFixedHeight(sizeHint().height());
|
65
|
+
end
|
66
|
+
|
67
|
+
def mark_cycript_installed
|
68
|
+
@cycript_label.text = @cycript_label.text + "<br>Found: #{$device.cycript_path}"
|
69
|
+
@layout.addWidget installed_check_mark, 8, 1
|
70
|
+
setFixedHeight(sizeHint().height());
|
71
|
+
end
|
72
|
+
|
73
|
+
|
74
|
+
def initialize *args
|
75
|
+
super *args
|
76
|
+
@layout = Qt::GridLayout.new
|
77
|
+
setLayout(@layout)
|
78
|
+
setWindowTitle "Device Status"
|
79
|
+
|
80
|
+
@close_button = Qt::PushButton.new "Close"
|
81
|
+
@close_button.connect(SIGNAL(:released)) {|x|
|
82
|
+
reject()
|
83
|
+
}
|
84
|
+
#TODO: prevent closing
|
85
|
+
@layout.addWidget @close_button, 9, 2
|
86
|
+
|
87
|
+
|
88
|
+
#######################
|
89
|
+
### APT-GET
|
90
|
+
#######################
|
91
|
+
|
92
|
+
|
93
|
+
@aptget_label = Qt::Label.new "<b>apt-get / aptitude</b><br>(Install additional software packages)"
|
94
|
+
@layout.addWidget @aptget_label, 0, 0
|
95
|
+
|
96
|
+
|
97
|
+
if $device.apt_get_installed?
|
98
|
+
mark_apt_get_installed
|
99
|
+
else
|
100
|
+
@install_aptget = Qt::PushButton.new "Install"
|
101
|
+
@install_aptget.connect(SIGNAL(:released)) {
|
102
|
+
$device.install_apt_get
|
103
|
+
if $device.apt_get_installed?
|
104
|
+
@install_aptget.hide
|
105
|
+
mark_apt_get_installed
|
106
|
+
end
|
107
|
+
}
|
108
|
+
@layout.addWidget @install_aptget, 0, 1
|
109
|
+
end
|
110
|
+
#######################
|
111
|
+
### OPEN
|
112
|
+
#######################
|
113
|
+
|
114
|
+
@open_label = Qt::Label.new "<b>open</b><br>(Open apps on the device)"
|
115
|
+
@layout.addWidget @open_label, 1, 0
|
116
|
+
|
117
|
+
if $device.open_installed?
|
118
|
+
mark_open_installed
|
119
|
+
else
|
120
|
+
@install_open = Qt::PushButton.new "Install"
|
121
|
+
@install_open.connect(SIGNAL(:released)) {
|
122
|
+
$device.install_open
|
123
|
+
if $device.open_installed?
|
124
|
+
@install_open.hide
|
125
|
+
mark_open_installed
|
126
|
+
else
|
127
|
+
error = Qt::MessageBox.new
|
128
|
+
error.setInformativeText("open could not be installed. Please make sure Cydia has finished all tasks and is closed on the device.")
|
129
|
+
error.setIcon(Qt::MessageBox::Critical)
|
130
|
+
error.exec
|
131
|
+
end
|
132
|
+
}
|
133
|
+
@layout.addWidget @install_open, 1, 1
|
134
|
+
end
|
135
|
+
|
136
|
+
#######################
|
137
|
+
### OPEN URL
|
138
|
+
#######################
|
139
|
+
|
140
|
+
|
141
|
+
@openurl_label = Qt::Label.new "<b>openURL</b><br>(Open URL on the device)"
|
142
|
+
@layout.addWidget @openurl_label, 2, 0
|
143
|
+
|
144
|
+
|
145
|
+
if $device.openurl_installed?
|
146
|
+
mark_openurl_installed
|
147
|
+
else
|
148
|
+
# @install_openurl = Qt::PushButton.new "Install"
|
149
|
+
# @install_openurl.connect(SIGNAL(:released)) {
|
150
|
+
# $device.install_openurl
|
151
|
+
# if $device.open_installed?
|
152
|
+
# @install_open.hide
|
153
|
+
# mark_open_installed
|
154
|
+
# end
|
155
|
+
# }
|
156
|
+
# @layout.addWidget @install_openurl, 2, 1
|
157
|
+
end
|
158
|
+
|
159
|
+
|
160
|
+
#######################
|
161
|
+
### DUMPDECRYPTED
|
162
|
+
#######################
|
163
|
+
|
164
|
+
@dumpdecrypted_label = Qt::Label.new "<b>dumpdecrypted</b><br>(Decrypt app binaries on the device).<br>Developed and maintained by Stefan Esser https://github.com/stefanesser/dumpdecrypted"
|
165
|
+
@layout.addWidget @dumpdecrypted_label, 3, 0
|
166
|
+
|
167
|
+
if $device.dumpdecrypted_installed?
|
168
|
+
mark_dumpdecrypted_installed
|
169
|
+
else
|
170
|
+
@install_dumpdecrypted = Qt::PushButton.new "Install"
|
171
|
+
@install_dumpdecrypted.connect(SIGNAL(:released)) {
|
172
|
+
$device.install_dumpdecrypted
|
173
|
+
if $device.dumpdecrypted_installed?
|
174
|
+
@install_dumpdecrypted.hide
|
175
|
+
mark_dumpdecrypted_installed
|
176
|
+
else
|
177
|
+
error = Qt::MessageBox.new
|
178
|
+
error.setInformativeText("No compiled version of dumpdecrypted was found in utils/dumpdecrypted. It cannot be shipped with idb due to licensing issues. Compilation failed likely due to XCode 5 not shipping the right version of gcc anymore. Try manually copying dumpdecrypted.dylib into /var/root on the device.")
|
179
|
+
error.setIcon(Qt::MessageBox::Critical)
|
180
|
+
error.exec
|
181
|
+
end
|
182
|
+
|
183
|
+
}
|
184
|
+
@layout.addWidget @install_dumpdecrypted, 3, 1
|
185
|
+
end
|
186
|
+
|
187
|
+
|
188
|
+
#######################
|
189
|
+
### PBWATCHER
|
190
|
+
#######################
|
191
|
+
|
192
|
+
|
193
|
+
@pbwatcher_label = Qt::Label.new "<b>pbwatcher</b><br>(idb pasteboard monitor helper)"
|
194
|
+
@layout.addWidget @pbwatcher_label, 4, 0
|
195
|
+
|
196
|
+
if $device.pbwatcher_installed?
|
197
|
+
mark_pbwatcher_installed
|
198
|
+
else
|
199
|
+
@install_pbwatcher = Qt::PushButton.new "Install"
|
200
|
+
@install_pbwatcher.connect(SIGNAL(:released)) {
|
201
|
+
$device.install_pbwatcher
|
202
|
+
if $device.pbwatcher_installed?
|
203
|
+
@install_pbwatcher.hide
|
204
|
+
mark_pbwatcher_installed
|
205
|
+
end
|
206
|
+
}
|
207
|
+
|
208
|
+
|
209
|
+
@layout.addWidget @install_pbwatcher, 4, 1
|
210
|
+
end
|
211
|
+
|
212
|
+
|
213
|
+
#######################
|
214
|
+
### PCVIEWER
|
215
|
+
#######################
|
216
|
+
|
217
|
+
|
218
|
+
@pcviewer_label = Qt::Label.new "<b>pcviewer</b><br>(idb file protection class helper)"
|
219
|
+
@layout.addWidget @pcviewer_label, 5, 0
|
220
|
+
|
221
|
+
if $device.pcviewer_installed?
|
222
|
+
mark_pcviewer_installed
|
223
|
+
else
|
224
|
+
@install_pcviewer = Qt::PushButton.new "Install"
|
225
|
+
@install_pcviewer.connect(SIGNAL(:released)) {
|
226
|
+
$device.install_pcviewer
|
227
|
+
if $device.pcviewer_installed?
|
228
|
+
@install_pcviewer.hide
|
229
|
+
mark_pcviewer_installed
|
230
|
+
end
|
231
|
+
}
|
232
|
+
|
233
|
+
|
234
|
+
@layout.addWidget @install_pcviewer, 5, 1
|
235
|
+
end
|
236
|
+
|
237
|
+
#######################
|
238
|
+
### KEYCHAIN_DUMPER
|
239
|
+
#######################
|
240
|
+
|
241
|
+
|
242
|
+
@keychain_dump_label = Qt::Label.new "<b>keychain_dump</b><br>(dumps the keychain into a plist file.<br>https://code.google.com/p/iphone-dataprotection/)"
|
243
|
+
@layout.addWidget @keychain_dump_label, 6, 0
|
244
|
+
|
245
|
+
if $device.keychain_dump_installed?
|
246
|
+
mark_keychain_dump_installed
|
247
|
+
else
|
248
|
+
@install_keychain_dump = Qt::PushButton.new "Install"
|
249
|
+
@install_keychain_dump.connect(SIGNAL(:released)) {
|
250
|
+
$device.install_keychain_dump
|
251
|
+
if $device.keychain_dump_installed?
|
252
|
+
@install_keychain_dump.hide
|
253
|
+
mark_keychain_dump_installed
|
254
|
+
end
|
255
|
+
}
|
256
|
+
|
257
|
+
|
258
|
+
@layout.addWidget @install_keychain_dump, 6, 1
|
259
|
+
|
260
|
+
end
|
261
|
+
|
262
|
+
|
263
|
+
#######################
|
264
|
+
### rsync
|
265
|
+
#######################
|
266
|
+
|
267
|
+
|
268
|
+
@rsync_label = Qt::Label.new "<b>rsync</b><br>(folder synchronization)"
|
269
|
+
@layout.addWidget @rsync_label, 7, 0
|
270
|
+
|
271
|
+
if $device.rsync_installed?
|
272
|
+
mark_rsync_installed
|
273
|
+
else
|
274
|
+
@install_rsync = Qt::PushButton.new "Install"
|
275
|
+
@install_rsync.connect(SIGNAL(:released)) {
|
276
|
+
$device.install_rsync
|
277
|
+
if $device.rsync_installed?
|
278
|
+
@install_rsync.hide
|
279
|
+
mark_rsync_installed
|
280
|
+
else
|
281
|
+
error = Qt::MessageBox.new
|
282
|
+
error.setInformativeText("rsync could not be installed. Please make sure Cydia has finished all tasks and is closed on the device.")
|
283
|
+
error.setIcon(Qt::MessageBox::Critical)
|
284
|
+
error.exec
|
285
|
+
end
|
286
|
+
}
|
287
|
+
|
288
|
+
|
289
|
+
@layout.addWidget @install_rsync, 7, 1
|
290
|
+
|
291
|
+
end
|
292
|
+
|
293
|
+
|
294
|
+
#######################
|
295
|
+
### CYCRIPT
|
296
|
+
#######################
|
297
|
+
|
298
|
+
@cycript_label = Qt::Label.new "<b>cycript</b><br>(explore and modify running applications using a hybrid of Objective-C++ and JavaScript. http://www.cycript.org/ )"
|
299
|
+
@layout.addWidget @cycript_label, 8, 0
|
300
|
+
|
301
|
+
if $device.cycript_installed?
|
302
|
+
mark_cycript_installed
|
303
|
+
else
|
304
|
+
@install_cycript = Qt::PushButton.new "Install"
|
305
|
+
@install_cycript.connect(SIGNAL(:released)) {
|
306
|
+
$device.install_cycript
|
307
|
+
if $device.cycript_installed?
|
308
|
+
@install_cycript.hide
|
309
|
+
mark_cycript_installed
|
310
|
+
else
|
311
|
+
error = Qt::MessageBox.new
|
312
|
+
error.setInformativeText("cycript could not be installed. Please make sure Cydia has finished all tasks and is closed on the device.")
|
313
|
+
error.setIcon(Qt::MessageBox::Critical)
|
314
|
+
error.exec
|
315
|
+
end
|
316
|
+
}
|
317
|
+
@layout.addWidget @install_cycript, 8, 1
|
318
|
+
end
|
319
|
+
|
320
|
+
#######################
|
321
|
+
### clutch
|
322
|
+
#######################
|
323
|
+
|
324
|
+
|
325
|
+
# @clutch_label = Qt::Label.new "<b>Clutch (not used by idb)</b><br>(App cracking tool that also performs decryption. Installation from cydia.iphonecake.com.)"
|
326
|
+
# @layout.addWidget @clutch_label, 8, 0
|
327
|
+
#
|
328
|
+
# if $device.clutch_installed?
|
329
|
+
# mark_clutch_installed
|
330
|
+
# else
|
331
|
+
# @install_clutch = Qt::PushButton.new "Install"
|
332
|
+
# @install_clutch.connect(SIGNAL(:released)) {
|
333
|
+
# $device.setup_clutch_source
|
334
|
+
# $device.install_clutch
|
335
|
+
# if $device.clutch_installed?
|
336
|
+
# @install_clutch.hide
|
337
|
+
# mark_clutch_installed
|
338
|
+
# end
|
339
|
+
# }
|
340
|
+
#
|
341
|
+
#
|
342
|
+
# @layout.addWidget @install_clutch, 8, 1
|
343
|
+
#
|
344
|
+
# end
|
345
|
+
|
346
|
+
setFixedHeight(sizeHint().height());
|
347
|
+
end
|
348
|
+
|
349
|
+
|
350
|
+
end
|
351
|
+
end
|