idb 1.3.1

Sign up to get free protection for your applications and to get access to all the features.
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,150 @@
1
+ require_relative '../lib/snoop_it_wrapper'
2
+ require_relative 'snoop_it_update_thread'
3
+ require_relative 'qt_ruby_variant'
4
+
5
+
6
+ module Idb
7
+ #TODO: implement something like this to make model update faster
8
+ class FSEventItemModel < Qt::StandardItemModel
9
+ include Idb
10
+
11
+ def initialize *args
12
+ super *args
13
+ end
14
+
15
+ def add_bulk
16
+
17
+
18
+ end
19
+
20
+
21
+
22
+ end
23
+
24
+
25
+
26
+ class SnoopItFSEventsWidget < Qt::Widget
27
+
28
+
29
+ def initialize *args
30
+ super *args
31
+
32
+ @model = Qt::StandardItemModel.new
33
+
34
+ @selection_model = Qt::ItemSelectionModel.new @model
35
+ @selection_model.model
36
+
37
+ @events_tab = Qt::TableView.new
38
+ @events_tab.setModel @selection_model.model
39
+ @events_tab.setSelectionModel(@selection_model)
40
+
41
+ @events_tab.setSelectionBehavior(Qt::AbstractItemView::SelectRows)
42
+ @events_tab.setEditTriggers(Qt::AbstractItemView::NoEditTriggers )
43
+
44
+ @start = Qt::PushButton.new "Start"
45
+ @start.connect(SIGNAL :released) {
46
+ @start.setEnabled(false)
47
+ @stop.setEnabled(true)
48
+ start_stream
49
+ }
50
+
51
+ @stop = Qt::PushButton.new "Stop"
52
+ @stop.setEnabled(false)
53
+ @stop.connect(SIGNAL :released) {
54
+ @start.setEnabled(true)
55
+ @stop.setEnabled(false)
56
+ stop_stream
57
+ }
58
+
59
+
60
+ layout = Qt::VBoxLayout.new do |v|
61
+ v.add_widget(@events_tab)
62
+ v.add_widget(@start)
63
+ v.add_widget(@stop)
64
+ end
65
+ setLayout(layout)
66
+
67
+
68
+
69
+ end
70
+
71
+ def reset
72
+ @model.clear
73
+ @model.setHorizontalHeaderItem(0, Qt::StandardItem.new("Subject"))
74
+ @model.setHorizontalHeaderItem(1, Qt::StandardItem.new("Expiry"))
75
+ @model.setHorizontalHeaderItem(2, Qt::StandardItem.new("Issuer"))
76
+
77
+ end
78
+
79
+ def start_stream
80
+
81
+
82
+ @thread = SnoopItUpdateThread.new
83
+ @thread.connect(SIGNAL('new_events(QVariant)')) { |events|
84
+ if not events.value.nil?
85
+ @events_tab.blockSignals(true)
86
+ events.value.each { |e|
87
+ #TODO if there are many, display status
88
+ row = parse_event e
89
+ @model.appendRow(row)
90
+ Qt::Application::processEvents
91
+
92
+ }
93
+ @events_tab.blockSignals(false)
94
+ @events_tab.resizeColumnsToContents
95
+ @events_tab.resizeRowsToContents
96
+ end
97
+ }
98
+ @thread.delete_all
99
+ @thread.stream 'fsevents_after_id'
100
+
101
+ end
102
+
103
+
104
+ private
105
+ def parse_event e
106
+ row = Array.new
107
+ row << Qt::StandardItem.new(e.value["id"].value.to_s)
108
+
109
+ row << Qt::StandardItem.new(Time.at(e.value["timestamp"].value).to_s)
110
+
111
+ mode = nil
112
+
113
+ case e.value["accessMode"].value
114
+ when 0
115
+ mode = "Error"
116
+ when 1
117
+ mode = "Read-Only"
118
+ when 2
119
+ mode = "Write-Only"
120
+ when 3
121
+ mode = "Read/Write"
122
+ end
123
+
124
+ row << Qt::StandardItem.new(mode)
125
+
126
+ row << Qt::StandardItem.new(e.value["path"].value.to_s)
127
+
128
+ dp_class = nil
129
+ case e.value["class"].value
130
+ when 1
131
+ dp_class = "NSFileProtectionNone"
132
+ when 2
133
+ dp_class = "NSFileProtectionComplete"
134
+ when 3
135
+ dp_class = "NSFileProtectionCompleteUnlessOpen"
136
+ when 4
137
+ dp_class = "NSFileProtectionCompleteUntilFirstUserAuthentication"
138
+ end
139
+ row << Qt::StandardItem.new(dp_class)
140
+
141
+
142
+
143
+ row << Qt::StandardItem.new(e.value["sandbox"].value.to_s)
144
+ row
145
+ end
146
+
147
+
148
+
149
+ end
150
+ end
@@ -0,0 +1,172 @@
1
+ require_relative 'snoop_it_update_thread'
2
+ require_relative '../lib/snoop_it_wrapper'
3
+
4
+ module Idb
5
+ class SnoopItKeychainWidget < Qt::Widget
6
+
7
+ def initialize *args
8
+ super *args
9
+
10
+ @model = Qt::StandardItemModel.new
11
+
12
+ @selection_model = Qt::ItemSelectionModel.new @model
13
+ @selection_model.model
14
+
15
+ @events_tab = Qt::TableView.new
16
+ @events_tab.setModel @selection_model.model
17
+ @events_tab.setSelectionModel(@selection_model)
18
+
19
+ @events_tab.setSelectionBehavior(Qt::AbstractItemView::SelectRows)
20
+ @events_tab.setEditTriggers(Qt::AbstractItemView::NoEditTriggers )
21
+
22
+ @snoop = SnoopItWrapper.new
23
+
24
+
25
+ @selection_model.connect(SIGNAL('selectionChanged(QItemSelection,QItemSelection)')) {|x,y|
26
+ selected_row = x.indexes[0].row
27
+ id = @model.item(selected_row, 0).text
28
+ details = @snoop.keychain_details id
29
+ puts details[0].inspect
30
+ @query_val.setText(details[0]["query"].to_s)
31
+ @data_val.setText(details[0]["data"].to_s)
32
+ }
33
+
34
+
35
+ @start = Qt::PushButton.new "Start"
36
+ @start.connect(SIGNAL :released) {
37
+ @start.setEnabled(false)
38
+ @stop.setEnabled(true)
39
+ start_stream
40
+ }
41
+
42
+ @stop = Qt::PushButton.new "Stop"
43
+ @stop.setEnabled(false)
44
+ @stop.connect(SIGNAL :released) {
45
+ @start.setEnabled(true)
46
+ @stop.setEnabled(false)
47
+ stop_stream
48
+ }
49
+
50
+ @details = Qt::GroupBox.new
51
+ @details.setTitle "Details"
52
+ @detail_layout = Qt::GridLayout.new
53
+ @details.setLayout(@detail_layout)
54
+
55
+ @query_label = Qt::Label.new "<b>Query</b>", @details
56
+ @query_val = Qt::Label.new "", self, 0
57
+ @detail_layout.addWidget @query_label, 0, 0
58
+ @detail_layout.addWidget @query_val, 0, 1
59
+
60
+
61
+ @data_label = Qt::Label.new "<b>Data</b>", @details
62
+ @data_val = Qt::Label.new "", self, 0
63
+ @detail_layout.addWidget @data_label, 1, 0
64
+ @detail_layout.addWidget @data_val, 1, 1
65
+
66
+
67
+
68
+
69
+
70
+
71
+ layout = Qt::VBoxLayout.new do |v|
72
+ v.add_widget(@events_tab)
73
+ v.add_widget(@details)
74
+ v.add_widget(@start)
75
+ v.add_widget(@stop)
76
+ end
77
+ setLayout(layout)
78
+
79
+
80
+
81
+ end
82
+
83
+
84
+ def start_stream
85
+
86
+
87
+ @thread = SnoopItUpdateThread.new
88
+ @thread.connect(SIGNAL('new_events(QVariant)')) { |events|
89
+ if not events.value.nil?
90
+ @events_tab.blockSignals(true)
91
+ events.value.each { |e|
92
+ #TODO if there are many, display status
93
+ row = parse_event e
94
+ @model.appendRow(row)
95
+ Qt::Application::processEvents
96
+
97
+ }
98
+ @events_tab.blockSignals(false)
99
+ @events_tab.resizeColumnsToContents
100
+ @events_tab.resizeRowsToContents
101
+ end
102
+ }
103
+ @thread.stream 'keychain_after_id'
104
+
105
+ end
106
+
107
+
108
+ private
109
+ def parse_event e
110
+ row = Array.new
111
+ row << Qt::StandardItem.new(e.value["id"].value.to_s)
112
+
113
+ row << Qt::StandardItem.new(Time.at(e.value["timestamp"].value).to_s)
114
+
115
+ mode = nil
116
+
117
+ case e.value["action"].value
118
+ when 1
119
+ mode = "Added"
120
+ when 2
121
+ mode = "Modified"
122
+ when 3
123
+ mode = "Deleted"
124
+ when 4
125
+ mode = "Read"
126
+ end
127
+
128
+ row << Qt::StandardItem.new(mode)
129
+
130
+ sec_class = nil
131
+ case e.value["secClass"].value
132
+ when 0
133
+ sec_class = "Unknown"
134
+ when 1
135
+ sec_class = "kSecClassGenericPassword"
136
+ when 2
137
+ sec_class = "kSecClassInternetPassword"
138
+ when 3
139
+ sec_class = "kSecClassCertificate"
140
+ when 4
141
+ sec_class = "kSecClassKey"
142
+ when 5
143
+ sec_class = "kSecClassIdentity"
144
+ end
145
+ row << Qt::StandardItem.new(sec_class)
146
+
147
+ access = nil
148
+ case e.value["accessible"].value
149
+ when 0
150
+ access = "Unkown"
151
+ when 1
152
+ access = "kSecAttrAccessibleWhenUnlocked"
153
+ when 2
154
+ access = "kSecAttrAccessibleAfterFirstUnlock"
155
+ when 3
156
+ access = "kSecAttrAccessibleAlways"
157
+ when 4
158
+ access = "kSecAttrAccessibleWhenUnlockedThisDeviceOnly"
159
+ when 5
160
+ access = "kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly"
161
+ when 6
162
+ access = "kSecAttrAccessibleAlwaysThisDeviceOnly"
163
+ end
164
+ row << Qt::StandardItem.new(access)
165
+
166
+ row
167
+ end
168
+
169
+
170
+
171
+ end
172
+ end
@@ -0,0 +1,128 @@
1
+ require_relative '../lib/snoop_it_wrapper'
2
+
3
+ module Idb
4
+ class SnooptItSensitiveAPIWidget < Qt::Widget
5
+
6
+
7
+ def initialize *args
8
+ super *args
9
+
10
+ @snoop = SnoopItWrapper.new
11
+
12
+ @model = Qt::StandardItemModel.new
13
+
14
+ @selection_model = Qt::ItemSelectionModel.new @model
15
+ @selection_model.model
16
+
17
+ @events_tab = Qt::TableView.new
18
+ @events_tab.setModel @selection_model.model
19
+ @events_tab.setSelectionModel(@selection_model)
20
+
21
+ @events_tab.setSelectionBehavior(Qt::AbstractItemView::SelectRows)
22
+ @events_tab.setEditTriggers(Qt::AbstractItemView::NoEditTriggers )
23
+
24
+ @start = Qt::PushButton.new "Start"
25
+ @start.connect(SIGNAL :released) {
26
+ @start.setEnabled(false)
27
+ @stop.setEnabled(true)
28
+ start_stream
29
+ }
30
+
31
+ @stop = Qt::PushButton.new "Stop"
32
+ @stop.setEnabled(false)
33
+ @stop.connect(SIGNAL :released) {
34
+ @start.setEnabled(true)
35
+ @stop.setEnabled(false)
36
+ stop_stream
37
+ }
38
+
39
+
40
+ layout = Qt::VBoxLayout.new do |v|
41
+ v.add_widget(@events_tab)
42
+ v.add_widget(@start)
43
+ v.add_widget(@stop)
44
+ end
45
+ setLayout(layout)
46
+
47
+
48
+
49
+ end
50
+
51
+ def reset
52
+ @model.clear
53
+ @model.setHorizontalHeaderItem(0, Qt::StandardItem.new("Subject"))
54
+ @model.setHorizontalHeaderItem(1, Qt::StandardItem.new("Expiry"))
55
+ @model.setHorizontalHeaderItem(2, Qt::StandardItem.new("Issuer"))
56
+
57
+ end
58
+
59
+ def start_stream
60
+
61
+
62
+ @thread = SnoopItUpdateThread.new
63
+ @thread.connect(SIGNAL('new_events(QVariant)')) { |events|
64
+ if not events.value.nil?
65
+ @events_tab.blockSignals(true)
66
+ events.value.each { |e|
67
+ #TODO if there are many, display status
68
+ row = parse_event e
69
+ @model.appendRow(row)
70
+ Qt::Application::processEvents
71
+
72
+ }
73
+ @events_tab.blockSignals(false)
74
+ @events_tab.resizeColumnsToContents
75
+ @events_tab.resizeRowsToContents
76
+ end
77
+ }
78
+ @snoop.sensitiveapi_delete
79
+ @thread.stream 'sensitiveapi_after_id'
80
+
81
+ end
82
+
83
+
84
+ private
85
+ def parse_event e
86
+ row = Array.new
87
+ row << Qt::StandardItem.new(e.value["id"].value.to_s)
88
+
89
+ row << Qt::StandardItem.new(Time.at(e.value["timestamp"].value).to_s)
90
+
91
+ mode = nil
92
+
93
+ case e.value["api"].value
94
+ when 1
95
+ mode = "Unique Device ID (UDID)"
96
+ when 2
97
+ mode = "Wifi MAC Address"
98
+ when 3
99
+ mode = "Addressbook (via API)"
100
+ when 4
101
+ mode = "Calendar (via API)"
102
+ when 5
103
+ mode = "Photos / Videos"
104
+ when 6
105
+ mode = "Location"
106
+ when 7
107
+ mode = "Addressbook (File Access)"
108
+ when 8
109
+ mode = "Calendar (File Access)"
110
+ when 9
111
+ mode = "Audio recording"
112
+ when 10
113
+ mode = "Camera"
114
+ when 11
115
+ mode = "General Pasteboard"
116
+ when 12
117
+ mode = "Find Paasteboard"
118
+ when 13
119
+ mode = "Custom Pasteboard"
120
+ end
121
+
122
+ row << Qt::StandardItem.new(mode)
123
+
124
+ row
125
+ end
126
+
127
+ end
128
+ end