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,169 @@
|
|
1
|
+
require_relative '../lib/screen_shot_util'
|
2
|
+
require 'Qt'
|
3
|
+
|
4
|
+
module Idb
|
5
|
+
module ScreenShotWizard
|
6
|
+
Pages = Hash.new
|
7
|
+
wizard = nil
|
8
|
+
|
9
|
+
|
10
|
+
class ScreenShotWizard < Qt::Wizard
|
11
|
+
attr_accessor :app, :screenshot, :result
|
12
|
+
|
13
|
+
|
14
|
+
def self.new_with_app app
|
15
|
+
wiz = self.new
|
16
|
+
wiz.app = app
|
17
|
+
wiz.screenshot = ScreenShotUtil.new app.app_dir, $device.ops, false
|
18
|
+
wiz
|
19
|
+
end
|
20
|
+
|
21
|
+
def initialize
|
22
|
+
super
|
23
|
+
|
24
|
+
Pages[:intro] = add_page(IntroPage.new)
|
25
|
+
Pages[:open_app] = add_page(OpenAppPage.new self)
|
26
|
+
Pages[:background_app] = add_page(BackgroundAppPage.new self)
|
27
|
+
Pages[:screen_shot_found] = add_page(ScreenShotFoundPage.new self)
|
28
|
+
Pages[:no_screen_shot] = add_page(NoScreenShotPage.new self)
|
29
|
+
set_window_title("Screenshot Wizard")
|
30
|
+
wizard = self
|
31
|
+
show
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
|
36
|
+
class IntroPage < Qt::WizardPage
|
37
|
+
def initialize
|
38
|
+
super
|
39
|
+
|
40
|
+
setTitle("Introduction")
|
41
|
+
label = Qt::Label.new("This wizard will guide you through the testing for the iOS backgrounding screenshot vulnerability.")
|
42
|
+
label.word_wrap = true
|
43
|
+
layout = Qt::VBoxLayout.new do |v|
|
44
|
+
v.add_widget(label)
|
45
|
+
end
|
46
|
+
setLayout(layout)
|
47
|
+
end
|
48
|
+
|
49
|
+
def validatePage
|
50
|
+
puts "[*] Marking screenshot time"
|
51
|
+
#wiz = parentWidget.parentWidget.parentWidget
|
52
|
+
wizard.screenshot.mark
|
53
|
+
return true
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
class OpenAppPage < Qt::WizardPage
|
58
|
+
|
59
|
+
def initialize *args
|
60
|
+
super *args
|
61
|
+
|
62
|
+
setTitle("Launch Application")
|
63
|
+
label = Qt::Label.new("Launch the application and navigate to a view that contains potentially sensitive data. Or click below to launch the app automatically.")
|
64
|
+
label.word_wrap = true
|
65
|
+
|
66
|
+
launch_button = Qt::PushButton.new "Launch app"
|
67
|
+
launch_button.connect(SIGNAL :released) { |x|
|
68
|
+
wizard.app.launch
|
69
|
+
}
|
70
|
+
|
71
|
+
layout = Qt::VBoxLayout.new do |v|
|
72
|
+
v.add_widget(label)
|
73
|
+
v.add_widget(launch_button)
|
74
|
+
end
|
75
|
+
setLayout(layout)
|
76
|
+
|
77
|
+
end
|
78
|
+
|
79
|
+
|
80
|
+
end
|
81
|
+
|
82
|
+
|
83
|
+
class BackgroundAppPage < Qt::WizardPage
|
84
|
+
|
85
|
+
def initialize *args
|
86
|
+
super *args
|
87
|
+
setTitle("Background App")
|
88
|
+
|
89
|
+
label = Qt::Label.new("Now Background the app by hitting the home button (XX in the simulator). Then click continue.")
|
90
|
+
label.word_wrap = true
|
91
|
+
layout = Qt::VBoxLayout.new do |v|
|
92
|
+
v.add_widget(label)
|
93
|
+
end
|
94
|
+
setLayout(layout)
|
95
|
+
end
|
96
|
+
|
97
|
+
def validatePage
|
98
|
+
puts "[*] Checking for screenshot"
|
99
|
+
#wiz = parentWidget.parentWidget.parentWidget
|
100
|
+
wizard.result = wizard.screenshot.check
|
101
|
+
puts wizard.result
|
102
|
+
true
|
103
|
+
end
|
104
|
+
|
105
|
+
def nextId
|
106
|
+
#wiz = parentWidget.parentWidget.parentWidget
|
107
|
+
puts "Determining next id"
|
108
|
+
if wizard.result.nil?
|
109
|
+
Pages[:no_screen_shot]
|
110
|
+
else
|
111
|
+
Pages[:screen_shot_found]
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
|
116
|
+
end
|
117
|
+
|
118
|
+
class NoScreenShotPage < Qt::WizardPage
|
119
|
+
def initialize *args
|
120
|
+
super *args
|
121
|
+
setFinalPage(true)
|
122
|
+
setTitle("No Screenshot Found")
|
123
|
+
label = Qt::Label.new("No new screenshot was detected for this application.")
|
124
|
+
label.word_wrap = true
|
125
|
+
layout = Qt::VBoxLayout.new do |v|
|
126
|
+
v.add_widget(label)
|
127
|
+
end
|
128
|
+
setLayout(layout)
|
129
|
+
end
|
130
|
+
|
131
|
+
def nextId
|
132
|
+
-1
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
136
|
+
class ScreenShotFoundPage < Qt::WizardPage
|
137
|
+
def initialize *args
|
138
|
+
super *args
|
139
|
+
setFinalPage(true)
|
140
|
+
end
|
141
|
+
|
142
|
+
def initializePage *args
|
143
|
+
super *args
|
144
|
+
|
145
|
+
#wiz = parentWidget.parentWidget.parentWidget
|
146
|
+
screenshot_file = wizard.app.cache_file wizard.result
|
147
|
+
|
148
|
+
setTitle("Screenshot Found (click to open)")
|
149
|
+
screen = Qt::Pixmap.new screenshot_file
|
150
|
+
button = Qt::PushButton.new
|
151
|
+
button.setFlat(true)
|
152
|
+
button.setIcon(Qt::Icon.new(screen))
|
153
|
+
button.setIconSize(parentWidget.size)
|
154
|
+
button.connect(SIGNAL :released) { |x|
|
155
|
+
$device.ops.open screenshot_file
|
156
|
+
}
|
157
|
+
layout = Qt::VBoxLayout.new do |v|
|
158
|
+
v.add_widget(button)
|
159
|
+
end
|
160
|
+
setLayout(layout)
|
161
|
+
end
|
162
|
+
end
|
163
|
+
|
164
|
+
|
165
|
+
def nextId
|
166
|
+
-1
|
167
|
+
end
|
168
|
+
end
|
169
|
+
end
|
@@ -0,0 +1,69 @@
|
|
1
|
+
require_relative 'settings_tab_widget'
|
2
|
+
|
3
|
+
|
4
|
+
module Idb
|
5
|
+
class SettingsDialog < Qt::Dialog
|
6
|
+
|
7
|
+
def initialize *args
|
8
|
+
super *args
|
9
|
+
|
10
|
+
@layout = Qt::GridLayout.new
|
11
|
+
setLayout(@layout)
|
12
|
+
setWindowTitle("Settings")
|
13
|
+
|
14
|
+
@tabs = SettingsTabWidget.new self
|
15
|
+
@layout.addWidget @tabs, 0,0,1,2
|
16
|
+
|
17
|
+
@save_button = Qt::PushButton.new "Save"
|
18
|
+
@save_button.setDefault true
|
19
|
+
|
20
|
+
@save_button.connect(SIGNAL(:released)) {|x|
|
21
|
+
$settings["ssh_host"] = @tabs.ssh_host.text
|
22
|
+
$settings["ssh_port"] = @tabs.ssh_port.text
|
23
|
+
$settings["ssh_username"] = @tabs.ssh_username.text
|
24
|
+
$settings["ssh_password"] = @tabs.ssh_password.text
|
25
|
+
|
26
|
+
if @tabs.usbmux_radio.isChecked
|
27
|
+
$settings["device_connection_mode"] = "usb"
|
28
|
+
else
|
29
|
+
$settings["device_connection_mode"] = "ssh"
|
30
|
+
end
|
31
|
+
|
32
|
+
$settings["manual_ssh_port"] = @tabs.manual_ssh_port.text
|
33
|
+
$settings["idb_utility_port"] = @tabs.idb_utility_port.text
|
34
|
+
$settings["sqlite_editor"] = @tabs.sqlite_editor.text
|
35
|
+
|
36
|
+
$settings.store
|
37
|
+
|
38
|
+
if not $device.nil? and forwarders_changed?
|
39
|
+
reply = Qt::MessageBox::question(self, "Reload Port Forwards", "Portforwarding has changed. Do you want to apply the new configuration?<br>(This may interrupt existing connections)", Qt::MessageBox::Yes, Qt::MessageBox::No);
|
40
|
+
if reply == Qt::MessageBox::Yes
|
41
|
+
$device.restart_port_forwarding
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
accept()
|
46
|
+
}
|
47
|
+
@cancel_button = Qt::PushButton.new "Cancel"
|
48
|
+
@cancel_button.connect(SIGNAL(:released)) {|x|
|
49
|
+
reject()
|
50
|
+
}
|
51
|
+
|
52
|
+
@layout.addWidget @save_button, 2, 1
|
53
|
+
@layout.addWidget @cancel_button, 2, 0
|
54
|
+
|
55
|
+
|
56
|
+
|
57
|
+
|
58
|
+
|
59
|
+
|
60
|
+
end
|
61
|
+
#
|
62
|
+
def forwarders_changed?
|
63
|
+
@tabs.forwarders_changed?
|
64
|
+
end
|
65
|
+
|
66
|
+
|
67
|
+
|
68
|
+
end
|
69
|
+
end
|
@@ -0,0 +1,149 @@
|
|
1
|
+
require_relative 'ssh_port_forward_tab_widget'
|
2
|
+
|
3
|
+
module Idb
|
4
|
+
class SettingsTabWidget < Qt::TabWidget
|
5
|
+
attr_accessor :ssh_host, :ssh_port, :ssh_username, :ssh_password, :usbmux_radio, :manual_ssh_port, :idb_utility_port
|
6
|
+
attr_accessor :sqlite_editor
|
7
|
+
|
8
|
+
def initialize *args
|
9
|
+
super *args
|
10
|
+
|
11
|
+
setup_device_config
|
12
|
+
addTab @device_config_tab, "Device Config"
|
13
|
+
setup_forwards
|
14
|
+
addTab @forward_config, "Port Forwarding"
|
15
|
+
setup_external_apps
|
16
|
+
addTab @external_apps_config, "External Editors"
|
17
|
+
|
18
|
+
end
|
19
|
+
|
20
|
+
def setup_device_config
|
21
|
+
@device_config_tab = Qt::Widget.new self
|
22
|
+
device_config_layout = Qt::GridLayout.new
|
23
|
+
@device_config_tab.setLayout device_config_layout
|
24
|
+
|
25
|
+
device_config_layout.addWidget @device_config, 0, 0, 1,2
|
26
|
+
|
27
|
+
|
28
|
+
@connection_widget = Qt::Widget.new self
|
29
|
+
@connection_widget_layout = Qt::GridLayout.new
|
30
|
+
@connection_widget.setLayout(@connection_widget_layout)
|
31
|
+
device_config_layout.addWidget @connection_widget, 0, 0, 1, 2
|
32
|
+
|
33
|
+
@ssh_direct_radio = Qt::RadioButton.new @connection_widget
|
34
|
+
@ssh_direct_radio.setText("SSH directly")
|
35
|
+
@ssh_direct_radio.connect(SIGNAL :released) {
|
36
|
+
@ssh_host.setEnabled(true)
|
37
|
+
|
38
|
+
}
|
39
|
+
|
40
|
+
@usbmux_radio = Qt::RadioButton.new @connection_widget
|
41
|
+
@usbmux_radio.setText("SSH via USB (usbmuxd)")
|
42
|
+
@usbmux_radio.connect(SIGNAL :released) {
|
43
|
+
@ssh_host.setEnabled(false)
|
44
|
+
}
|
45
|
+
|
46
|
+
@connection_widget_layout.addWidget @ssh_direct_radio, 0,0
|
47
|
+
@connection_widget_layout.addWidget @usbmux_radio, 0, 1
|
48
|
+
|
49
|
+
|
50
|
+
|
51
|
+
# ssh username
|
52
|
+
@label_ssh_username = Qt::Label.new "SSH Username:", self, 0
|
53
|
+
@ssh_username = Qt::LineEdit.new $settings.ssh_username
|
54
|
+
device_config_layout.addWidget @label_ssh_username, 1, 0
|
55
|
+
device_config_layout.addWidget @ssh_username, 1, 1
|
56
|
+
|
57
|
+
# ssh password
|
58
|
+
@label_ssh_password = Qt::Label.new "SSH Password:", self, 0
|
59
|
+
@ssh_password = Qt::LineEdit.new $settings.ssh_password
|
60
|
+
device_config_layout.addWidget @label_ssh_password, 2, 0
|
61
|
+
device_config_layout.addWidget @ssh_password, 2, 1
|
62
|
+
|
63
|
+
# ssh host
|
64
|
+
@label_ssh_host = Qt::Label.new "SSH Host:", self, 0
|
65
|
+
@ssh_host = Qt::LineEdit.new $settings.ssh_host
|
66
|
+
device_config_layout.addWidget @label_ssh_host, 3, 0
|
67
|
+
device_config_layout.addWidget @ssh_host, 3, 1
|
68
|
+
|
69
|
+
# ssh port
|
70
|
+
@label_ssh_port = Qt::Label.new "SSH Port:", self, 0
|
71
|
+
@ssh_port = Qt::LineEdit.new $settings.ssh_port.to_s
|
72
|
+
device_config_layout.addWidget @label_ssh_port, 4, 0
|
73
|
+
device_config_layout.addWidget @ssh_port, 4, 1
|
74
|
+
|
75
|
+
|
76
|
+
if $settings['device_connection_mode'] == "usb"
|
77
|
+
@usbmux_radio.setChecked(true)
|
78
|
+
@ssh_host.setEnabled(false)
|
79
|
+
end
|
80
|
+
|
81
|
+
|
82
|
+
if $settings['device_connection_mode'] == "ssh"
|
83
|
+
@ssh_direct_radio.setChecked(true)
|
84
|
+
end
|
85
|
+
|
86
|
+
end
|
87
|
+
|
88
|
+
def setup_forwards
|
89
|
+
|
90
|
+
@forward_config = Qt::Widget.new self
|
91
|
+
forward_config_layout = Qt::GridLayout.new
|
92
|
+
@forward_config.setLayout forward_config_layout
|
93
|
+
|
94
|
+
@forward_tabs = SSHPortForwardTabWidget.new self
|
95
|
+
forward_config_layout.addWidget @forward_tabs, 0, 0, 1, 2
|
96
|
+
|
97
|
+
# manual SSH port
|
98
|
+
@label_manual_ssh_port = Qt::Label.new "Port for Manual SSH:", self, 0
|
99
|
+
@manual_ssh_port = Qt::LineEdit.new $settings.manual_ssh_port.to_s
|
100
|
+
forward_config_layout.addWidget @label_manual_ssh_port, 2, 0
|
101
|
+
forward_config_layout.addWidget @manual_ssh_port, 2, 1
|
102
|
+
|
103
|
+
# idb utility forward port
|
104
|
+
@label_idb_utility_port = Qt::Label.new "Port for internal idb operations:", self, 0
|
105
|
+
@idb_utility_port = Qt::LineEdit.new $settings.idb_utility_port.to_s
|
106
|
+
forward_config_layout.addWidget @label_idb_utility_port, 3, 0
|
107
|
+
forward_config_layout.addWidget @idb_utility_port, 3, 1
|
108
|
+
|
109
|
+
end
|
110
|
+
|
111
|
+
def setup_external_apps
|
112
|
+
@external_apps_config = Qt::Widget.new self
|
113
|
+
external_apps_config_layout = Qt::GridLayout.new
|
114
|
+
@external_apps_config.setLayout external_apps_config_layout
|
115
|
+
|
116
|
+
|
117
|
+
|
118
|
+
|
119
|
+
|
120
|
+
|
121
|
+
|
122
|
+
|
123
|
+
# sqlite editor
|
124
|
+
@label_sqlite_editor = Qt::Label.new "SQLite Editor:", self, 0
|
125
|
+
@sqlite_editor = Qt::Label.new $settings.sqlite_editor
|
126
|
+
@sqlite_editor_change = Qt::PushButton.new "Change"
|
127
|
+
|
128
|
+
@sqlite_editor_change.connect(SIGNAL :released) {
|
129
|
+
file_dialog = Qt::FileDialog.new
|
130
|
+
file_dialog.setAcceptMode(Qt::FileDialog::AcceptOpen)
|
131
|
+
|
132
|
+
file_dialog.connect(SIGNAL('fileSelected(QString)')) { |x|
|
133
|
+
@sqlite_editor.setText x
|
134
|
+
}
|
135
|
+
file_dialog.exec
|
136
|
+
}
|
137
|
+
external_apps_config_layout.addWidget @label_sqlite_editor, 1, 0
|
138
|
+
external_apps_config_layout.addWidget @sqlite_editor, 1, 1
|
139
|
+
external_apps_config_layout.addWidget @sqlite_editor_change, 1, 2
|
140
|
+
|
141
|
+
end
|
142
|
+
|
143
|
+
def forwarders_changed?
|
144
|
+
@forward_tabs.forwarders_changed?
|
145
|
+
end
|
146
|
+
|
147
|
+
|
148
|
+
end
|
149
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
module Idb
|
2
|
+
class SharedLibrariesWidget < Qt::Widget
|
3
|
+
def initialize *args
|
4
|
+
super *args
|
5
|
+
|
6
|
+
@refresh = Qt::PushButton.new "Refresh"
|
7
|
+
@refresh.connect(SIGNAL :released) {
|
8
|
+
refresh
|
9
|
+
}
|
10
|
+
|
11
|
+
@list = Qt::ListWidget.new self
|
12
|
+
|
13
|
+
layout = Qt::VBoxLayout.new do |v|
|
14
|
+
v.add_widget(@list)
|
15
|
+
v.add_widget(@refresh)
|
16
|
+
end
|
17
|
+
setLayout(layout)
|
18
|
+
end
|
19
|
+
|
20
|
+
def clear
|
21
|
+
@list.clear
|
22
|
+
end
|
23
|
+
|
24
|
+
def refresh
|
25
|
+
@list.clear
|
26
|
+
if not $selected_app.binary.nil?
|
27
|
+
shared_lib = $selected_app.binary.get_shared_libraries
|
28
|
+
if shared_lib.nil?
|
29
|
+
item = Qt::ListWidgetItem.new
|
30
|
+
item.setText "Error: otool required"
|
31
|
+
@list.addItem item
|
32
|
+
return
|
33
|
+
end
|
34
|
+
shared_lib.each { |lib|
|
35
|
+
item = Qt::ListWidgetItem.new
|
36
|
+
item.setText lib
|
37
|
+
@list.addItem item
|
38
|
+
}
|
39
|
+
setEnabled(true)
|
40
|
+
else
|
41
|
+
setEnabled(false)
|
42
|
+
end
|
43
|
+
|
44
|
+
end
|
45
|
+
|
46
|
+
end
|
47
|
+
end
|