librex 0.0.20 → 0.0.21

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 (435) hide show
  1. data/Rakefile +1 -0
  2. data/lib/rex/LICENSE +29 -0
  3. data/lib/rex/arch.rb +103 -0
  4. data/lib/rex/arch/sparc.rb +75 -0
  5. data/lib/rex/arch/sparc.rb.ut.rb +18 -0
  6. data/lib/rex/arch/x86.rb +513 -0
  7. data/lib/rex/arch/x86.rb.ut.rb +93 -0
  8. data/lib/rex/assembly/nasm.rb +104 -0
  9. data/lib/rex/assembly/nasm.rb.ut.rb +22 -0
  10. data/lib/rex/codepage.map +104 -0
  11. data/lib/rex/compat.rb +311 -0
  12. data/lib/rex/constants.rb +113 -0
  13. data/lib/rex/elfparsey.rb +11 -0
  14. data/lib/rex/elfparsey/elf.rb +123 -0
  15. data/lib/rex/elfparsey/elfbase.rb +258 -0
  16. data/lib/rex/elfparsey/exceptions.rb +27 -0
  17. data/lib/rex/elfscan.rb +12 -0
  18. data/lib/rex/elfscan/scanner.rb +207 -0
  19. data/lib/rex/elfscan/search.rb +46 -0
  20. data/lib/rex/encoder/alpha2.rb +31 -0
  21. data/lib/rex/encoder/alpha2/alpha_mixed.rb +68 -0
  22. data/lib/rex/encoder/alpha2/alpha_upper.rb +79 -0
  23. data/lib/rex/encoder/alpha2/generic.rb +114 -0
  24. data/lib/rex/encoder/alpha2/unicode_mixed.rb +117 -0
  25. data/lib/rex/encoder/alpha2/unicode_upper.rb +129 -0
  26. data/lib/rex/encoder/ndr.rb +89 -0
  27. data/lib/rex/encoder/ndr.rb.ut.rb +44 -0
  28. data/lib/rex/encoder/nonalpha.rb +61 -0
  29. data/lib/rex/encoder/nonupper.rb +64 -0
  30. data/lib/rex/encoder/xdr.rb +106 -0
  31. data/lib/rex/encoder/xdr.rb.ut.rb +29 -0
  32. data/lib/rex/encoder/xor.rb +69 -0
  33. data/lib/rex/encoder/xor/dword.rb +13 -0
  34. data/lib/rex/encoder/xor/dword_additive.rb +13 -0
  35. data/lib/rex/encoders/xor_dword.rb +35 -0
  36. data/lib/rex/encoders/xor_dword_additive.rb +53 -0
  37. data/lib/rex/encoders/xor_dword_additive.rb.ut.rb +12 -0
  38. data/lib/rex/encoding/xor.rb +20 -0
  39. data/lib/rex/encoding/xor.rb.ts.rb +14 -0
  40. data/lib/rex/encoding/xor/byte.rb +15 -0
  41. data/lib/rex/encoding/xor/byte.rb.ut.rb +21 -0
  42. data/lib/rex/encoding/xor/dword.rb +21 -0
  43. data/lib/rex/encoding/xor/dword.rb.ut.rb +15 -0
  44. data/lib/rex/encoding/xor/dword_additive.rb +92 -0
  45. data/lib/rex/encoding/xor/dword_additive.rb.ut.rb +15 -0
  46. data/lib/rex/encoding/xor/exceptions.rb +17 -0
  47. data/lib/rex/encoding/xor/generic.rb +146 -0
  48. data/lib/rex/encoding/xor/generic.rb.ut.rb +120 -0
  49. data/lib/rex/encoding/xor/qword.rb +15 -0
  50. data/lib/rex/encoding/xor/word.rb +21 -0
  51. data/lib/rex/encoding/xor/word.rb.ut.rb +13 -0
  52. data/lib/rex/exceptions.rb +275 -0
  53. data/lib/rex/exceptions.rb.ut.rb +44 -0
  54. data/lib/rex/exploitation/cmdstager.rb +9 -0
  55. data/lib/rex/exploitation/cmdstager/base.rb +175 -0
  56. data/lib/rex/exploitation/cmdstager/debug_asm.rb +142 -0
  57. data/lib/rex/exploitation/cmdstager/debug_write.rb +136 -0
  58. data/lib/rex/exploitation/cmdstager/tftp.rb +63 -0
  59. data/lib/rex/exploitation/cmdstager/vbs.rb +128 -0
  60. data/lib/rex/exploitation/egghunter.rb +277 -0
  61. data/lib/rex/exploitation/egghunter.rb.ut.rb +25 -0
  62. data/lib/rex/exploitation/encryptjs.rb +77 -0
  63. data/lib/rex/exploitation/heaplib.js.b64 +331 -0
  64. data/lib/rex/exploitation/heaplib.rb +94 -0
  65. data/lib/rex/exploitation/javascriptosdetect.rb +897 -0
  66. data/lib/rex/exploitation/obfuscatejs.rb +335 -0
  67. data/lib/rex/exploitation/omelet.rb +320 -0
  68. data/lib/rex/exploitation/omelet.rb.ut.rb +13 -0
  69. data/lib/rex/exploitation/opcodedb.rb +818 -0
  70. data/lib/rex/exploitation/opcodedb.rb.ut.rb +279 -0
  71. data/lib/rex/exploitation/seh.rb +92 -0
  72. data/lib/rex/exploitation/seh.rb.ut.rb +19 -0
  73. data/lib/rex/file.rb +112 -0
  74. data/lib/rex/file.rb.ut.rb +16 -0
  75. data/lib/rex/image_source.rb +12 -0
  76. data/lib/rex/image_source/disk.rb +60 -0
  77. data/lib/rex/image_source/image_source.rb +46 -0
  78. data/lib/rex/image_source/memory.rb +37 -0
  79. data/lib/rex/io/bidirectional_pipe.rb +157 -0
  80. data/lib/rex/io/datagram_abstraction.rb +35 -0
  81. data/lib/rex/io/ring_buffer.rb +364 -0
  82. data/lib/rex/io/stream.rb +319 -0
  83. data/lib/rex/io/stream_abstraction.rb +197 -0
  84. data/lib/rex/io/stream_server.rb +211 -0
  85. data/lib/rex/job_container.rb +187 -0
  86. data/lib/rex/logging.rb +4 -0
  87. data/lib/rex/logging/log_dispatcher.rb +179 -0
  88. data/lib/rex/logging/log_sink.rb +42 -0
  89. data/lib/rex/logging/sinks/flatfile.rb +55 -0
  90. data/lib/rex/logging/sinks/stderr.rb +43 -0
  91. data/lib/rex/machparsey.rb +9 -0
  92. data/lib/rex/machparsey/exceptions.rb +34 -0
  93. data/lib/rex/machparsey/mach.rb +209 -0
  94. data/lib/rex/machparsey/machbase.rb +408 -0
  95. data/lib/rex/machscan.rb +9 -0
  96. data/lib/rex/machscan/scanner.rb +217 -0
  97. data/lib/rex/mime.rb +9 -0
  98. data/lib/rex/mime/header.rb +77 -0
  99. data/lib/rex/mime/message.rb +144 -0
  100. data/lib/rex/mime/part.rb +20 -0
  101. data/lib/rex/nop/opty2.rb +108 -0
  102. data/lib/rex/nop/opty2.rb.ut.rb +23 -0
  103. data/lib/rex/nop/opty2_tables.rb +300 -0
  104. data/lib/rex/ole.rb +205 -0
  105. data/lib/rex/ole/clsid.rb +47 -0
  106. data/lib/rex/ole/difat.rb +141 -0
  107. data/lib/rex/ole/directory.rb +231 -0
  108. data/lib/rex/ole/direntry.rb +240 -0
  109. data/lib/rex/ole/docs/dependencies.txt +8 -0
  110. data/lib/rex/ole/docs/references.txt +1 -0
  111. data/lib/rex/ole/fat.rb +99 -0
  112. data/lib/rex/ole/header.rb +204 -0
  113. data/lib/rex/ole/minifat.rb +77 -0
  114. data/lib/rex/ole/propset.rb +144 -0
  115. data/lib/rex/ole/samples/create_ole.rb +27 -0
  116. data/lib/rex/ole/samples/dir.rb +35 -0
  117. data/lib/rex/ole/samples/dump_stream.rb +34 -0
  118. data/lib/rex/ole/samples/ole_info.rb +23 -0
  119. data/lib/rex/ole/storage.rb +395 -0
  120. data/lib/rex/ole/stream.rb +53 -0
  121. data/lib/rex/ole/substorage.rb +49 -0
  122. data/lib/rex/ole/util.rb +157 -0
  123. data/lib/rex/parser/arguments.rb +97 -0
  124. data/lib/rex/parser/arguments.rb.ut.rb +67 -0
  125. data/lib/rex/parser/ini.rb +185 -0
  126. data/lib/rex/parser/ini.rb.ut.rb +29 -0
  127. data/lib/rex/parser/ip360_aspl_xml.rb +102 -0
  128. data/lib/rex/parser/ip360_xml.rb +97 -0
  129. data/lib/rex/parser/nessus_xml.rb +118 -0
  130. data/lib/rex/parser/netsparker_xml.rb +94 -0
  131. data/lib/rex/parser/nexpose_xml.rb +136 -0
  132. data/lib/rex/parser/nmap_xml.rb +137 -0
  133. data/lib/rex/parser/retina_xml.rb +109 -0
  134. data/lib/rex/payloads.rb +1 -0
  135. data/lib/rex/payloads/win32.rb +2 -0
  136. data/lib/rex/payloads/win32/common.rb +26 -0
  137. data/lib/rex/payloads/win32/kernel.rb +53 -0
  138. data/lib/rex/payloads/win32/kernel/common.rb +54 -0
  139. data/lib/rex/payloads/win32/kernel/migration.rb +12 -0
  140. data/lib/rex/payloads/win32/kernel/recovery.rb +50 -0
  141. data/lib/rex/payloads/win32/kernel/stager.rb +194 -0
  142. data/lib/rex/peparsey.rb +12 -0
  143. data/lib/rex/peparsey/exceptions.rb +32 -0
  144. data/lib/rex/peparsey/pe.rb +212 -0
  145. data/lib/rex/peparsey/pe_memdump.rb +63 -0
  146. data/lib/rex/peparsey/pebase.rb +1680 -0
  147. data/lib/rex/peparsey/section.rb +136 -0
  148. data/lib/rex/pescan.rb +13 -0
  149. data/lib/rex/pescan/analyze.rb +309 -0
  150. data/lib/rex/pescan/scanner.rb +206 -0
  151. data/lib/rex/pescan/search.rb +56 -0
  152. data/lib/rex/platforms.rb +1 -0
  153. data/lib/rex/platforms/windows.rb +51 -0
  154. data/lib/rex/poly.rb +132 -0
  155. data/lib/rex/poly/block.rb +477 -0
  156. data/lib/rex/poly/register.rb +100 -0
  157. data/lib/rex/poly/register/x86.rb +40 -0
  158. data/lib/rex/post.rb +8 -0
  159. data/lib/rex/post/dir.rb +51 -0
  160. data/lib/rex/post/file.rb +172 -0
  161. data/lib/rex/post/file_stat.rb +220 -0
  162. data/lib/rex/post/gen.pl +13 -0
  163. data/lib/rex/post/io.rb +182 -0
  164. data/lib/rex/post/meterpreter.rb +4 -0
  165. data/lib/rex/post/meterpreter/channel.rb +445 -0
  166. data/lib/rex/post/meterpreter/channel_container.rb +54 -0
  167. data/lib/rex/post/meterpreter/channels/pool.rb +160 -0
  168. data/lib/rex/post/meterpreter/channels/pools/file.rb +62 -0
  169. data/lib/rex/post/meterpreter/channels/pools/stream_pool.rb +103 -0
  170. data/lib/rex/post/meterpreter/channels/stream.rb +87 -0
  171. data/lib/rex/post/meterpreter/client.rb +364 -0
  172. data/lib/rex/post/meterpreter/client_core.rb +274 -0
  173. data/lib/rex/post/meterpreter/dependencies.rb +3 -0
  174. data/lib/rex/post/meterpreter/extension.rb +32 -0
  175. data/lib/rex/post/meterpreter/extensions/espia/espia.rb +58 -0
  176. data/lib/rex/post/meterpreter/extensions/espia/tlv.rb +16 -0
  177. data/lib/rex/post/meterpreter/extensions/incognito/incognito.rb +94 -0
  178. data/lib/rex/post/meterpreter/extensions/incognito/tlv.rb +21 -0
  179. data/lib/rex/post/meterpreter/extensions/networkpug/networkpug.rb +57 -0
  180. data/lib/rex/post/meterpreter/extensions/networkpug/tlv.rb +15 -0
  181. data/lib/rex/post/meterpreter/extensions/priv/fs.rb +118 -0
  182. data/lib/rex/post/meterpreter/extensions/priv/passwd.rb +61 -0
  183. data/lib/rex/post/meterpreter/extensions/priv/priv.rb +111 -0
  184. data/lib/rex/post/meterpreter/extensions/priv/tlv.rb +28 -0
  185. data/lib/rex/post/meterpreter/extensions/sniffer/sniffer.rb +101 -0
  186. data/lib/rex/post/meterpreter/extensions/sniffer/tlv.rb +26 -0
  187. data/lib/rex/post/meterpreter/extensions/stdapi/constants.rb +333 -0
  188. data/lib/rex/post/meterpreter/extensions/stdapi/fs/dir.rb +282 -0
  189. data/lib/rex/post/meterpreter/extensions/stdapi/fs/file.rb +266 -0
  190. data/lib/rex/post/meterpreter/extensions/stdapi/fs/file_stat.rb +103 -0
  191. data/lib/rex/post/meterpreter/extensions/stdapi/fs/io.rb +48 -0
  192. data/lib/rex/post/meterpreter/extensions/stdapi/net/config.rb +144 -0
  193. data/lib/rex/post/meterpreter/extensions/stdapi/net/interface.rb +73 -0
  194. data/lib/rex/post/meterpreter/extensions/stdapi/net/route.rb +56 -0
  195. data/lib/rex/post/meterpreter/extensions/stdapi/net/socket.rb +137 -0
  196. data/lib/rex/post/meterpreter/extensions/stdapi/net/socket_subsystem/tcp_client_channel.rb +180 -0
  197. data/lib/rex/post/meterpreter/extensions/stdapi/net/socket_subsystem/tcp_server_channel.rb +167 -0
  198. data/lib/rex/post/meterpreter/extensions/stdapi/net/socket_subsystem/udp_channel.rb +208 -0
  199. data/lib/rex/post/meterpreter/extensions/stdapi/railgun.rb.ts.rb +6 -0
  200. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/api_constants.rb +38106 -0
  201. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/api_constants.rb.ut.rb +31 -0
  202. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/buffer_item.rb +47 -0
  203. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/buffer_item.rb.ut.rb +36 -0
  204. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_advapi32.rb +1818 -0
  205. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_iphlpapi.rb +96 -0
  206. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_kernel32.rb +3848 -0
  207. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_netapi32.rb +26 -0
  208. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_ntdll.rb +153 -0
  209. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_shell32.rb +21 -0
  210. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_user32.rb +3169 -0
  211. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_ws2_32.rb +599 -0
  212. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll.rb +318 -0
  213. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_function.rb +100 -0
  214. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_function.rb.ut.rb +42 -0
  215. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_helper.rb +148 -0
  216. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_helper.rb.ut.rb +127 -0
  217. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/multicall.rb +309 -0
  218. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/railgun.rb +204 -0
  219. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/tlv.rb +51 -0
  220. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/util.rb +630 -0
  221. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/win_const_manager.rb +75 -0
  222. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/win_const_manager.rb.ut.rb +103 -0
  223. data/lib/rex/post/meterpreter/extensions/stdapi/stdapi.rb +149 -0
  224. data/lib/rex/post/meterpreter/extensions/stdapi/sys/config.rb +97 -0
  225. data/lib/rex/post/meterpreter/extensions/stdapi/sys/event_log.rb +192 -0
  226. data/lib/rex/post/meterpreter/extensions/stdapi/sys/event_log_subsystem/event_record.rb +41 -0
  227. data/lib/rex/post/meterpreter/extensions/stdapi/sys/power.rb +61 -0
  228. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process.rb +370 -0
  229. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/image.rb +129 -0
  230. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/io.rb +55 -0
  231. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/memory.rb +336 -0
  232. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/thread.rb +141 -0
  233. data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry.rb +279 -0
  234. data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry_subsystem/registry_key.rb +193 -0
  235. data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry_subsystem/registry_value.rb +102 -0
  236. data/lib/rex/post/meterpreter/extensions/stdapi/sys/thread.rb +180 -0
  237. data/lib/rex/post/meterpreter/extensions/stdapi/tlv.rb +211 -0
  238. data/lib/rex/post/meterpreter/extensions/stdapi/ui.rb +227 -0
  239. data/lib/rex/post/meterpreter/extensions/stdapi/webcam/webcam.rb +63 -0
  240. data/lib/rex/post/meterpreter/inbound_packet_handler.rb +30 -0
  241. data/lib/rex/post/meterpreter/object_aliases.rb +83 -0
  242. data/lib/rex/post/meterpreter/packet.rb +688 -0
  243. data/lib/rex/post/meterpreter/packet_dispatcher.rb +431 -0
  244. data/lib/rex/post/meterpreter/packet_parser.rb +94 -0
  245. data/lib/rex/post/meterpreter/packet_response_waiter.rb +83 -0
  246. data/lib/rex/post/meterpreter/ui/console.rb +137 -0
  247. data/lib/rex/post/meterpreter/ui/console/command_dispatcher.rb +62 -0
  248. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/core.rb +730 -0
  249. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/espia.rb +108 -0
  250. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/incognito.rb +241 -0
  251. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/networkpug.rb +231 -0
  252. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv.rb +61 -0
  253. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv/elevate.rb +98 -0
  254. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv/passwd.rb +51 -0
  255. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv/timestomp.rb +132 -0
  256. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/sniffer.rb +187 -0
  257. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi.rb +65 -0
  258. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/fs.rb +442 -0
  259. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/net.rb +298 -0
  260. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/sys.rb +486 -0
  261. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/ui.rb +315 -0
  262. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/webcam.rb +157 -0
  263. data/lib/rex/post/meterpreter/ui/console/interactive_channel.rb +95 -0
  264. data/lib/rex/post/permission.rb +26 -0
  265. data/lib/rex/post/process.rb +57 -0
  266. data/lib/rex/post/thread.rb +57 -0
  267. data/lib/rex/post/ui.rb +52 -0
  268. data/lib/rex/proto.rb +13 -0
  269. data/lib/rex/proto.rb.ts.rb +8 -0
  270. data/lib/rex/proto/dcerpc.rb +6 -0
  271. data/lib/rex/proto/dcerpc.rb.ts.rb +9 -0
  272. data/lib/rex/proto/dcerpc/client.rb +361 -0
  273. data/lib/rex/proto/dcerpc/client.rb.ut.rb +491 -0
  274. data/lib/rex/proto/dcerpc/exceptions.rb +150 -0
  275. data/lib/rex/proto/dcerpc/handle.rb +47 -0
  276. data/lib/rex/proto/dcerpc/handle.rb.ut.rb +85 -0
  277. data/lib/rex/proto/dcerpc/ndr.rb +72 -0
  278. data/lib/rex/proto/dcerpc/ndr.rb.ut.rb +41 -0
  279. data/lib/rex/proto/dcerpc/packet.rb +253 -0
  280. data/lib/rex/proto/dcerpc/packet.rb.ut.rb +56 -0
  281. data/lib/rex/proto/dcerpc/response.rb +187 -0
  282. data/lib/rex/proto/dcerpc/response.rb.ut.rb +15 -0
  283. data/lib/rex/proto/dcerpc/uuid.rb +84 -0
  284. data/lib/rex/proto/dcerpc/uuid.rb.ut.rb +46 -0
  285. data/lib/rex/proto/dhcp.rb +7 -0
  286. data/lib/rex/proto/dhcp/constants.rb +33 -0
  287. data/lib/rex/proto/dhcp/server.rb +292 -0
  288. data/lib/rex/proto/drda.rb +5 -0
  289. data/lib/rex/proto/drda.rb.ts.rb +17 -0
  290. data/lib/rex/proto/drda/constants.rb +49 -0
  291. data/lib/rex/proto/drda/constants.rb.ut.rb +23 -0
  292. data/lib/rex/proto/drda/packet.rb +252 -0
  293. data/lib/rex/proto/drda/packet.rb.ut.rb +109 -0
  294. data/lib/rex/proto/drda/utils.rb +123 -0
  295. data/lib/rex/proto/drda/utils.rb.ut.rb +84 -0
  296. data/lib/rex/proto/http.rb +5 -0
  297. data/lib/rex/proto/http.rb.ts.rb +12 -0
  298. data/lib/rex/proto/http/client.rb +821 -0
  299. data/lib/rex/proto/http/client.rb.ut.rb +95 -0
  300. data/lib/rex/proto/http/handler.rb +46 -0
  301. data/lib/rex/proto/http/handler/erb.rb +128 -0
  302. data/lib/rex/proto/http/handler/erb.rb.ut.rb +21 -0
  303. data/lib/rex/proto/http/handler/erb.rb.ut.rb.rhtml +1 -0
  304. data/lib/rex/proto/http/handler/proc.rb +60 -0
  305. data/lib/rex/proto/http/handler/proc.rb.ut.rb +24 -0
  306. data/lib/rex/proto/http/header.rb +161 -0
  307. data/lib/rex/proto/http/header.rb.ut.rb +46 -0
  308. data/lib/rex/proto/http/packet.rb +407 -0
  309. data/lib/rex/proto/http/packet.rb.ut.rb +165 -0
  310. data/lib/rex/proto/http/request.rb +356 -0
  311. data/lib/rex/proto/http/request.rb.ut.rb +214 -0
  312. data/lib/rex/proto/http/response.rb +90 -0
  313. data/lib/rex/proto/http/response.rb.ut.rb +149 -0
  314. data/lib/rex/proto/http/server.rb +369 -0
  315. data/lib/rex/proto/http/server.rb.ut.rb +79 -0
  316. data/lib/rex/proto/ntlm.rb +7 -0
  317. data/lib/rex/proto/ntlm.rb.ut.rb +177 -0
  318. data/lib/rex/proto/ntlm/base.rb +326 -0
  319. data/lib/rex/proto/ntlm/constants.rb +74 -0
  320. data/lib/rex/proto/ntlm/crypt.rb +415 -0
  321. data/lib/rex/proto/ntlm/exceptions.rb +16 -0
  322. data/lib/rex/proto/ntlm/message.rb +536 -0
  323. data/lib/rex/proto/ntlm/utils.rb +764 -0
  324. data/lib/rex/proto/proxy/socks4a.rb +440 -0
  325. data/lib/rex/proto/rfb.rb +19 -0
  326. data/lib/rex/proto/rfb.rb.ut.rb +37 -0
  327. data/lib/rex/proto/rfb/cipher.rb +84 -0
  328. data/lib/rex/proto/rfb/client.rb +207 -0
  329. data/lib/rex/proto/rfb/constants.rb +52 -0
  330. data/lib/rex/proto/smb.rb +7 -0
  331. data/lib/rex/proto/smb.rb.ts.rb +8 -0
  332. data/lib/rex/proto/smb/client.rb +1952 -0
  333. data/lib/rex/proto/smb/client.rb.ut.rb +223 -0
  334. data/lib/rex/proto/smb/constants.rb +1047 -0
  335. data/lib/rex/proto/smb/constants.rb.ut.rb +18 -0
  336. data/lib/rex/proto/smb/crypt.rb +36 -0
  337. data/lib/rex/proto/smb/evasions.rb +66 -0
  338. data/lib/rex/proto/smb/exceptions.rb +858 -0
  339. data/lib/rex/proto/smb/simpleclient.rb +306 -0
  340. data/lib/rex/proto/smb/simpleclient.rb.ut.rb +128 -0
  341. data/lib/rex/proto/smb/utils.rb +103 -0
  342. data/lib/rex/proto/smb/utils.rb.ut.rb +20 -0
  343. data/lib/rex/proto/sunrpc.rb +1 -0
  344. data/lib/rex/proto/sunrpc/client.rb +195 -0
  345. data/lib/rex/proto/tftp.rb +12 -0
  346. data/lib/rex/proto/tftp/constants.rb +39 -0
  347. data/lib/rex/proto/tftp/server.rb +497 -0
  348. data/lib/rex/proto/tftp/server.rb.ut.rb +28 -0
  349. data/lib/rex/script.rb +42 -0
  350. data/lib/rex/script/base.rb +59 -0
  351. data/lib/rex/script/meterpreter.rb +15 -0
  352. data/lib/rex/script/shell.rb +9 -0
  353. data/lib/rex/service.rb +48 -0
  354. data/lib/rex/service_manager.rb +141 -0
  355. data/lib/rex/service_manager.rb.ut.rb +32 -0
  356. data/lib/rex/services/local_relay.rb +423 -0
  357. data/lib/rex/socket.rb +684 -0
  358. data/lib/rex/socket.rb.ut.rb +107 -0
  359. data/lib/rex/socket/comm.rb +119 -0
  360. data/lib/rex/socket/comm/local.rb +412 -0
  361. data/lib/rex/socket/comm/local.rb.ut.rb +75 -0
  362. data/lib/rex/socket/ip.rb +130 -0
  363. data/lib/rex/socket/parameters.rb +345 -0
  364. data/lib/rex/socket/parameters.rb.ut.rb +51 -0
  365. data/lib/rex/socket/range_walker.rb +346 -0
  366. data/lib/rex/socket/range_walker.rb.ut.rb +55 -0
  367. data/lib/rex/socket/ssl_tcp.rb +184 -0
  368. data/lib/rex/socket/ssl_tcp.rb.ut.rb +39 -0
  369. data/lib/rex/socket/ssl_tcp_server.rb +122 -0
  370. data/lib/rex/socket/ssl_tcp_server.rb.ut.rb +61 -0
  371. data/lib/rex/socket/subnet_walker.rb +75 -0
  372. data/lib/rex/socket/subnet_walker.rb.ut.rb +28 -0
  373. data/lib/rex/socket/switch_board.rb +278 -0
  374. data/lib/rex/socket/switch_board.rb.ut.rb +52 -0
  375. data/lib/rex/socket/tcp.rb +76 -0
  376. data/lib/rex/socket/tcp.rb.ut.rb +64 -0
  377. data/lib/rex/socket/tcp_server.rb +66 -0
  378. data/lib/rex/socket/tcp_server.rb.ut.rb +44 -0
  379. data/lib/rex/socket/udp.rb +164 -0
  380. data/lib/rex/socket/udp.rb.ut.rb +44 -0
  381. data/lib/rex/struct2.rb +5 -0
  382. data/lib/rex/struct2/c_struct.rb +181 -0
  383. data/lib/rex/struct2/c_struct_template.rb +39 -0
  384. data/lib/rex/struct2/constant.rb +26 -0
  385. data/lib/rex/struct2/element.rb +44 -0
  386. data/lib/rex/struct2/generic.rb +73 -0
  387. data/lib/rex/struct2/restraint.rb +54 -0
  388. data/lib/rex/struct2/s_string.rb +72 -0
  389. data/lib/rex/struct2/s_struct.rb +111 -0
  390. data/lib/rex/sync.rb +6 -0
  391. data/lib/rex/sync/event.rb +94 -0
  392. data/lib/rex/sync/read_write_lock.rb +176 -0
  393. data/lib/rex/sync/ref.rb +57 -0
  394. data/lib/rex/sync/thread_safe.rb +82 -0
  395. data/lib/rex/test.rb +35 -0
  396. data/lib/rex/text.rb +1163 -0
  397. data/lib/rex/text.rb.ut.rb +190 -0
  398. data/lib/rex/thread_factory.rb +42 -0
  399. data/lib/rex/time.rb +65 -0
  400. data/lib/rex/transformer.rb +115 -0
  401. data/lib/rex/transformer.rb.ut.rb +38 -0
  402. data/lib/rex/ui.rb +21 -0
  403. data/lib/rex/ui/interactive.rb +298 -0
  404. data/lib/rex/ui/output.rb +78 -0
  405. data/lib/rex/ui/output/none.rb +18 -0
  406. data/lib/rex/ui/progress_tracker.rb +96 -0
  407. data/lib/rex/ui/subscriber.rb +149 -0
  408. data/lib/rex/ui/text/color.rb +97 -0
  409. data/lib/rex/ui/text/color.rb.ut.rb +18 -0
  410. data/lib/rex/ui/text/dispatcher_shell.rb +467 -0
  411. data/lib/rex/ui/text/input.rb +117 -0
  412. data/lib/rex/ui/text/input/buffer.rb +75 -0
  413. data/lib/rex/ui/text/input/readline.rb +129 -0
  414. data/lib/rex/ui/text/input/socket.rb +95 -0
  415. data/lib/rex/ui/text/input/stdio.rb +45 -0
  416. data/lib/rex/ui/text/irb_shell.rb +57 -0
  417. data/lib/rex/ui/text/output.rb +80 -0
  418. data/lib/rex/ui/text/output/buffer.rb +61 -0
  419. data/lib/rex/ui/text/output/file.rb +43 -0
  420. data/lib/rex/ui/text/output/socket.rb +43 -0
  421. data/lib/rex/ui/text/output/stdio.rb +40 -0
  422. data/lib/rex/ui/text/progress_tracker.rb +56 -0
  423. data/lib/rex/ui/text/progress_tracker.rb.ut.rb +34 -0
  424. data/lib/rex/ui/text/shell.rb +328 -0
  425. data/lib/rex/ui/text/table.rb +279 -0
  426. data/lib/rex/ui/text/table.rb.ut.rb +55 -0
  427. data/lib/rex/zip.rb +93 -0
  428. data/lib/rex/zip/archive.rb +184 -0
  429. data/lib/rex/zip/blocks.rb +182 -0
  430. data/lib/rex/zip/entry.rb +104 -0
  431. data/lib/rex/zip/samples/comment.rb +32 -0
  432. data/lib/rex/zip/samples/mkwar.rb +138 -0
  433. data/lib/rex/zip/samples/mkzip.rb +19 -0
  434. data/lib/rex/zip/samples/recursive.rb +58 -0
  435. metadata +434 -1
