librex 0.0.68 → 0.0.70

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.
Files changed (528) hide show
  1. checksums.yaml +15 -0
  2. data/README.markdown +1 -1
  3. data/Rakefile +18 -16
  4. data/lib/rex.rb +14 -10
  5. data/lib/rex/LICENSE +2 -2
  6. data/lib/rex/arch.rb +76 -76
  7. data/lib/rex/arch/sparc.rb +57 -58
  8. data/lib/rex/arch/x86.rb +506 -496
  9. data/lib/rex/assembly/nasm.rb +83 -84
  10. data/lib/rex/compat.rb +228 -173
  11. data/lib/rex/constants.rb +47 -37
  12. data/lib/rex/elfparsey.rb +0 -3
  13. data/lib/rex/elfparsey/elf.rb +107 -110
  14. data/lib/rex/elfparsey/elfbase.rb +244 -247
  15. data/lib/rex/elfparsey/exceptions.rb +0 -3
  16. data/lib/rex/elfscan.rb +0 -3
  17. data/lib/rex/elfscan/scanner.rb +184 -166
  18. data/lib/rex/elfscan/search.rb +35 -38
  19. data/lib/rex/encoder/alpha2.rb +1 -2
  20. data/lib/rex/encoder/alpha2/alpha_mixed.rb +52 -53
  21. data/lib/rex/encoder/alpha2/alpha_upper.rb +62 -63
  22. data/lib/rex/encoder/alpha2/generic.rb +77 -78
  23. data/lib/rex/encoder/alpha2/unicode_mixed.rb +101 -97
  24. data/lib/rex/encoder/alpha2/unicode_upper.rb +106 -107
  25. data/lib/rex/encoder/bloxor/bloxor.rb +326 -0
  26. data/lib/rex/encoder/ndr.rb +68 -68
  27. data/lib/rex/encoder/nonalpha.rb +50 -51
  28. data/lib/rex/encoder/nonupper.rb +50 -51
  29. data/lib/rex/encoder/xdr.rb +78 -78
  30. data/lib/rex/encoder/xor.rb +52 -53
  31. data/lib/rex/encoder/xor/dword.rb +1 -2
  32. data/lib/rex/encoder/xor/dword_additive.rb +1 -2
  33. data/lib/rex/encoders/xor_dword.rb +17 -18
  34. data/lib/rex/encoders/xor_dword_additive.rb +35 -36
  35. data/lib/rex/encoding/xor.rb +0 -1
  36. data/lib/rex/encoding/xor/byte.rb +3 -4
  37. data/lib/rex/encoding/xor/dword.rb +3 -4
  38. data/lib/rex/encoding/xor/dword_additive.rb +72 -73
  39. data/lib/rex/encoding/xor/exceptions.rb +2 -3
  40. data/lib/rex/encoding/xor/generic.rb +129 -130
  41. data/lib/rex/encoding/xor/qword.rb +3 -4
  42. data/lib/rex/encoding/xor/word.rb +3 -4
  43. data/lib/rex/exceptions.rb +100 -101
  44. data/lib/rex/exploitation/cmdstager.rb +3 -3
  45. data/lib/rex/exploitation/cmdstager/base.rb +170 -156
  46. data/lib/rex/exploitation/cmdstager/bourne.rb +105 -0
  47. data/lib/rex/exploitation/cmdstager/debug_asm.rb +110 -113
  48. data/lib/rex/exploitation/cmdstager/debug_write.rb +106 -109
  49. data/lib/rex/exploitation/cmdstager/echo.rb +164 -0
  50. data/lib/rex/exploitation/cmdstager/printf.rb +122 -0
  51. data/lib/rex/exploitation/cmdstager/tftp.rb +34 -27
  52. data/lib/rex/exploitation/cmdstager/vbs.rb +95 -98
  53. data/lib/rex/exploitation/egghunter.rb +359 -346
  54. data/lib/rex/exploitation/encryptjs.rb +60 -60
  55. data/lib/rex/exploitation/heaplib.rb +76 -76
  56. data/lib/rex/exploitation/js.rb +6 -0
  57. data/lib/rex/exploitation/js/detect.rb +69 -0
  58. data/lib/rex/exploitation/js/memory.rb +81 -0
  59. data/lib/rex/exploitation/js/network.rb +84 -0
  60. data/lib/rex/exploitation/js/utils.rb +33 -0
  61. data/lib/rex/exploitation/jsobfu.rb +448 -424
  62. data/lib/rex/exploitation/obfuscatejs.rb +301 -301
  63. data/lib/rex/exploitation/omelet.rb +257 -257
  64. data/lib/rex/exploitation/opcodedb.rb +699 -699
  65. data/lib/rex/exploitation/ropdb.rb +189 -0
  66. data/lib/rex/exploitation/seh.rb +68 -68
  67. data/lib/rex/file.rb +96 -49
  68. data/lib/rex/image_source.rb +0 -3
  69. data/lib/rex/image_source/disk.rb +45 -48
  70. data/lib/rex/image_source/image_source.rb +33 -36
  71. data/lib/rex/image_source/memory.rb +17 -20
  72. data/lib/rex/io/bidirectional_pipe.rb +118 -115
  73. data/lib/rex/io/datagram_abstraction.rb +13 -14
  74. data/lib/rex/io/ring_buffer.rb +273 -273
  75. data/lib/rex/io/stream.rb +284 -284
  76. data/lib/rex/io/stream_abstraction.rb +183 -181
  77. data/lib/rex/io/stream_server.rb +193 -193
  78. data/lib/rex/job_container.rb +167 -167
  79. data/lib/rex/logging.rb +0 -1
  80. data/lib/rex/logging/log_dispatcher.rb +113 -113
  81. data/lib/rex/logging/log_sink.rb +17 -17
  82. data/lib/rex/logging/sinks/flatfile.rb +36 -36
  83. data/lib/rex/logging/sinks/stderr.rb +27 -27
  84. data/lib/rex/mac_oui.rb +16572 -16571
  85. data/lib/rex/machparsey.rb +0 -1
  86. data/lib/rex/machparsey/exceptions.rb +0 -1
  87. data/lib/rex/machparsey/mach.rb +160 -161
  88. data/lib/rex/machparsey/machbase.rb +367 -368
  89. data/lib/rex/machscan.rb +0 -1
  90. data/lib/rex/machscan/scanner.rb +175 -176
  91. data/lib/rex/mime/encoding.rb +17 -0
  92. data/lib/rex/mime/header.rb +58 -58
  93. data/lib/rex/mime/message.rb +140 -137
  94. data/lib/rex/mime/part.rb +41 -12
  95. data/lib/rex/nop/opty2.rb +90 -90
  96. data/lib/rex/nop/opty2_tables.rb +273 -273
  97. data/lib/rex/ole.rb +0 -4
  98. data/lib/rex/ole/clsid.rb +26 -30
  99. data/lib/rex/ole/difat.rb +121 -125
  100. data/lib/rex/ole/directory.rb +205 -209
  101. data/lib/rex/ole/direntry.rb +217 -221
  102. data/lib/rex/ole/fat.rb +79 -83
  103. data/lib/rex/ole/header.rb +178 -182
  104. data/lib/rex/ole/minifat.rb +49 -53
  105. data/lib/rex/ole/propset.rb +113 -117
  106. data/lib/rex/ole/samples/create_ole.rb +8 -9
  107. data/lib/rex/ole/samples/dir.rb +10 -11
  108. data/lib/rex/ole/samples/dump_stream.rb +14 -15
  109. data/lib/rex/ole/samples/ole_info.rb +5 -6
  110. data/lib/rex/ole/storage.rb +372 -376
  111. data/lib/rex/ole/stream.rb +33 -37
  112. data/lib/rex/ole/substorage.rb +20 -24
  113. data/lib/rex/ole/util.rb +137 -141
  114. data/lib/rex/parser/acunetix_nokogiri.rb +398 -398
  115. data/lib/rex/parser/apple_backup_manifestdb.rb +116 -116
  116. data/lib/rex/parser/appscan_nokogiri.rb +359 -359
  117. data/lib/rex/parser/arguments.rb +88 -88
  118. data/lib/rex/parser/burp_session_nokogiri.rb +258 -258
  119. data/lib/rex/parser/ci_nokogiri.rb +184 -184
  120. data/lib/rex/parser/foundstone_nokogiri.rb +334 -333
  121. data/lib/rex/parser/fusionvm_nokogiri.rb +94 -94
  122. data/lib/rex/parser/ini.rb +167 -167
  123. data/lib/rex/parser/ip360_aspl_xml.rb +84 -84
  124. data/lib/rex/parser/ip360_xml.rb +77 -77
  125. data/lib/rex/parser/mbsa_nokogiri.rb +224 -224
  126. data/lib/rex/parser/nessus_xml.rb +100 -100
  127. data/lib/rex/parser/netsparker_xml.rb +89 -75
  128. data/lib/rex/parser/nexpose_raw_nokogiri.rb +677 -677
  129. data/lib/rex/parser/nexpose_simple_nokogiri.rb +322 -322
  130. data/lib/rex/parser/nexpose_xml.rb +105 -105
  131. data/lib/rex/parser/nmap_nokogiri.rb +386 -386
  132. data/lib/rex/parser/nmap_xml.rb +116 -116
  133. data/lib/rex/parser/nokogiri_doc_mixin.rb +223 -221
  134. data/lib/rex/parser/openvas_nokogiri.rb +162 -162
  135. data/lib/rex/parser/outpost24_nokogiri.rb +239 -0
  136. data/lib/rex/parser/retina_xml.rb +90 -90
  137. data/lib/rex/parser/unattend.rb +171 -0
  138. data/lib/rex/parser/wapiti_nokogiri.rb +89 -89
  139. data/lib/rex/payloads/win32/common.rb +14 -14
  140. data/lib/rex/payloads/win32/kernel.rb +36 -36
  141. data/lib/rex/payloads/win32/kernel/common.rb +32 -32
  142. data/lib/rex/payloads/win32/kernel/recovery.rb +27 -27
  143. data/lib/rex/payloads/win32/kernel/stager.rb +170 -170
  144. data/lib/rex/peparsey.rb +0 -3
  145. data/lib/rex/peparsey/exceptions.rb +0 -3
  146. data/lib/rex/peparsey/pe.rb +196 -199
  147. data/lib/rex/peparsey/pe_memdump.rb +35 -38
  148. data/lib/rex/peparsey/pebase.rb +1633 -1652
  149. data/lib/rex/peparsey/section.rb +115 -124
  150. data/lib/rex/pescan.rb +0 -3
  151. data/lib/rex/pescan/analyze.rb +351 -351
  152. data/lib/rex/pescan/scanner.rb +182 -182
  153. data/lib/rex/pescan/search.rb +59 -59
  154. data/lib/rex/platforms/windows.rb +37 -37
  155. data/lib/rex/poly.rb +111 -110
  156. data/lib/rex/poly/block.rb +419 -417
  157. data/lib/rex/poly/machine.rb +12 -0
  158. data/lib/rex/poly/machine/machine.rb +829 -0
  159. data/lib/rex/poly/machine/x86.rb +508 -0
  160. data/lib/rex/poly/register.rb +70 -70
  161. data/lib/rex/poly/register/x86.rb +22 -22
  162. data/lib/rex/post.rb +0 -1
  163. data/lib/rex/post/dir.rb +35 -36
  164. data/lib/rex/post/file.rb +140 -141
  165. data/lib/rex/post/file_stat.rb +198 -199
  166. data/lib/rex/post/io.rb +167 -168
  167. data/lib/rex/post/meterpreter.rb +1 -1
  168. data/lib/rex/post/meterpreter/channel.rb +389 -390
  169. data/lib/rex/post/meterpreter/channel_container.rb +33 -34
  170. data/lib/rex/post/meterpreter/channels/pool.rb +129 -130
  171. data/lib/rex/post/meterpreter/channels/pools/file.rb +35 -36
  172. data/lib/rex/post/meterpreter/channels/pools/stream_pool.rb +72 -73
  173. data/lib/rex/post/meterpreter/channels/stream.rb +62 -63
  174. data/lib/rex/post/meterpreter/client.rb +442 -436
  175. data/lib/rex/post/meterpreter/client_core.rb +326 -310
  176. data/lib/rex/post/meterpreter/dependencies.rb +0 -1
  177. data/lib/rex/post/meterpreter/extension.rb +12 -13
  178. data/lib/rex/post/meterpreter/extensions/espia/espia.rb +35 -36
  179. data/lib/rex/post/meterpreter/extensions/extapi/adsi/adsi.rb +71 -0
  180. data/lib/rex/post/meterpreter/extensions/extapi/clipboard/clipboard.rb +169 -0
  181. data/lib/rex/post/meterpreter/extensions/extapi/extapi.rb +45 -0
  182. data/lib/rex/post/meterpreter/extensions/extapi/service/service.rb +104 -0
  183. data/lib/rex/post/meterpreter/extensions/extapi/tlv.rb +77 -0
  184. data/lib/rex/post/meterpreter/extensions/extapi/window/window.rb +56 -0
  185. data/lib/rex/post/meterpreter/extensions/extapi/wmi/wmi.rb +75 -0
  186. data/lib/rex/post/meterpreter/extensions/incognito/incognito.rb +70 -71
  187. data/lib/rex/post/meterpreter/extensions/kiwi/kiwi.rb +361 -0
  188. data/lib/rex/post/meterpreter/extensions/kiwi/tlv.rb +76 -0
  189. data/lib/rex/post/meterpreter/extensions/lanattacks/dhcp/dhcp.rb +78 -0
  190. data/lib/rex/post/meterpreter/extensions/lanattacks/lanattacks.rb +22 -78
  191. data/lib/rex/post/meterpreter/extensions/lanattacks/tftp/tftp.rb +49 -0
  192. data/lib/rex/post/meterpreter/extensions/lanattacks/tlv.rb +4 -4
  193. data/lib/rex/post/meterpreter/extensions/mimikatz/mimikatz.rb +128 -0
  194. data/lib/rex/post/meterpreter/extensions/mimikatz/tlv.rb +16 -0
  195. data/lib/rex/post/meterpreter/extensions/networkpug/networkpug.rb +38 -39
  196. data/lib/rex/post/meterpreter/extensions/networkpug/tlv.rb +1 -1
  197. data/lib/rex/post/meterpreter/extensions/priv/fs.rb +95 -96
  198. data/lib/rex/post/meterpreter/extensions/priv/passwd.rb +39 -40
  199. data/lib/rex/post/meterpreter/extensions/priv/priv.rb +80 -85
  200. data/lib/rex/post/meterpreter/extensions/sniffer/sniffer.rb +94 -95
  201. data/lib/rex/post/meterpreter/extensions/stdapi/constants.rb +207 -147
  202. data/lib/rex/post/meterpreter/extensions/stdapi/fs/dir.rb +258 -259
  203. data/lib/rex/post/meterpreter/extensions/stdapi/fs/file.rb +366 -301
  204. data/lib/rex/post/meterpreter/extensions/stdapi/fs/file_stat.rb +72 -73
  205. data/lib/rex/post/meterpreter/extensions/stdapi/fs/io.rb +24 -25
  206. data/lib/rex/post/meterpreter/extensions/stdapi/net/arp.rb +59 -0
  207. data/lib/rex/post/meterpreter/extensions/stdapi/net/config.rb +227 -149
  208. data/lib/rex/post/meterpreter/extensions/stdapi/net/interface.rb +107 -108
  209. data/lib/rex/post/meterpreter/extensions/stdapi/net/netstat.rb +97 -0
  210. data/lib/rex/post/meterpreter/extensions/stdapi/net/resolve.rb +106 -0
  211. data/lib/rex/post/meterpreter/extensions/stdapi/net/route.rb +41 -42
  212. data/lib/rex/post/meterpreter/extensions/stdapi/net/socket.rb +102 -101
  213. data/lib/rex/post/meterpreter/extensions/stdapi/net/socket_subsystem/tcp_client_channel.rb +151 -152
  214. data/lib/rex/post/meterpreter/extensions/stdapi/net/socket_subsystem/tcp_server_channel.rb +142 -142
  215. data/lib/rex/post/meterpreter/extensions/stdapi/net/socket_subsystem/udp_channel.rb +185 -185
  216. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/api_constants.rb +38118 -38117
  217. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/buffer_item.rb +7 -7
  218. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_advapi32.rb +2086 -2084
  219. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_crypt32.rb +15 -15
  220. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_iphlpapi.rb +80 -80
  221. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_kernel32.rb +3835 -3833
  222. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_netapi32.rb +84 -28
  223. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_ntdll.rb +151 -137
  224. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_shell32.rb +15 -6
  225. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_user32.rb +3155 -3155
  226. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_version.rb +41 -0
  227. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_wlanapi.rb +70 -70
  228. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_wldap32.rb +128 -0
  229. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_ws2_32.rb +596 -596
  230. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll.rb +310 -301
  231. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_function.rb +71 -61
  232. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_helper.rb +100 -100
  233. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_wrapper.rb +14 -14
  234. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/mock_magic.rb +488 -488
  235. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/multicall.rb +273 -264
  236. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/platform_util.rb +5 -5
  237. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/railgun.rb +240 -238
  238. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/tlv.rb +17 -15
  239. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/type/pointer_util.rb +61 -61
  240. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/util.rb +654 -635
  241. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/win_const_manager.rb +49 -49
  242. data/lib/rex/post/meterpreter/extensions/stdapi/stdapi.rb +103 -102
  243. data/lib/rex/post/meterpreter/extensions/stdapi/sys/config.rb +98 -68
  244. data/lib/rex/post/meterpreter/extensions/stdapi/sys/event_log.rb +165 -166
  245. data/lib/rex/post/meterpreter/extensions/stdapi/sys/event_log_subsystem/event_record.rb +16 -17
  246. data/lib/rex/post/meterpreter/extensions/stdapi/sys/power.rb +34 -36
  247. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process.rb +363 -364
  248. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/image.rb +102 -103
  249. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/io.rb +28 -29
  250. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/memory.rb +303 -304
  251. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/thread.rb +113 -114
  252. data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry.rb +260 -261
  253. data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry_subsystem/registry_key.rb +165 -166
  254. data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry_subsystem/registry_value.rb +69 -70
  255. data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry_subsystem/remote_registry_key.rb +160 -161
  256. data/lib/rex/post/meterpreter/extensions/stdapi/sys/thread.rb +143 -144
  257. data/lib/rex/post/meterpreter/extensions/stdapi/tlv.rb +29 -12
  258. data/lib/rex/post/meterpreter/extensions/stdapi/ui.rb +230 -231
  259. data/lib/rex/post/meterpreter/extensions/stdapi/webcam/webcam.rb +181 -44
  260. data/lib/rex/post/meterpreter/inbound_packet_handler.rb +12 -13
  261. data/lib/rex/post/meterpreter/object_aliases.rb +56 -57
  262. data/lib/rex/post/meterpreter/packet.rb +591 -592
  263. data/lib/rex/post/meterpreter/packet_dispatcher.rb +506 -496
  264. data/lib/rex/post/meterpreter/packet_parser.rb +72 -73
  265. data/lib/rex/post/meterpreter/packet_response_waiter.rb +56 -57
  266. data/lib/rex/post/meterpreter/ui/console.rb +112 -112
  267. data/lib/rex/post/meterpreter/ui/console/command_dispatcher.rb +53 -53
  268. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/core.rb +911 -854
  269. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/espia.rb +86 -86
  270. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi.rb +65 -0
  271. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi/adsi.rb +198 -0
  272. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi/clipboard.rb +444 -0
  273. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi/service.rb +199 -0
  274. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi/window.rb +118 -0
  275. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi/wmi.rb +108 -0
  276. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/incognito.rb +220 -220
  277. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/kiwi.rb +509 -0
  278. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/lanattacks.rb +60 -0
  279. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/lanattacks/dhcp.rb +254 -0
  280. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/lanattacks/tftp.rb +159 -0
  281. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/mimikatz.rb +182 -0
  282. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/networkpug.rb +173 -173
  283. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv.rb +40 -40
  284. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv/elevate.rb +75 -77
  285. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv/passwd.rb +30 -30
  286. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv/timestomp.rb +105 -105
  287. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/sniffer.rb +182 -182
  288. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi.rb +37 -37
  289. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/fs.rb +504 -482
  290. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/net.rb +401 -330
  291. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/sys.rb +883 -581
  292. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/ui.rb +296 -299
  293. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/webcam.rb +320 -153
  294. data/lib/rex/post/meterpreter/ui/console/interactive_channel.rb +78 -78
  295. data/lib/rex/post/permission.rb +0 -1
  296. data/lib/rex/post/process.rb +39 -40
  297. data/lib/rex/post/thread.rb +41 -42
  298. data/lib/rex/post/ui.rb +35 -36
  299. data/lib/rex/proto/addp.rb +218 -0
  300. data/lib/rex/proto/dcerpc/client.rb +344 -344
  301. data/lib/rex/proto/dcerpc/exceptions.rb +128 -128
  302. data/lib/rex/proto/dcerpc/handle.rb +32 -32
  303. data/lib/rex/proto/dcerpc/ndr.rb +56 -56
  304. data/lib/rex/proto/dcerpc/packet.rb +249 -245
  305. data/lib/rex/proto/dcerpc/response.rb +170 -170
  306. data/lib/rex/proto/dcerpc/uuid.rb +65 -65
  307. data/lib/rex/proto/dcerpc/wdscp.rb +3 -0
  308. data/lib/rex/proto/dcerpc/wdscp/constants.rb +89 -0
  309. data/lib/rex/proto/dcerpc/wdscp/packet.rb +94 -0
  310. data/lib/rex/proto/dhcp.rb +0 -1
  311. data/lib/rex/proto/dhcp/constants.rb +0 -1
  312. data/lib/rex/proto/dhcp/server.rb +303 -304
  313. data/lib/rex/proto/drda/constants.rb +1 -1
  314. data/lib/rex/proto/drda/packet.rb +186 -186
  315. data/lib/rex/proto/drda/utils.rb +104 -104
  316. data/lib/rex/proto/http.rb +1 -0
  317. data/lib/rex/proto/http/client.rb +692 -820
  318. data/lib/rex/proto/http/client_request.rb +472 -0
  319. data/lib/rex/proto/http/handler.rb +25 -25
  320. data/lib/rex/proto/http/handler/erb.rb +104 -104
  321. data/lib/rex/proto/http/handler/proc.rb +37 -37
  322. data/lib/rex/proto/http/header.rb +149 -149
  323. data/lib/rex/proto/http/packet.rb +388 -382
  324. data/lib/rex/proto/http/request.rb +332 -335
  325. data/lib/rex/proto/http/response.rb +132 -72
  326. data/lib/rex/proto/http/server.rb +348 -338
  327. data/lib/rex/proto/iax2/call.rb +310 -310
  328. data/lib/rex/proto/iax2/client.rb +197 -197
  329. data/lib/rex/proto/iax2/codecs/alaw.rb +4 -4
  330. data/lib/rex/proto/iax2/codecs/mulaw.rb +4 -4
  331. data/lib/rex/proto/ipmi.rb +57 -0
  332. data/lib/rex/proto/ipmi/channel_auth_reply.rb +88 -0
  333. data/lib/rex/proto/ipmi/open_session_reply.rb +35 -0
  334. data/lib/rex/proto/ipmi/rakp2.rb +35 -0
  335. data/lib/rex/proto/ipmi/utils.rb +125 -0
  336. data/lib/rex/proto/natpmp.rb +1 -5
  337. data/lib/rex/proto/natpmp/constants.rb +4 -4
  338. data/lib/rex/proto/natpmp/packet.rb +25 -25
  339. data/lib/rex/proto/ntlm/base.rb +271 -271
  340. data/lib/rex/proto/ntlm/constants.rb +61 -61
  341. data/lib/rex/proto/ntlm/crypt.rb +348 -352
  342. data/lib/rex/proto/ntlm/exceptions.rb +3 -3
  343. data/lib/rex/proto/ntlm/message.rb +468 -471
  344. data/lib/rex/proto/ntlm/utils.rb +746 -746
  345. data/lib/rex/proto/pjl.rb +30 -0
  346. data/lib/rex/proto/pjl/client.rb +162 -0
  347. data/lib/rex/proto/proxy/socks4a.rb +440 -440
  348. data/lib/rex/proto/rfb.rb +1 -8
  349. data/lib/rex/proto/rfb/cipher.rb +46 -49
  350. data/lib/rex/proto/rfb/client.rb +179 -182
  351. data/lib/rex/proto/rfb/constants.rb +18 -21
  352. data/lib/rex/proto/smb/client.rb +1954 -1843
  353. data/lib/rex/proto/smb/constants.rb +533 -516
  354. data/lib/rex/proto/smb/crypt.rb +21 -21
  355. data/lib/rex/proto/smb/evasions.rb +43 -43
  356. data/lib/rex/proto/smb/exceptions.rb +791 -791
  357. data/lib/rex/proto/smb/simpleclient.rb +142 -286
  358. data/lib/rex/proto/smb/simpleclient/open_file.rb +106 -0
  359. data/lib/rex/proto/smb/simpleclient/open_pipe.rb +57 -0
  360. data/lib/rex/proto/smb/utils.rb +81 -81
  361. data/lib/rex/proto/sunrpc/client.rb +158 -158
  362. data/lib/rex/proto/tftp.rb +0 -1
  363. data/lib/rex/proto/tftp/client.rb +289 -289
  364. data/lib/rex/proto/tftp/constants.rb +9 -10
  365. data/lib/rex/proto/tftp/server.rb +466 -467
  366. data/lib/rex/random_identifier_generator.rb +176 -0
  367. data/lib/rex/registry.rb +1 -1
  368. data/lib/rex/registry/hive.rb +88 -88
  369. data/lib/rex/registry/lfkey.rb +25 -25
  370. data/lib/rex/registry/nodekey.rb +30 -30
  371. data/lib/rex/registry/regf.rb +10 -10
  372. data/lib/rex/registry/valuekey.rb +43 -43
  373. data/lib/rex/registry/valuelist.rb +13 -13
  374. data/lib/rex/ropbuilder/rop.rb +254 -253
  375. data/lib/rex/script.rb +21 -22
  376. data/lib/rex/script/base.rb +51 -50
  377. data/lib/rex/script/meterpreter.rb +2 -2
  378. data/lib/rex/service.rb +24 -24
  379. data/lib/rex/service_manager.rb +132 -132
  380. data/lib/rex/services/local_relay.rb +398 -398
  381. data/lib/rex/socket.rb +758 -763
  382. data/lib/rex/socket/comm.rb +95 -95
  383. data/lib/rex/socket/comm/local.rb +507 -440
  384. data/lib/rex/socket/ip.rb +118 -118
  385. data/lib/rex/socket/parameters.rb +351 -350
  386. data/lib/rex/socket/range_walker.rb +445 -368
  387. data/lib/rex/socket/ssl_tcp.rb +323 -317
  388. data/lib/rex/socket/ssl_tcp_server.rb +173 -158
  389. data/lib/rex/socket/subnet_walker.rb +48 -48
  390. data/lib/rex/socket/switch_board.rb +259 -259
  391. data/lib/rex/socket/tcp.rb +58 -56
  392. data/lib/rex/socket/tcp_server.rb +42 -42
  393. data/lib/rex/socket/udp.rb +152 -152
  394. data/lib/rex/sslscan/result.rb +200 -0
  395. data/lib/rex/sslscan/scanner.rb +205 -0
  396. data/lib/rex/struct2.rb +0 -1
  397. data/lib/rex/struct2/c_struct.rb +162 -163
  398. data/lib/rex/struct2/c_struct_template.rb +21 -22
  399. data/lib/rex/struct2/constant.rb +6 -7
  400. data/lib/rex/struct2/element.rb +30 -31
  401. data/lib/rex/struct2/generic.rb +60 -61
  402. data/lib/rex/struct2/restraint.rb +40 -41
  403. data/lib/rex/struct2/s_string.rb +60 -61
  404. data/lib/rex/struct2/s_struct.rb +97 -98
  405. data/lib/rex/sync.rb +0 -1
  406. data/lib/rex/sync/event.rb +62 -72
  407. data/lib/rex/sync/read_write_lock.rb +149 -149
  408. data/lib/rex/sync/ref.rb +42 -42
  409. data/lib/rex/sync/thread_safe.rb +59 -59
  410. data/lib/rex/text.rb +1803 -1315
  411. data/lib/rex/thread_factory.rb +25 -25
  412. data/lib/rex/time.rb +44 -44
  413. data/lib/rex/transformer.rb +91 -91
  414. data/lib/rex/ui/interactive.rb +265 -265
  415. data/lib/rex/ui/output.rb +66 -60
  416. data/lib/rex/ui/progress_tracker.rb +79 -79
  417. data/lib/rex/ui/subscriber.rb +144 -134
  418. data/lib/rex/ui/text/color.rb +76 -76
  419. data/lib/rex/ui/text/dispatcher_shell.rb +512 -505
  420. data/lib/rex/ui/text/input.rb +96 -96
  421. data/lib/rex/ui/text/input/buffer.rb +58 -58
  422. data/lib/rex/ui/text/input/readline.rb +114 -114
  423. data/lib/rex/ui/text/input/socket.rb +77 -77
  424. data/lib/rex/ui/text/input/stdio.rb +24 -24
  425. data/lib/rex/ui/text/irb_shell.rb +45 -41
  426. data/lib/rex/ui/text/output.rb +64 -60
  427. data/lib/rex/ui/text/output/buffer.rb +42 -42
  428. data/lib/rex/ui/text/output/buffer/stdout.rb +25 -0
  429. data/lib/rex/ui/text/output/file.rb +24 -24
  430. data/lib/rex/ui/text/output/socket.rb +24 -24
  431. data/lib/rex/ui/text/output/stdio.rb +29 -29
  432. data/lib/rex/ui/text/output/tee.rb +36 -36
  433. data/lib/rex/ui/text/progress_tracker.rb +37 -37
  434. data/lib/rex/ui/text/shell.rb +371 -361
  435. data/lib/rex/ui/text/table.rb +320 -284
  436. data/lib/rex/zip.rb +0 -1
  437. data/lib/rex/zip/archive.rb +115 -94
  438. data/lib/rex/zip/blocks.rb +101 -100
  439. data/lib/rex/zip/entry.rb +108 -99
  440. data/lib/rex/zip/jar.rb +261 -206
  441. data/lib/rex/zip/samples/comment.rb +1 -2
  442. data/lib/rex/zip/samples/mkwar.rb +12 -13
  443. data/lib/rex/zip/samples/mkzip.rb +1 -2
  444. data/lib/rex/zip/samples/recursive.rb +29 -30
  445. metadata +424 -446
  446. data/lib/rex/arch/sparc.rb.ut.rb +0 -19
  447. data/lib/rex/arch/x86.rb.ut.rb +0 -94
  448. data/lib/rex/assembly/nasm.rb.ut.rb +0 -23
  449. data/lib/rex/encoder/ndr.rb.ut.rb +0 -45
  450. data/lib/rex/encoder/xdr.rb.ut.rb +0 -30
  451. data/lib/rex/encoders/xor_dword_additive.rb.ut.rb +0 -13
  452. data/lib/rex/encoding/xor.rb.ts.rb +0 -15
  453. data/lib/rex/encoding/xor/byte.rb.ut.rb +0 -22
  454. data/lib/rex/encoding/xor/dword.rb.ut.rb +0 -16
  455. data/lib/rex/encoding/xor/dword_additive.rb.ut.rb +0 -16
  456. data/lib/rex/encoding/xor/generic.rb.ut.rb +0 -121
  457. data/lib/rex/encoding/xor/word.rb.ut.rb +0 -14
  458. data/lib/rex/exceptions.rb.ut.rb +0 -45
  459. data/lib/rex/exploitation/egghunter.rb.ut.rb +0 -28
  460. data/lib/rex/exploitation/javascriptosdetect.js +0 -1014
  461. data/lib/rex/exploitation/javascriptosdetect.rb +0 -43
  462. data/lib/rex/exploitation/omelet.rb.ut.rb +0 -27
  463. data/lib/rex/exploitation/opcodedb.rb.ut.rb +0 -280
  464. data/lib/rex/exploitation/seh.rb.ut.rb +0 -20
  465. data/lib/rex/file.rb.ut.rb +0 -17
  466. data/lib/rex/io/ring_buffer.rb.ut.rb +0 -135
  467. data/lib/rex/nop/opty2.rb.ut.rb +0 -24
  468. data/lib/rex/parser/arguments.rb.ut.rb +0 -68
  469. data/lib/rex/parser/ini.rb.ut.rb +0 -30
  470. data/lib/rex/post/meterpreter/extensions/stdapi/railgun.rb.ts.rb +0 -18
  471. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/api_constants.rb.ut.rb +0 -39
  472. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/buffer_item.rb.ut.rb +0 -37
  473. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll.rb.ut.rb +0 -52
  474. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_function.rb.ut.rb +0 -43
  475. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_helper.rb.ut.rb +0 -128
  476. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_wrapper.rb.ut.rb +0 -64
  477. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/platform_util.rb.ut.rb +0 -29
  478. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/railgun.rb.ut.rb +0 -155
  479. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/type/pointer_util.rb.ut.rb +0 -128
  480. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/win_const_manager.rb.ut.rb +0 -124
  481. data/lib/rex/proto.rb.ts.rb +0 -9
  482. data/lib/rex/proto/dcerpc.rb.ts.rb +0 -10
  483. data/lib/rex/proto/dcerpc/client.rb.ut.rb +0 -492
  484. data/lib/rex/proto/dcerpc/handle.rb.ut.rb +0 -86
  485. data/lib/rex/proto/dcerpc/ndr.rb.ut.rb +0 -42
  486. data/lib/rex/proto/dcerpc/packet.rb.ut.rb +0 -57
  487. data/lib/rex/proto/dcerpc/response.rb.ut.rb +0 -16
  488. data/lib/rex/proto/dcerpc/uuid.rb.ut.rb +0 -47
  489. data/lib/rex/proto/drda.rb.ts.rb +0 -18
  490. data/lib/rex/proto/drda/constants.rb.ut.rb +0 -24
  491. data/lib/rex/proto/drda/packet.rb.ut.rb +0 -110
  492. data/lib/rex/proto/drda/utils.rb.ut.rb +0 -85
  493. data/lib/rex/proto/http.rb.ts.rb +0 -13
  494. data/lib/rex/proto/http/client.rb.ut.rb +0 -96
  495. data/lib/rex/proto/http/handler/erb.rb.ut.rb +0 -22
  496. data/lib/rex/proto/http/handler/erb.rb.ut.rb.rhtml +0 -1
  497. data/lib/rex/proto/http/handler/proc.rb.ut.rb +0 -25
  498. data/lib/rex/proto/http/header.rb.ut.rb +0 -47
  499. data/lib/rex/proto/http/packet.rb.ut.rb +0 -166
  500. data/lib/rex/proto/http/request.rb.ut.rb +0 -215
  501. data/lib/rex/proto/http/response.rb.ut.rb +0 -150
  502. data/lib/rex/proto/http/server.rb.ut.rb +0 -80
  503. data/lib/rex/proto/ntlm.rb.ut.rb +0 -181
  504. data/lib/rex/proto/rfb.rb.ut.rb +0 -40
  505. data/lib/rex/proto/smb.rb.ts.rb +0 -9
  506. data/lib/rex/proto/smb/client.rb.ut.rb +0 -224
  507. data/lib/rex/proto/smb/constants.rb.ut.rb +0 -19
  508. data/lib/rex/proto/smb/simpleclient.rb.ut.rb +0 -129
  509. data/lib/rex/proto/smb/utils.rb.ut.rb +0 -21
  510. data/lib/rex/proto/tftp/server.rb.ut.rb +0 -29
  511. data/lib/rex/service_manager.rb.ut.rb +0 -33
  512. data/lib/rex/socket.rb.ut.rb +0 -108
  513. data/lib/rex/socket/comm/local.rb.ut.rb +0 -76
  514. data/lib/rex/socket/parameters.rb.ut.rb +0 -52
  515. data/lib/rex/socket/range_walker.rb.ut.rb +0 -56
  516. data/lib/rex/socket/ssl_tcp.rb.ut.rb +0 -40
  517. data/lib/rex/socket/ssl_tcp_server.rb.ut.rb +0 -62
  518. data/lib/rex/socket/subnet_walker.rb.ut.rb +0 -29
  519. data/lib/rex/socket/switch_board.rb.ut.rb +0 -53
  520. data/lib/rex/socket/tcp.rb.ut.rb +0 -65
  521. data/lib/rex/socket/tcp_server.rb.ut.rb +0 -45
  522. data/lib/rex/socket/udp.rb.ut.rb +0 -45
  523. data/lib/rex/test.rb +0 -36
  524. data/lib/rex/text.rb.ut.rb +0 -193
  525. data/lib/rex/transformer.rb.ut.rb +0 -39
  526. data/lib/rex/ui/text/color.rb.ut.rb +0 -19
  527. data/lib/rex/ui/text/progress_tracker.rb.ut.rb +0 -35
  528. data/lib/rex/ui/text/table.rb.ut.rb +0 -56
@@ -11,10 +11,10 @@ module Exploitation
11
11
  module OpcodeDb
12
12
 
13
13
  module OpcodeResult # :nodoc:
14
- def initialize(hash)
15
- @hash = hash
16
- end
17
- attr_reader :hash
14
+ def initialize(hash)
15
+ @hash = hash
16
+ end
17
+ attr_reader :hash
18
18
  end
19
19
 
20
20
  ###
@@ -24,22 +24,22 @@ end
24
24
  ###
25
25
  module Cachable
26
26
 
27
- def create(hash) # :nodoc:
28
- @Cache = {} unless (@Cache)
29
- if (hash_key(hash) and @Cache[hash_key(hash)])
30
- @Cache[hash_key(hash)]
31
- else
32
- @Cache[hash_key(hash)] = self.new(hash)
33
- end
34
- end
27
+ def create(hash) # :nodoc:
28
+ @Cache = {} unless (@Cache)
29
+ if (hash_key(hash) and @Cache[hash_key(hash)])
30
+ @Cache[hash_key(hash)]
31
+ else
32
+ @Cache[hash_key(hash)] = self.new(hash)
33
+ end
34
+ end
35
35
 
36
- def hash_key(hash) # :nodoc:
37
- hash['id'] || nil
38
- end
36
+ def hash_key(hash) # :nodoc:
37
+ hash['id'] || nil
38
+ end
39
39
 