@@ -0,0 +1,279 @@
1
+ require 'rex/ui'
2
+
3
+ module Rex
4
+ module Ui
5
+ module Text
6
+
7
+ ###
8
+ #
9
+ # Prints text in a tablized format. Pretty lame at the moment, but
10
+ # whatever.
11
+ #
12
+ ###
13
+ class Table
14
+
15
+ #
16
+ # Initializes a text table instance using the supplied properties. The
17
+ # Table class supports the following hash attributes:
18
+ #
19
+ # Header
20
+ #
21
+ # The string to display as a heading above the table. If none is
22
+ # specified, no header will be displayed.
23
+ #
24
+ # HeaderIndent
25
+ #
26
+ # The amount of space to indent the header. The default is zero.
27
+ #
28
+ # Columns
29
+ #
30
+ # The array of columns that will exist within the table.
31
+ #
32
+ # Rows
33
+ #
34
+ # The array of rows that will exist.
35
+ #
36
+ # Width
37
+ #
38
+ # The maximum width of the table in characters.
39
+ #
40
+ # Indent
41
+ #
42
+ # The number of characters to indent the table.
43
+ #
44
+ # CellPad
45
+ #
46
+ # The number of characters to put between each horizontal cell.
47
+ #
48
+ # Prefix
49
+ #
50
+ # The text to prefix before the table.
51
+ #
52
+ # Postfix
53
+ #
54
+ # The text to affix to the end of the table.
55
+ #
56
+ def initialize(opts = {})
57
+ self.header = opts['Header']
58
+ self.headeri = opts['HeaderIndent'] || 0
59
+ self.columns = opts['Columns'] || []
60
+ # updated below if we got a "Rows" option
61
+ self.rows = []
62
+
63
+ self.width = opts['Width'] || 80
64
+ self.indent = opts['Indent'] || 0
65
+ self.cellpad = opts['CellPad'] || 2
66
+ self.prefix = opts['Prefix'] || ''
67
+ self.postfix = opts['Postfix'] || ''
68
+ self.colprops = []
69
+
70
+ # Default column properties
71
+ self.columns.length.times { |idx|
72
+ self.colprops[idx] = {}
73
+ self.colprops[idx]['MaxWidth'] = self.columns[idx].length
74
+ }
75
+
76
+ # ensure all our internal state gets updated with the given rows by
77
+ # using add_row instead of just adding them to self.rows. See #3825.
78
+ opts['Rows'].each { |row| add_row(row) } if opts['Rows']
79
+
80
+ # Merge in options
81
+ if (opts['ColProps'])
82
+ opts['ColProps'].each_key { |col|
83
+ idx = self.columns.index(col)
84
+
85
+ if (idx)
86
+ self.colprops[idx].merge!(opts['ColProps'][col])
87
+ end
88
+ }
89
+ end
90
+
91
+ end
92
+
93
+ #
94
+ # Converts table contents to a string.
95
+ #
96
+ def to_s
97
+ str = prefix
98
+ str << header_to_s || ''
99
+ str << columns_to_s || ''
100
+ str << hr_to_s || ''
101
+
102
+ rows.each { |row|
103
+ if (is_hr(row))
104
+ str << hr_to_s
105
+ else
106
+ str << row_to_s(row)
107
+ end
108
+ }
109
+
110
+ str << postfix
111
+
112
+ return str
113
+ end
114
+
115
+ #
116
+ # Converts table contents to a csv
117
+ #
118
+ def to_csv
119
+ str = ''
120
+ str << ( columns.join(",") + "\n" )
121
+ rows.each { |row|
122
+ next if is_hr(row)
123
+ str << ( row.map{|x|
124
+ x.gsub(/[\r\n]/, ' ').gsub(/\s+/, ' ').gsub('"', '""')
125
+ }.map{|x| "\"#{x}\"" }.join(",") + "\n" )
126
+ }
127
+ str
128
+ end
129
+
130
+ #
131
+ #
132
+ # Returns the header string.
133
+ #
134
+ def header_to_s # :nodoc:
135
+ if (header)
136
+ pad = " " * headeri
137
+
138
+ return pad + header + "\n" + pad + "=" * header.length + "\n\n"
139
+ end
140
+
141
+ return ''
142
+ end
143
+
144
+ #
145
+ # Prints the contents of the table.
146
+ #
147
+ def print
148
+ puts to_s
149
+ end
150
+
151
+ #
152
+ # Adds a row using the supplied fields.
153
+ #
154
+ def <<(fields)
155
+ add_row(fields)
156
+ end
157
+
158
+ #
159
+ # Adds a row with the supplied fields.
160
+ #
161
+ def add_row(fields = [])
162
+ if fields.length != self.columns.length
163
+ raise RuntimeError, 'Invalid number of columns!'
164
+ end
165
+ fields.each_with_index { |field, idx|
166
+ if (colprops[idx]['MaxWidth'] < field.to_s.length)
167
+ colprops[idx]['MaxWidth'] = field.to_s.length
168
+ end
169
+ }
170
+
171
+ rows << fields
172
+ end
173
+
174
+ #
175
+ # Adds a horizontal line.
176
+ #
177
+ def add_hr
178
+ rows << '__hr__'
179
+ end
180
+
181
+ alias p print
182
+
183
+ attr_accessor :header, :headeri # :nodoc:
184
+ attr_accessor :columns, :rows, :colprops # :nodoc:
185
+ attr_accessor :width, :indent, :cellpad # :nodoc:
186
+ attr_accessor :prefix, :postfix # :nodoc:
187
+
188
+ protected
189
+
190
+ #
191
+ # Defaults cell widths and alignments.
192
+ #
193
+ def defaults # :nodoc:
194
+ self.columns.length.times { |idx|
195
+ }
196
+ end
197
+
198
+ #
199
+ # Checks to see if the row is an hr.
200
+ #
201
+ def is_hr(row) # :nodoc:
202
+ return ((row.kind_of?(String)) && (row == '__hr__'))
203
+ end
204
+
205
+ #
206
+ # Converts the columns to a string.
207
+ #
208
+ def columns_to_s # :nodoc:
209
+ nameline = ' ' * indent
210
+ barline = nameline.dup
211
+ last_col = nil
212
+ last_idx = nil
213
+ columns.each_with_index { |col,idx|
214
+ if (last_col)
215
+ nameline << pad(' ', last_col, last_idx)
216
+
217
+ remainder = colprops[last_idx]['MaxWidth'] - last_col.length
218
+ if (remainder < 0)
219
+ remainder = 0
220
+ end
221
+ barline << (' ' * (cellpad + remainder))
222
+ end
223
+ nameline << col
224
+ barline << ('-' * col.length)
225
+
226
+ last_col = col
227
+ last_idx = idx
228
+ }
229
+
230
+ return "#{nameline}\n#{barline}"
231
+ end
232
+
233
+ #
234
+ # Converts an hr to a string.
235
+ #
236
+ def hr_to_s # :nodoc:
237
+ return "\n"
238
+ end
239
+
240
+ #
241
+ # Converts a row to a string.
242
+ #
243
+ def row_to_s(row) # :nodoc:
244
+ line = ' ' * indent
245
+ last_cell = nil
246
+ last_idx = nil
247
+ row.each_with_index { |cell, idx|
248
+ if (last_cell)
249
+ line << pad(' ', last_cell.to_s, last_idx)
250
+ end
251
+ line << cell.to_s
252
+ # line << pad(' ', cell.to_s, idx)
253
+ last_cell = cell
254
+ last_idx = idx
255
+ }
256
+
257
+ return line + "\n"
258
+ end
259
+
260
+ #
261
+ # Pads out with the supplied character for the remainder of the space given
262
+ # some text and a column index.
263
+ #
264
+ def pad(chr, buf, colidx, use_cell_pad = true) # :nodoc:
265
+ remainder = colprops[colidx]['MaxWidth'] - buf.length
266
+ val = chr * remainder;
267
+
268
+ if (use_cell_pad)
269
+ val << ' ' * cellpad
270
+ end
271
+
272
+ return val
273
+ end
274
+
275
+ end
276
+
277
+ end
278
+ end
279
+ end
@@ -0,0 +1,55 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ $:.unshift(File.join(File.dirname(__FILE__), '..', '..', '..'))
4
+
5
+ require 'test/unit'
6
+ require 'rex/ui/text/table'
7
+
8
+ class Rex::Ui::Text::Table::UnitTest < Test::Unit::TestCase
9
+
10
+ def new_table(opts = {})
11
+ if (opts['Columns'] == nil)
12
+ opts['Columns'] =
13
+ [
14
+ 'col1',
15
+ 'col2',
16
+ 'col3'
17
+ ]
18
+ end
19
+
20
+ tbl = Rex::Ui::Text::Table.new(opts)
21
+
22
+ tbl << [ "r1cell1", "r1cell2", "r1cell3" ]
23
+ tbl << [ "r2cell1", "r2cell2", "r2cell3" ]
24
+
25
+ return tbl
26
+ end
27
+
28
+ def test_basic
29
+ tbl = new_table
30
+
31
+ dstr = <<End
32
+ col1 col2 col3
33
+ ---- ---- ----
34
+ r1cell1 r1cell2 r1cell3
35
+ r2cell1 r2cell2 r2cell3
36
+ End
37
+
38
+ assert_equal(tbl.to_s, dstr)
39
+ end
40
+
41
+ def test_indent
42
+ tbl = new_table(
43
+ 'Indent' => 4)
44
+
45
+ dstr = <<End
46
+ col1 col2 col3
47
+ ---- ---- ----
48
+ r1cell1 r1cell2 r1cell3
49
+ r2cell1 r2cell2 r2cell3
50
+ End
51
+
52
+ assert_equal(tbl.to_s, dstr)
53
+ end
54
+
55
+ end
@@ -0,0 +1,93 @@
1
+ #!/usr/bin/env ruby
2
+ #
3
+ # Zip library
4
+ #
5
+ # Written by Joshua J. Drake <jduck [at] metasploit.com>
6
+ #
7
+ # Based on code contributed by bannedit, and the following SPEC:
8
+ # Reference: http://www.pkware.com/documents/casestudies/APPNOTE.TXT
9
+ #
10
+
11
+ require 'zlib'
12
+
13
+ module Rex
14
+ module Zip
15
+
16
+ ZIP_VERSION = 0x14
17
+
18
+ # general purpose bit flag values
19
+ #
20
+ # bit 0
21
+ GPBF_ENCRYPTED = 0x0001
22
+ # bits 1 & 2
23
+ # implode only
24
+ GPBF_IMP_8KDICT = 0x0002
25
+ GPBF_IMP_3SFT = 0x0004
26
+ # deflate only
27
+ GPBF_DEF_MAX = 0x0002
28
+ GPBF_DEF_FAST = 0x0004
29
+ GPBF_DEF_SUPERFAST = 0x0006
30
+ # lzma only
31
+ GPBF_LZMA_EOSUSED = 0x0002
32
+ # bit 3
33
+ GPBF_USE_DATADESC = 0x0008
34
+ # bit 4
35
+ GPBF_DEF_ENHANCED = 0x0010
36
+ # bit 5
37
+ GPBF_COMP_PATHCED = 0x0020
38
+ # bit 6
39
+ GPBF_STRONG_ENC = 0x0040
40
+ # bit 7-10 unused
41
+ # bit 11
42
+ GPBF_STRS_UTF8 = 0x0800
43
+ # bit 12 (reserved)
44
+ # bit 13
45
+ GPBF_DIR_ENCRYPTED = 0x2000
46
+ # bit 14,15 (reserved)
47
+
48
+
49
+ # compression methods
50
+ CM_STORE = 0
51
+ CM_SHRINK = 1
52
+ CM_REDUCE1 = 2
53
+ CM_REDUCE2 = 3
54
+ CM_REDUCE3 = 4
55
+ CM_REDUCE4 = 5
56
+ CM_IMPLODE = 6
57
+ CM_TOKENIZE = 7
58
+ CM_DEFLATE = 8
59
+ CM_DEFLATE64 = 9
60
+ CM_PKWARE_IMPLODE = 10
61
+ # 11 - reserved
62
+ CM_BZIP2 = 12
63
+ # 13 - reserved
64
+ CM_LZMA_EFS = 14
65
+ # 15-17 reserved
66
+ CM_IBM_TERSE = 18
67
+ CM_IBM_LZ77 = 19
68
+ # 20-96 reserved
69
+ CM_WAVPACK = 97
70
+ CM_PPMD_V1R1 = 98
71
+
72
+
73
+ # internal file attributes
74
+ IFA_ASCII = 0x0001
75
+ # bits 2 & 3 are reserved
76
+ IFA_MAINFRAME_MODE = 0x0002 # ??
77
+
78
+
79
+ # external file attributes
80
+ EFA_ISDIR = 0x0001
81
+
82
+
83
+ # various parts of the structure
84
+ require 'rex/zip/blocks'
85
+
86
+ # an entry in a zip file
87
+ require 'rex/zip/entry'
88
+
89
+ # the archive class
90
+ require 'rex/zip/archive'
91
+
92
+ end
93
+ end
@@ -0,0 +1,184 @@
1
+ ##
2
+ # $Id: archive.rb 11175 2010-11-30 07:10:57Z egypt $
3
+ ##
4
+
5
+ module Rex
6
+ module Zip
7
+
8
+ #
9
+ # This represents an entire archive.
10
+ #
11
+ class Archive
12
+ attr_reader :entries
13
+
14
+ def initialize(compmeth=CM_DEFLATE)
15
+ @compmeth = compmeth
16
+ @entries = []
17
+ end
18
+
19
+
20
+ def add_file(fname, fdata=nil, xtra=nil, comment=nil)
21
+ if (not fdata)
22
+ begin
23
+ st = File.stat(fname)
24
+ rescue
25
+ return nil
26
+ end
27
+
28
+ ts = st.mtime
29
+ if (st.directory?)
30
+ attrs = EFA_ISDIR
31
+ fname += '/'
32
+ else
33
+ f = File.open(fname, 'rb')
34
+ fdata = f.read(f.stat.size)
35
+ f.close
36
+ end
37
+ end
38
+
39
+ @entries << Entry.new(fname, fdata, @compmeth, ts, attrs, xtra, comment)
40
+ end
41
+
42
+
43
+ def set_comment(comment)
44
+ @comment = comment
45
+ end
46
+
47
+
48
+ def save_to(fname)
49
+ f = File.open(fname, 'wb')
50
+ f.write(pack)
51
+ f.close
52
+ end
53
+
54
+
55
+ def pack
56
+ ret = ''
57
+
58
+ # save the offests
59
+ offsets = []
60
+
61
+ # file 1 .. file n
62
+ @entries.each { |ent|
63
+ offsets << ret.length
64
+ ret << ent.pack
65
+ }
66
+
67
+ # archive decryption header (unsupported)
68
+ # archive extra data record (unsupported)
69
+
70
+ # central directory
71
+ cfd_offset = ret.length
72
+ idx = 0
73
+ @entries.each { |ent|
74
+ cfd = CentralDir.new(ent, offsets[idx])
75
+ ret << cfd.pack
76
+ idx += 1
77
+ }
78
+
79
+ # zip64 end of central dir record (unsupported)
80
+ # zip64 end of central dir locator (unsupported)
81
+
82
+ # end of central directory record
83
+ cur_offset = ret.length - cfd_offset
84
+ ret << CentralDirEnd.new(@entries.length, cur_offset, cfd_offset, @comment).pack
85
+
86
+ ret
87
+ end
88
+
89
+ def inspect
90
+ "#<#{self.class} entries = [#{@entries.map{|e| e.name}.join(",")}]>"
91
+ end
92
+
93
+ end
94
+
95
+ class Jar < Archive
96
+ attr_accessor :manifest
97
+
98
+ def build_manifest(opts={})
99
+ main_class = opts[:main_class] || nil
100
+ existing_manifest = nil
101
+
102
+ @manifest = "Manifest-Version: 1.0\r\n"
103
+ @manifest << "Main-Class: #{main_class}\r\n" if main_class
104
+ @manifest << "\r\n"
105
+ @entries.each { |e|
106
+ existing_manifest = e if e.name == "META-INF/MANIFEST.MF"
107
+ next unless e.name =~ /\.class$/
108
+ @manifest << "Name: #{e.name}\r\n"
109
+ #@manifest << "SHA1-Digest: #{Digest::SHA1.base64digest(e.data)}\r\n"
110
+ @manifest << "\r\n"
111
+ }
112
+ if existing_manifest
113
+ existing_manifest.data = @manifest
114
+ else
115
+ add_file("META-INF/", '')
116
+ add_file("META-INF/MANIFEST.MF", @manifest)
117
+ end
118
+ end
119
+
120
+ def to_s
121
+ pack
122
+ end
123
+
124
+ def length
125
+ pack.length
126
+ end
127
+
128
+ #
129
+ # Add multiple files from an array
130
+ #
131
+ # +files+ should be structured like so:
132
+ # [
133
+ # [ "path", "to", "file1" ],
134
+ # [ "path", "to", "file2" ]
135
+ # ]
136
+ # and +path+ should be the location on the file system to find the files to
137
+ # add. +base_dir+ will be prepended to the path inside the jar.
138
+ #
139
+ # Example:
140
+ # <code>
141
+ # war = Rex::Zip::Jar.new
142
+ # war.add_file("WEB-INF/", '')
143
+ # war.add_file("WEB-INF/", "web.xml", web_xml)
144
+ # war.add_file("WEB-INF/classes/", '')
145
+ # files = [
146
+ # [ "servlet", "examples", "HelloWorld.class" ],
147
+ # [ "Foo.class" ],
148
+ # [ "servlet", "Bar.class" ],
149
+ # ]
150
+ # war.add_files(files, "./class_files/", "WEB-INF/classes/")
151
+ # </code>
152
+ #
153
+ # The above code would create a jar with the following structure from files
154
+ # found in ./class_files/ :
155
+ #
156
+ # +- WEB-INF/
157
+ # +- web.xml
158
+ # +- classes/
159
+ # +- Foo.class
160
+ # +- servlet/
161
+ # +- Bar.class
162
+ # +- examples/
163
+ # +- HelloWorld.class
164
+ #
165
+ def add_files(files, path, base_dir="")
166
+ files.each do |file|
167
+ # Add all of the subdirectories if they don't already exist
168
+ 1.upto(file.length - 1) do |idx|
169
+ full = base_dir + file[0,idx].join("/") + "/"
170
+ if !(entries.map{|e|e.name}.include?(full))
171
+ add_file(full, '')
172
+ end
173
+ end
174
+ # Now add the actual file, grabbing data from the filesystem
175
+ fd = File.open(File.join( path, file ), "rb")
176
+ data = fd.read(fd.stat.size)
177
+ fd.close
178
+ add_file(base_dir + file.join("/"), data)
179
+ end
180
+ end
181
+ end
182
+
183
+ end
184
+ end