40
- def flush_cache # :nodoc:
41
- @Cache.clear
42
- end
40
+ def flush_cache # :nodoc:
41
+ @Cache.clear
42
+ end
43
43
 
44
44
  end
45
45
 
@@ -50,33 +50,33 @@ end
50
50
  #
51
51
  ###
52
52
  module DbEntry
53
- include OpcodeResult
54
-
55
- def initialize(hash)
56
- super
57
-
58
- @id = hash['id'].to_i
59
- @name = hash['name']
60
- end
61
-
62
- #
63
- # Fields that could possibly be filtered on for this database entry.
64
- #
65
- def filter_hash
66
- {
67
- "id" => id,
68
- "name" => name
69
- }
70
- end
71
-
72
- #
73
- # The unique server identifier.
74
- #
75
- attr_reader :id
76
- #
77
- # The unique name for this entry.
78
- #
79
- attr_reader :name
53
+ include OpcodeResult
54
+
55
+ def initialize(hash)
56
+ super
57
+
58
+ @id = hash['id'].to_i
59
+ @name = hash['name']
60
+ end
61
+
62
+ #
63
+ # Fields that could possibly be filtered on for this database entry.
64
+ #
65
+ def filter_hash
66
+ {
67
+ "id" => id,
68
+ "name" => name
69
+ }
70
+ end
71
+
72
+ #
73
+ # The unique server identifier.
74
+ #
75
+ attr_reader :id
76
+ #
77
+ # The unique name for this entry.
78
+ #
79
+ attr_reader :name
80
80
  end
81
81
 
82
82
  ###
@@ -86,195 +86,195 @@ end
86
86
  #
87
87
  ###
88
88
  class ImageModule
89
- include DbEntry
90
-
91
- ###
92
- #
93
- # This class contains information about a module-associated segment.
94
- #
95
- ###
96
- class Segment
97
- def initialize(hash)
98
- @type = hash['type']
99
- @base_address = hash['base_address'].to_i
100
- @size = hash['segment_size'].to_i
101
- @writable = hash['writable'] == "true" ? true : false
102
- @readable = hash['readable'] == "true" ? true : false
103
- @executable = hash['executable'] == "true" ? true : false
104
- end
105
-
106
- #
107
- # The type of the segment, such as ".text".
108
- #
109
- attr_reader :type
110
- #
111
- # The base address of the segment.
112
- #
113
- attr_reader :base_address
114
- #
115
- # The size of the segment in bytes.
116
- #
117
- attr_reader :size
118
- #
119
- # Boolean that indicates whether or not the segment is writable.
120
- #
121
- attr_reader :writable
122
- #
123
- # Boolean that indicates whether or not the segment is readable.
124
- #
125
- attr_reader :readable
126
- #
127
- # Boolean that indicates whether or not the segment is executable.
128
- #
129
- attr_reader :executable
130
- end
131
-
132
- ###
133
- #
134
- # This class contains information about a module-associated import.
135
- #
136
- ###
137
- class Import
138
- def initialize(hash)
139
- @name = hash['name']
140
- @address = hash['address'].to_i
141
- @ordinal = hash['ordinal'].to_i
142
- end
143
-
144
- #
145
- # The name of the imported function.
146
- #
147
- attr_reader :name
148
- #
149
- # The address of the function pointer in the IAT.
150
- #
151
- attr_reader :address
152
- #
153
- # The ordinal of the imported symbol.
154
- #
155
- attr_reader :ordinal
156
- end
157
-
158
- ###
159
- #
160
- # This class contains information about a module-associated export.
161
- #
162
- ###
163
- class Export
164
- def initialize(hash)
165
- @name = hash['name']
166
- @address = hash['address'].to_i
167
- @ordinal = hash['ordinal'].to_i
168
- end
169
-
170
- #
171
- # The name of the exported function.
172
- #
173
- attr_reader :name
174
- #
175
- # The address of the exported function.
176
- #
177
- attr_reader :address
178
- #
179
- # The ordinal of the exported symbol.
180
- #
181
- attr_reader :ordinal
182
- end
183
-
184
- class <<self
185
- include Cachable
186
- def hash_key(hash) # :nodoc:
187
- (hash['id'] || '') +
188
- (hash['segments'] || '').to_s +
189
- (hash['exports'] || '').to_s +
190
- (hash['imports'] || '').to_s
191
- end
192
- end
193
-
194
- def initialize(hash)
195
- super
196
-
197
- @locale = Locale.create(hash['locale'])
198
- @maj_maj_ver = hash['maj_maj_ver'].to_i
199
- @maj_min_ver = hash['maj_min_ver'].to_i
200
- @min_maj_ver = hash['min_maj_ver'].to_i
201
- @min_min_ver = hash['min_min_ver'].to_i
202
- @timestamp = Time.at(hash['timestamp'].to_i)
203
- @vendor = hash['vendor']
204
- @base_address = hash['base_address'].to_i
205
- @image_size = hash['image_size'].to_i
206
-
207
- @segments = hash['segments'].map { |ent|
208
- Segment.new(ent)
209
- } if (hash['segments'])
210
- @imports = hash['imports'].map { |ent|
211
- Import.new(ent)
212
- } if (hash['imports'])
213
- @exports = hash['exports'].map { |ent|
214
- Export.new(ent)
215
- } if (hash['exports'])
216
- @platforms = hash['platforms'].map { |ent|
217
- OsVersion.create(ent)
218
- } if (hash['platforms'])
219
-
220
- @segments = [] unless(@segments)
221
- @imports = [] unless(@imports)
222
- @exports = [] unless(@exports)
223
- @platforms = [] unless(@platforms)
224
- end
225
-
226
- #
227
- # An instance of a Locale class that is associated with this module.
228
- #
229
- attr_reader :locale
230
- #
231
- # The module's major major version number (X.x.x.x).
232
- #
233
- attr_reader :maj_maj_ver
234
- #
235
- # The module's major minor version number (x.X.x.x).
236
- #
237
- attr_reader :maj_min_ver
238
- #
239
- # The module's minor major version number (x.x.X.x).
240
- #
241
- attr_reader :min_maj_ver
242
- #
243
- # The module's minor minor version number (x.x.x.X).
244
- #
245
- attr_reader :min_min_ver
246
- #
247
- # The timestamp that the image was compiled (as a Time instance).
248
- #
249
- attr_reader :timestamp
250
- #
251
- # The vendor that created the module.
252
- #
253
- attr_reader :vendor
254
- #
255
- # The preferred base address at which the module will load.
256
- #
257
- attr_reader :base_address
258
- #
259
- # The size of the image mapping associated with the module in bytes.
260
- #
261
- attr_reader :image_size
262
- #
263
- # An array of Segment instances.
264
- #
265
- attr_reader :segments
266
- #
267
- # An array of Import instances.
268
- #
269
- attr_reader :imports
270
- #
271
- # An array of Export instances.
272
- #
273
- attr_reader :exports
274
- #
275
- # An array of OsVersion instances.
276
- #
277
- attr_reader :platforms
89
+ include DbEntry
90
+
91
+ ###
92
+ #
93
+ # This class contains information about a module-associated segment.
94
+ #
95
+ ###
96
+ class Segment
97
+ def initialize(hash)
98
+ @type = hash['type']
99
+ @base_address = hash['base_address'].to_i
100
+ @size = hash['segment_size'].to_i
101
+ @writable = hash['writable'] == "true" ? true : false
102
+ @readable = hash['readable'] == "true" ? true : false
103
+ @executable = hash['executable'] == "true" ? true : false
104
+ end
105
+
106
+ #
107
+ # The type of the segment, such as ".text".
108
+ #
109
+ attr_reader :type
110
+ #
111
+ # The base address of the segment.
112
+ #
113
+ attr_reader :base_address
114
+ #
115
+ # The size of the segment in bytes.
116
+ #
117
+ attr_reader :size
118
+ #
119
+ # Boolean that indicates whether or not the segment is writable.
120
+ #
121
+ attr_reader :writable
122
+ #
123
+ # Boolean that indicates whether or not the segment is readable.
124
+ #
125
+ attr_reader :readable
126
+ #
127
+ # Boolean that indicates whether or not the segment is executable.
128
+ #
129
+ attr_reader :executable
130
+ end
131
+
132
+ ###
133
+ #
134
+ # This class contains information about a module-associated import.
135
+ #
136
+ ###
137
+ class Import
138
+ def initialize(hash)
139
+ @name = hash['name']
140
+ @address = hash['address'].to_i
141
+ @ordinal = hash['ordinal'].to_i
142
+ end
143
+
144
+ #
145
+ # The name of the imported function.
146
+ #
147
+ attr_reader :name
148
+ #
149
+ # The address of the function pointer in the IAT.
150
+ #
151
+ attr_reader :address
152
+ #
153
+ # The ordinal of the imported symbol.
154
+ #
155
+ attr_reader :ordinal
156
+ end
157
+
158
+ ###
159
+ #
160
+ # This class contains information about a module-associated export.
161
+ #
162
+ ###
163
+ class Export
164
+ def initialize(hash)
165
+ @name = hash['name']
166
+ @address = hash['address'].to_i
167
+ @ordinal = hash['ordinal'].to_i
168
+ end
169
+
170
+ #
171
+ # The name of the exported function.
172
+ #
173
+ attr_reader :name
174
+ #
175
+ # The address of the exported function.
176
+ #
177
+ attr_reader :address
178
+ #
179
+ # The ordinal of the exported symbol.
180
+ #
181
+ attr_reader :ordinal
182
+ end
183
+
184
+ class <<self
185
+ include Cachable
186
+ def hash_key(hash) # :nodoc:
187
+ (hash['id'] || '') +
188
+ (hash['segments'] || '').to_s +
189
+ (hash['exports'] || '').to_s +
190
+ (hash['imports'] || '').to_s
191
+ end
192
+ end
193
+
194
+ def initialize(hash)
195
+ super
196
+
197
+ @locale = Locale.create(hash['locale'])
198
+ @maj_maj_ver = hash['maj_maj_ver'].to_i
199
+ @maj_min_ver = hash['maj_min_ver'].to_i
200
+ @min_maj_ver = hash['min_maj_ver'].to_i
201
+ @min_min_ver = hash['min_min_ver'].to_i
202
+ @timestamp = Time.at(hash['timestamp'].to_i)
203
+ @vendor = hash['vendor']
204
+ @base_address = hash['base_address'].to_i
205
+ @image_size = hash['image_size'].to_i
206
+
207
+ @segments = hash['segments'].map { |ent|
208
+ Segment.new(ent)
209
+ } if (hash['segments'])
210
+ @imports = hash['imports'].map { |ent|
211
+ Import.new(ent)
212
+ } if (hash['imports'])
213
+ @exports = hash['exports'].map { |ent|
214
+ Export.new(ent)
215
+ } if (hash['exports'])
216
+ @platforms = hash['platforms'].map { |ent|
217
+ OsVersion.create(ent)
218
+ } if (hash['platforms'])
219
+
220
+ @segments = [] unless(@segments)
221
+ @imports = [] unless(@imports)
222
+ @exports = [] unless(@exports)
223
+ @platforms = [] unless(@platforms)
224
+ end
225
+
226
+ #
227
+ # An instance of a Locale class that is associated with this module.
228
+ #
229
+ attr_reader :locale
230
+ #
231
+ # The module's major major version number (X.x.x.x).
232
+ #
233
+ attr_reader :maj_maj_ver
234
+ #
235
+ # The module's major minor version number (x.X.x.x).
236
+ #
237
+ attr_reader :maj_min_ver
238
+ #
239
+ # The module's minor major version number (x.x.X.x).
240
+ #
241
+ attr_reader :min_maj_ver
242
+ #
243
+ # The module's minor minor version number (x.x.x.X).
244
+ #
245
+ attr_reader :min_min_ver
246
+ #
247
+ # The timestamp that the image was compiled (as a Time instance).
248
+ #
249
+ attr_reader :timestamp
250
+ #
251
+ # The vendor that created the module.
252
+ #
253
+ attr_reader :vendor
254
+ #
255
+ # The preferred base address at which the module will load.
256
+ #
257
+ attr_reader :base_address
258
+ #
259
+ # The size of the image mapping associated with the module in bytes.
260
+ #
261
+ attr_reader :image_size
262
+ #
263
+ # An array of Segment instances.
264
+ #
265
+ attr_reader :segments
266
+ #
267
+ # An array of Import instances.
268
+ #
269
+ attr_reader :imports
270
+ #
271
+ # An array of Export instances.
272
+ #
273
+ attr_reader :exports
274
+ #
275
+ # An array of OsVersion instances.
276
+ #
277
+ attr_reader :platforms
278
278
  end
279
279
 
280
280
  ###
@@ -283,10 +283,10 @@ end
283
283
  #
284
284
  ###
285
285
  class Locale
286
- include DbEntry
287
- class <<self
288
- include Cachable
289
- end
286
+ include DbEntry
287
+ class <<self
288
+ include Cachable
289
+ end
290
290
  end
291
291
 
292
292
  ###
@@ -295,57 +295,57 @@ end
295
295
  #
296
296
  ###
297
297
  class OsVersion
298
- include DbEntry
299
-
300
- class <<self
301
- include Cachable
302
- def hash_key(hash)
303
- hash['id'] + (hash['modules'] || '')
304
- end
305
- end
306
-
307
- def initialize(hash)
308
- super
309
-
310
- @modules = (hash['modules']) ? hash['modules'].to_i : 0
311
- @desc = hash['desc']
312
- @arch = hash['arch']
313
- @maj_ver = hash['maj_ver'].to_i
314
- @min_ver = hash['min_ver'].to_i
315
- @maj_patch_level = hash['maj_patch_level'].to_i
316
- @min_patch_level = hash['min_patch_level'].to_i
317
- end
318
-
319
- #
320
- # The number of modules that exist in this operating system version.
321
- #
322
- attr_reader :modules
323
- #
324
- # The operating system version description, such as Windows XP 5.2.0.0
325
- # (IA32).
326
- #
327
- attr_reader :desc
328
- #
329
- # The architecture that the operating system version runs on, such as IA32.
330
- #
331
- attr_reader :arch
332
- #
333
- # The major version of the operating system version.
334
- #
335
- attr_reader :maj_ver
336
- #
337
- # The minor version of the operating system version.
338
- #
339
- attr_reader :min_ver
340
- #
341
- # The major patch level of the operating system version, such as a service
342
- # pack.
343
- #
344
- attr_reader :maj_patch_level
345
- #
346
- # The minor patch level of the operating system version.
347
- #
348
- attr_reader :min_patch_level
298
+ include DbEntry
299
+
300
+ class <<self
301
+ include Cachable
302
+ def hash_key(hash)
303
+ hash['id'] + (hash['modules'] || '')
304
+ end
305
+ end
306
+
307
+ def initialize(hash)
308
+ super
309
+
310
+ @modules = (hash['modules']) ? hash['modules'].to_i : 0
311
+ @desc = hash['desc']
312
+ @arch = hash['arch']
313
+ @maj_ver = hash['maj_ver'].to_i
314
+ @min_ver = hash['min_ver'].to_i
315
+ @maj_patch_level = hash['maj_patch_level'].to_i
316
+ @min_patch_level = hash['min_patch_level'].to_i
317
+ end
318
+
319
+ #
320
+ # The number of modules that exist in this operating system version.
321
+ #
322
+ attr_reader :modules
323
+ #
324
+ # The operating system version description, such as Windows XP 5.2.0.0
325
+ # (IA32).
326
+ #
327
+ attr_reader :desc
328
+ #
329
+ # The architecture that the operating system version runs on, such as IA32.
330
+ #
331
+ attr_reader :arch
332
+ #
333
+ # The major version of the operating system version.
334
+ #
335
+ attr_reader :maj_ver
336
+ #
337
+ # The minor version of the operating system version.
338
+ #
339
+ attr_reader :min_ver
340
+ #
341
+ # The major patch level of the operating system version, such as a service
342
+ # pack.
343
+ #
344
+ attr_reader :maj_patch_level
345
+ #
346
+ # The minor patch level of the operating system version.
347
+ #
348
+ attr_reader :min_patch_level
349
349
  end
350
350
 
351
351
  ###
@@ -354,10 +354,10 @@ end
354
354
  #
355
355
  ###
356
356
  class Group
357
- include DbEntry
358
- class <<self
359
- include Cachable
360
- end
357
+ include DbEntry
358
+ class <<self
359
+ include Cachable
360
+ end
361
361
  end
362
362
 
363
363
  ###
@@ -366,38 +366,38 @@ end
366
366
  #
367
367
  ###
368
368
  class Type
369
- include DbEntry
370
-
371
- class <<self
372
- include Cachable
373
- end
374
-
375
- def initialize(hash)
376
- super
377
-
378
- @opcodes = (hash['opcodes']) ? hash['opcodes'].to_i : 0
379
- @meta_type = MetaType.create(hash['meta_type']) if (hash['meta_type'])
380
- @group = Group.create(hash['group']) if (hash['group'])
381
- @arch = hash['arch']
382
- end
383
-
384
- #
385
- # The number of opcodes associated with this type, or 0 if this information
386
- # is not available.
387
- #
388
- attr_reader :opcodes
389
- #
390
- # An instance of the MetaType to which this opcode type belongs, or nil.
391
- #
392
- attr_reader :meta_type
393
- #
394
- # An instance of the Group to which this opcode type belongs, or nil.
395
- #
396
- attr_reader :group
397
- #
398
- # The architecture that this opcode type is associated with.
399
- #
400
- attr_reader :arch
369
+ include DbEntry
370
+
371
+ class <<self
372
+ include Cachable
373
+ end
374
+
375
+ def initialize(hash)
376
+ super
377
+
378
+ @opcodes = (hash['opcodes']) ? hash['opcodes'].to_i : 0
379
+ @meta_type = MetaType.create(hash['meta_type']) if (hash['meta_type'])
380
+ @group = Group.create(hash['group']) if (hash['group'])
381
+ @arch = hash['arch']
382
+ end
383
+
384
+ #
385
+ # The number of opcodes associated with this type, or 0 if this information
386
+ # is not available.
387
+ #
388
+ attr_reader :opcodes
389
+ #
390
+ # An instance of the MetaType to which this opcode type belongs, or nil.
391
+ #
392
+ attr_reader :meta_type
393
+ #
394
+ # An instance of the Group to which this opcode type belongs, or nil.
395
+ #
396
+ attr_reader :group
397
+ #
398
+ # The architecture that this opcode type is associated with.
399
+ #
400
+ attr_reader :arch
401
401
  end
402
402
 
403
403
  ###
@@ -406,10 +406,10 @@ end
406
406
  #
407
407
  ###
408
408
  class MetaType
409
- include DbEntry
410
- class <<self
411
- include Cachable
412
- end
409
+ include DbEntry
410
+ class <<self
411
+ include Cachable
412
+ end
413
413
  end
414
414
 
415
415
  ###
@@ -419,40 +419,40 @@ end
419
419
  #
420
420
  ###
421
421
  class Opcode
422
- include DbEntry
423
-
424
- def initialize(hash)
425
- super
426
-
427
- @address = hash['address'].to_i
428
- @type = Type.create(hash['type'])
429
- @group = @type.group
430
- @modules = hash['modules'].map { |ent|
431
- ImageModule.create(ent)
432
- } if (hash['modules'])
433
-
434
- @modules = [] unless(@modules)
435
- end
436
-
437
- #
438
- # The address of the opcode.
439
- #
440
- attr_reader :address
441
- #
442
- # The type of the opcode indicating which instruction is found at the
443
- # address. This is an instance of the Type class.
444
- #
445
- attr_reader :type
446
- #
447
- # A Group instance that reflects the group to which the opcode type found
448
- # at the instance's address belongs.
449
- #
450
- attr_reader :group
451
- #
452
- # An array of ImageModule instances that show the modules that contain this
453
- # address.
454
- #
455
- attr_reader :modules
422
+ include DbEntry
423
+
424
+ def initialize(hash)
425
+ super
426
+
427
+ @address = hash['address'].to_i
428
+ @type = Type.create(hash['type'])
429
+ @group = @type.group
430
+ @modules = hash['modules'].map { |ent|
431
+ ImageModule.create(ent)
432
+ } if (hash['modules'])
433
+
434
+ @modules = [] unless(@modules)
435
+ end
436
+
437
+ #
438
+ # The address of the opcode.
439
+ #
440
+ attr_reader :address
441
+ #
442
+ # The type of the opcode indicating which instruction is found at the
443
+ # address. This is an instance of the Type class.
444
+ #
445
+ attr_reader :type
446
+ #
447
+ # A Group instance that reflects the group to which the opcode type found
448
+ # at the instance's address belongs.
449
+ #
450
+ attr_reader :group
451
+ #
452
+ # An array of ImageModule instances that show the modules that contain this
453
+ # address.
454
+ #
455
+ attr_reader :modules
456
456
  end
457
457
 
458
458
  ###
@@ -461,54 +461,54 @@ end
461
461
  #
462
462
  ###
463
463
  class Statistics
464
- def initialize(hash)
465
- @modules = hash['modules'].to_i
466
- @opcodes = hash['opcodes'].to_i
467
- @opcode_types = hash['opcode_types'].to_i
468
- @platforms = hash['platforms'].to_i
469
- @architectures = hash['architectures'].to_i
470
- @module_segments = hash['module_segments'].to_i
471
- @module_imports = hash['module_imports'].to_i
472
- @module_exports = hash['module_exports'].to_i
473
- @last_update = Time.at(hash['last_update'].to_i)
474
- end
475
-
476
- #
477
- # The number of modules found within the opcode database.
478
- #
479
- attr_reader :modules
480
- #
481
- # The number of opcodes supported by the opcode database.
482
- #
483
- attr_reader :opcodes
484
- #
485
- # The number of opcode types supported by the database.
486
- #
487
- attr_reader :opcode_types
488
- #
489
- # The number of platforms supported by the database.
490
- #
491
- attr_reader :platforms
492
- #
493
- # The number of architectures supported by the database.
494
- #
495
- attr_reader :architectures
496
- #
497
- # The number of module segments supported by the database.
498
- #
499
- attr_reader :module_segments
500
- #
501
- # The number of module imports supported by the database.
502
- #
503
- attr_reader :module_imports
504
- #
505
- # The number of module exports supported by the database.
506
- #
507
- attr_reader :module_exports
508
- #
509
- # The time at which the last database update occurred.
510
- #
511
- attr_reader :last_update
464
+ def initialize(hash)
465
+ @modules = hash['modules'].to_i
466
+ @opcodes = hash['opcodes'].to_i
467
+ @opcode_types = hash['opcode_types'].to_i
468
+ @platforms = hash['platforms'].to_i
469
+ @architectures = hash['architectures'].to_i
470
+ @module_segments = hash['module_segments'].to_i
471
+ @module_imports = hash['module_imports'].to_i
472
+ @module_exports = hash['module_exports'].to_i
473
+ @last_update = Time.at(hash['last_update'].to_i)
474
+ end
475
+
476
+ #
477
+ # The number of modules found within the opcode database.
478
+ #
479
+ attr_reader :modules
480
+ #
481
+ # The number of opcodes supported by the opcode database.
482
+ #
483
+ attr_reader :opcodes
484
+ #
485
+ # The number of opcode types supported by the database.
486
+ #
487
+ attr_reader :opcode_types
488
+ #
489
+ # The number of platforms supported by the database.
490
+ #
491
+ attr_reader :platforms
492
+ #
493
+ # The number of architectures supported by the database.
494
+ #
495
+ attr_reader :architectures
496
+ #
497
+ # The number of module segments supported by the database.
498
+ #
499
+ attr_reader :module_segments
500
+ #
501
+ # The number of module imports supported by the database.
502
+ #
503
+ attr_reader :module_imports
504
+ #
505
+ # The number of module exports supported by the database.
506
+ #
507
+ attr_reader :module_exports
508
+ #
509
+ # The time at which the last database update occurred.
510
+ #
511
+ attr_reader :last_update
512
512
  end
513
513
 
514
514
  ###
@@ -520,297 +520,297 @@ end
520
520
  ###
521
521
  class Client
522
522
 
523
- DefaultServerHost = "www.metasploit.com"
524
- DefaultServerPort = 80
525
- DefaultServerUri = "/users/opcode/msfopcode_server.cgi"
526
-
527
- #
528
- # Returns an instance of an initialized client that will use the supplied
529
- # server values.
530
- #
531
- def initialize(host = DefaultServerHost, port = DefaultServerPort, uri = DefaultServerUri)
532
- self.server_host = host
533
- self.server_port = port
534
- self.server_uri = uri
535
- end
536
-
537
- #
538
- # Disables response parsing.
539
- #
540
- def disable_parse
541
- @disable_parse = true
542
- end
543
-
544
- #
545
- # Enables response parsing.
546
- #
547
- def enable_parse
548
- @disable_parse = false
549
- end
550
-
551
- #
552
- # Returns an array of MetaType instances.
553
- #
554
- def meta_types
555
- request('meta_types').map { |ent| MetaType.create(ent) }
556
- end
557
-
558
- #
559
- # Returns an array of Group instances.
560
- #
561
- def groups
562
- request('groups').map { |ent| Group.create(ent) }
563
- end
564
-
565
- #
566
- # Returns an array of Type instances. Opcode types are specific opcodes,
567
- # such as a jmp esp. Optionally, a filter hash can be passed to include
568
- # extra information in the results.
569
- #
570
- # Statistics (Bool)
571
- #
572
- # If this hash element is set to true, the number of opcodes currently in
573
- # the database of this type will be returned.
574
- #
575
- def types(filter = {})
576
- request('types', filter).map { |ent| Type.create(ent) }
577
- end
578
-
579
- #
580
- # Returns an array of OsVersion instances. OS versions are associated with
581
- # a particular operating system release (including service packs).
582
- # Optionally, a filter hash can be passed to limit the number of results
583
- # returned. If no filter hash is supplied, all results are returned.
584
- #
585
- # Names (Array)
586
- #
587
- # If this hash element is specified, only the operating systems that
588
- # contain one or more of the names specified will be returned.
589
- #
590
- # Statistics (Bool)
591
- #
592
- # If this hash element is set to true, the number of modules associated
593
- # with this matched operating system versions will be returned.
594
- #
595
- def platforms(filter = {})
596
- request('platforms', filter).map { |ent| OsVersion.create(ent) }
597
- end
598
-
599
- #
600
- # Returns an array of ImageModule instances. Image modules are
601
- # version-specific, locale-specific, and operating system version specific
602
- # image files. Modules have opcodes, segments, imports and exports
603
- # associated with them. Optionally, a filter hash can be specified to
604
- # limit the number of results returned from the database. If no filter
605
- # hash is supplied, all modules will be returned.
606
- #
607
- # LocaleNames (Array)
608
- #
609
- # This hash element limits results to one or more specific locale by name.
610
- #
611
- # PlatformNames (Array)
612
- #
613
- # This hash element limits results to one or more specific platform by
614
- # name.
615
- #
616
- # ModuleNames (Array)
617
- #
618
- # This hash element limits results to one or more specific module by name.
619
- #
620
- # Segments (Bool)
621
- #
622
- # If this hash element is set to true, the segments associated with each
623
- # resulting module will be returned by the server.
624
- #
625
- # Imports (Bool)
626
- #
627
- # If this hash element is set to true, the imports associated with each
628
- # resulting module will be returned by the server.
629
- #
630
- # Exports (Bool)
631
- #
632
- # If this hash element is set to true, the exports associated with each
633
- # resulting module will be returned by the server.
634
- #
635
- def modules(filter = {})
636
- request('modules', filter).map { |ent| ImageModule.create(ent) }
637
- end
638
-
639
- #
640
- # Returns an array of Locale instances that are supported by the server.
641
- #
642
- def locales
643
- request('locales').map { |ent| Locale.create(ent) }
644
- end
645
-
646
- #
647
- # Returns an array of Opcode instances that match the filter limitations
648
- # specified in the supplied filter hash. If no filter hash is specified,
649
- # all opcodes will be returned (but are most likely going to be limited by
650
- # the server). The filter hash limiters that can be specified are:
651
- #
652
- # ModuleNames (Array)
653
- #
654
- # This hash element limits results to one or more specific modules by
655
- # name.
656
- #
657
- # GroupNames (Array)
658
- #
659
- # This hash element limits results to one or more specific opcode group by
660
- # name.
661
- #
662
- # TypeNames (Array)
663
- #
664
- # This hash element limits results to one or more specific opcode type by
665
- # name.
666
- #
667
- # MetaTypeNames (Array)
668
- #
669
- # This hash element limits results to one or more specific opcode meta
670
- # type by name.
671
- #
672
- # LocaleNames (Array)
673
- #
674
- # Limits results to one or more specific locale by name.
675
- #
676
- # PlatformNames (Array)
677
- #
678
- # Limits reslts to one or more specific operating system version by name.
679
- #
680
- # Addresses (Array)
681
- #
682
- # Limits results to a specific set of addresses.
683
- #
684
- # Portable (Bool)
685
- #
686
- # If this hash element is true, opcode results will be limited to ones
687
- # that span more than one operating system version.
688
- #
689
- def search(filter = {})
690
- request('search', filter).map { |ent| Opcode.new(ent) }
691
- end
692
-
693
- #
694
- # Returns an instance of the Statistics class that holds information about
695
- # the server's database stats.
696
- #
697
- def statistics
698
- Statistics.new(request('statistics'))
699
- end
700
-
701
- #
702
- # These attributes convey information about the remote server and can be
703
- # changed in order to point it to a locate copy as necessary.
704
- #
705
- attr_accessor :server_host, :server_port, :server_uri
706
-
707
- #
708
- # Retrieves the last raw XML response to be processed.
709
- #
710
- attr_reader :last_xml
523
+ DefaultServerHost = "www.metasploit.com"
524
+ DefaultServerPort = 80
525
+ DefaultServerUri = "/users/opcode/msfopcode_server.cgi"
526
+
527
+ #
528
+ # Returns an instance of an initialized client that will use the supplied
529
+ # server values.
530
+ #
531
+ def initialize(host = DefaultServerHost, port = DefaultServerPort, uri = DefaultServerUri)
532
+ self.server_host = host
533
+ self.server_port = port
534
+ self.server_uri = uri
535
+ end
536
+
537
+ #
538
+ # Disables response parsing.
539
+ #
540
+ def disable_parse
541
+ @disable_parse = true
542
+ end
543
+
544
+ #
545
+ # Enables response parsing.
546
+ #
547
+ def enable_parse
548
+ @disable_parse = false
549
+ end
550
+
551
+ #
552
+ # Returns an array of MetaType instances.
553
+ #
554
+ def meta_types
555
+ request('meta_types').map { |ent| MetaType.create(ent) }
556
+ end
557
+
558
+ #
559
+ # Returns an array of Group instances.
560
+ #
561
+ def groups
562
+ request('groups').map { |ent| Group.create(ent) }
563
+ end
564
+
565
+ #
566
+ # Returns an array of Type instances. Opcode types are specific opcodes,
567
+ # such as a jmp esp. Optionally, a filter hash can be passed to include
568
+ # extra information in the results.
569
+ #
570
+ # Statistics (Bool)
571
+ #
572
+ # If this hash element is set to true, the number of opcodes currently in
573
+ # the database of this type will be returned.
574
+ #
575
+ def types(filter = {})
576
+ request('types', filter).map { |ent| Type.create(ent) }
577
+ end
578
+
579
+ #
580
+ # Returns an array of OsVersion instances. OS versions are associated with
581
+ # a particular operating system release (including service packs).
582
+ # Optionally, a filter hash can be passed to limit the number of results
583
+ # returned. If no filter hash is supplied, all results are returned.
584
+ #
585
+ # Names (Array)
586
+ #
587
+ # If this hash element is specified, only the operating systems that
588
+ # contain one or more of the names specified will be returned.
589
+ #
590
+ # Statistics (Bool)
591
+ #
592
+ # If this hash element is set to true, the number of modules associated
593
+ # with this matched operating system versions will be returned.
594
+ #
595
+ def platforms(filter = {})
596
+ request('platforms', filter).map { |ent| OsVersion.create(ent) }
597
+ end
598
+
599
+ #
600
+ # Returns an array of ImageModule instances. Image modules are
601
+ # version-specific, locale-specific, and operating system version specific
602
+ # image files. Modules have opcodes, segments, imports and exports
603
+ # associated with them. Optionally, a filter hash can be specified to
604
+ # limit the number of results returned from the database. If no filter
605
+ # hash is supplied, all modules will be returned.
606
+ #
607
+ # LocaleNames (Array)
608
+ #
609
+ # This hash element limits results to one or more specific locale by name.
610
+ #
611
+ # PlatformNames (Array)
612
+ #
613
+ # This hash element limits results to one or more specific platform by
614
+ # name.
615
+ #
616
+ # ModuleNames (Array)
617
+ #
618
+ # This hash element limits results to one or more specific module by name.
619
+ #
620
+ # Segments (Bool)
621
+ #
622
+ # If this hash element is set to true, the segments associated with each
623
+ # resulting module will be returned by the server.
624
+ #
625
+ # Imports (Bool)
626
+ #
627
+ # If this hash element is set to true, the imports associated with each
628
+ # resulting module will be returned by the server.
629
+ #
630
+ # Exports (Bool)
631
+ #
632
+ # If this hash element is set to true, the exports associated with each
633
+ # resulting module will be returned by the server.
634
+ #
635
+ def modules(filter = {})
636
+ request('modules', filter).map { |ent| ImageModule.create(ent) }
637
+ end
638
+
639
+ #
640
+ # Returns an array of Locale instances that are supported by the server.
641
+ #
642
+ def locales
643
+ request('locales').map { |ent| Locale.create(ent) }
644
+ end
645
+
646
+ #
647
+ # Returns an array of Opcode instances that match the filter limitations
648
+ # specified in the supplied filter hash. If no filter hash is specified,
649
+ # all opcodes will be returned (but are most likely going to be limited by
650
+ # the server). The filter hash limiters that can be specified are:
651
+ #
652
+ # ModuleNames (Array)
653
+ #
654
+ # This hash element limits results to one or more specific modules by
655
+ # name.
656
+ #
657
+ # GroupNames (Array)
658
+ #
659
+ # This hash element limits results to one or more specific opcode group by
660
+ # name.
661
+ #
662
+ # TypeNames (Array)
663
+ #
664
+ # This hash element limits results to one or more specific opcode type by
665
+ # name.
666
+ #
667
+ # MetaTypeNames (Array)
668
+ #
669
+ # This hash element limits results to one or more specific opcode meta
670
+ # type by name.
671
+ #
672
+ # LocaleNames (Array)
673
+ #
674
+ # Limits results to one or more specific locale by name.
675
+ #
676
+ # PlatformNames (Array)
677
+ #
678
+ # Limits reslts to one or more specific operating system version by name.
679
+ #
680
+ # Addresses (Array)
681
+ #
682
+ # Limits results to a specific set of addresses.
683
+ #
684
+ # Portable (Bool)
685
+ #
686
+ # If this hash element is true, opcode results will be limited to ones
687
+ # that span more than one operating system version.
688
+ #
689
+ def search(filter = {})
690
+ request('search', filter).map { |ent| Opcode.new(ent) }
691
+ end
692
+
693
+ #
694
+ # Returns an instance of the Statistics class that holds information about
695
+ # the server's database stats.
696
+ #
697
+ def statistics
698
+ Statistics.new(request('statistics'))
699
+ end
700
+
701
+ #
702
+ # These attributes convey information about the remote server and can be
703
+ # changed in order to point it to a locate copy as necessary.
704
+ #
705
+ attr_accessor :server_host, :server_port, :server_uri
706
+
707
+ #
708
+ # Retrieves the last raw XML response to be processed.
709
+ #
710
+ attr_reader :last_xml
711
711
 
712
712
  protected
713
713
 
714
- #
715
- # Transmits a request to the Opcode database server and translates the
716
- # response into a native general ruby datatype.
717
- #
718
- def request(method, opts = {})
719
- client = Rex::Proto::Http::Client.new(server_host, server_port)
720
-
721
- begin
722
-
723
- # Create the CGI parameter list
724
- vars = { 'method' => method }
725
-
726
- opts.each_pair do |k, v|
727
- vars[k] = xlate_param(v)
728
- end
729
-
730
- client.set_config('uri_encode_mode' => 'none')
731
-
732
- # Initialize the request with the POST body.
733
- request = client.request_cgi(
734
- 'method' => 'POST',
735
- 'uri' => server_uri,
736
- 'vars_post' => vars
737
- )
738
-
739
- # Send the request and grab the response.
740
- response = client.send_recv(request, 300)
741
-
742
- # Non-200 return code?
743
- if (response.code != 200)
744
- raise RuntimeError, "Invalid response received from server."
745
- end
746
-
747
- # Convert the return value to the native type.
748
- parse_response(response.body)
749
- rescue ::SocketError
750
- raise RuntimeError, "Could not communicate with the opcode service: #{$!.class} #{$!}"
751
- ensure
752
- client.close
753
- end
754
- end
755
-
756
- #
757
- # Translates a parameter into a flat CGI parameter string.
758
- #
759
- def xlate_param(v)
760
- if (v.kind_of?(Array))
761
- v.map { |ent|
762
- xlate_param(ent)
763
- }.join(',,')
764
- elsif (v.kind_of?(Hash))
765
- v.map { |k,v|
766
- "#{URI.escape(k)}:#{xlate_param(v)}" if (v)
767
- }.join(',,')
768
- else
769
- URI.escape(v.to_s)
770
- end
771
- end
772
-
773
- #
774
- # Translate the data type from a flat string to a ruby native type.
775
- #
776
- def parse_response(xml)
777
- @last_xml = xml
778
-
779
- if (!@disable_parse)
780
- source = REXML::Source.new(xml)
781
- doc = REXML::Document.new
782
-
783
- REXML::Parsers::TreeParser.new(source, doc).parse
784
-
785
- translate_element(doc.root)
786
- end
787
- end
788
-
789
- #
790
- # Translate elements conveyed as data types.
791
- #
792
- def translate_element(element)
793
- case element.name
794
- when "Array"
795
- return element.elements.map { |child| translate_element(child) }
796
- when "Hash"
797
- hsh = {}
798
-
799
- element.each_element { |child|
800
- if (e = child.elements[1])
801
- v = translate_element(e)
802
- else
803
- v = child.text
804
- end
805
-
806
- hsh[child.attributes['name']] = v
807
- }
808
-
809
- return hsh
810
- else
811
- return element.text
812
- end
813
- end
714
+ #
715
+ # Transmits a request to the Opcode database server and translates the
716
+ # response into a native general ruby datatype.
717
+ #
718
+ def request(method, opts = {})
719
+ client = Rex::Proto::Http::Client.new(server_host, server_port)
720
+
721
+ begin
722
+
723
+ # Create the CGI parameter list
724
+ vars = { 'method' => method }
725
+
726
+ opts.each_pair do |k, v|
727
+ vars[k] = xlate_param(v)
728
+ end
729
+
730
+ client.set_config('uri_encode_mode' => 'none')
731
+
732
+ # Initialize the request with the POST body.
733
+ request = client.request_cgi(
734
+ 'method' => 'POST',
735
+ 'uri' => server_uri,
736
+ 'vars_post' => vars
737
+ )
738
+
739
+ # Send the request and grab the response.
740
+ response = client.send_recv(request, 300)
741
+
742
+ # Non-200 return code?
743
+ if (response.code != 200)
744
+ raise RuntimeError, "Invalid response received from server."
745
+ end
746
+
747
+ # Convert the return value to the native type.
748
+ parse_response(response.body)
749
+ rescue ::SocketError
750
+ raise RuntimeError, "Could not communicate with the opcode service: #{$!.class} #{$!}"
751
+ ensure
752
+ client.close
753
+ end
754
+ end
755
+
756
+ #
757
+ # Translates a parameter into a flat CGI parameter string.
758
+ #
759
+ def xlate_param(v)
760
+ if (v.kind_of?(Array))
761
+ v.map { |ent|
762
+ xlate_param(ent)
763
+ }.join(',,')
764
+ elsif (v.kind_of?(Hash))
765
+ v.map { |k,v|
766
+ "#{URI.escape(k)}:#{xlate_param(v)}" if (v)
767
+ }.join(',,')
768
+ else
769
+ URI.escape(v.to_s)
770
+ end
771
+ end
772
+
773
+ #
774
+ # Translate the data type from a flat string to a ruby native type.
775
+ #
776
+ def parse_response(xml)
777
+ @last_xml = xml
778
+
779
+ if (!@disable_parse)
780
+ source = REXML::Source.new(xml)
781
+ doc = REXML::Document.new
782
+
783
+ REXML::Parsers::TreeParser.new(source, doc).parse
784
+
785
+ translate_element(doc.root)
786
+ end
787
+ end
788
+
789
+ #
790
+ # Translate elements conveyed as data types.
791
+ #
792
+ def translate_element(element)
793
+ case element.name
794
+ when "Array"
795
+ return element.elements.map { |child| translate_element(child) }
796
+ when "Hash"
797
+ hsh = {}
798
+
799
+ element.each_element { |child|
800
+ if (e = child.elements[1])
801
+ v = translate_element(e)
802
+ else
803
+ v = child.text
804
+ end
805
+
806
+ hsh[child.attributes['name']] = v
807
+ }
808
+
809
+ return hsh
810
+ else
811
+ return element.text
812
+ end
813
+ end
814
814
 
815
815
  end
816
816