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,306 @@
1
+ module Rex
2
+ module Proto
3
+ module SMB
4
+ class SimpleClient
5
+
6
+ require 'rex/text'
7
+ require 'rex/struct2'
8
+ require 'rex/proto/smb/constants'
9
+ require 'rex/proto/smb/exceptions'
10
+ require 'rex/proto/smb/evasions'
11
+ require 'rex/proto/smb/crypt'
12
+ require 'rex/proto/smb/utils'
13
+ require 'rex/proto/smb/client'
14
+
15
+ # Some short-hand class aliases
16
+ CONST = Rex::Proto::SMB::Constants
17
+ CRYPT = Rex::Proto::SMB::Crypt
18
+ UTILS = Rex::Proto::SMB::Utils
19
+ XCEPT = Rex::Proto::SMB::Exceptions
20
+ EVADE = Rex::Proto::SMB::Evasions
21
+
22
+
23
+ class OpenFile
24
+ attr_accessor :name, :tree_id, :file_id, :mode, :client, :chunk_size
25
+
26
+ def initialize(client, name, tree_id, file_id)
27
+ self.client = client
28
+ self.name = name
29
+ self.tree_id = tree_id
30
+ self.file_id = file_id
31
+ self.chunk_size = 48000
32
+ end
33
+
34
+ def delete
35
+ begin
36
+ self.close
37
+ rescue
38
+ end
39
+ self.client.delete(self.name, self.tree_id)
40
+ end
41
+
42
+ # Close this open file
43
+ def close
44
+ self.client.close(self.file_id, self.tree_id)
45
+ end
46
+
47
+ # Read data from the file
48
+ def read(length = nil, offset = 0)
49
+ if (length == nil)
50
+ data = ''
51
+ fptr = offset
52
+ ok = self.client.read(self.file_id, fptr, self.chunk_size)
53
+ while (ok and ok['Payload'].v['DataLenLow'] > 0)
54
+ buff = ok.to_s.slice(
55
+ ok['Payload'].v['DataOffset'] + 4,
56
+ ok['Payload'].v['DataLenLow']
57
+ )
58
+ data << buff
59
+ if ok['Payload'].v['Remaining'] == 0
60
+ break
61
+ end
62
+ fptr += ok['Payload'].v['DataLenLow']
63
+
64
+ begin
65
+ ok = self.client.read(self.file_id, fptr, self.chunk_size)
66
+ rescue XCEPT::ErrorCode => e
67
+ case e.error_code
68
+ when 0x00050001
69
+ # Novell fires off an access denied error on EOF
70
+ ok = nil
71
+ else
72
+ raise e
73
+ end
74
+ end
75
+ end
76
+
77
+ return data
78
+ else
79
+ ok = self.client.read(self.file_id, offset, length)
80
+ data = ok.to_s.slice(
81
+ ok['Payload'].v['DataOffset'] + 4,
82
+ ok['Payload'].v['DataLenLow']
83
+ )
84
+ return data
85
+ end
86
+ end
87
+
88
+ def << (data)
89
+ self.write(data)
90
+ end
91
+
92
+ # Write data to the file
93
+ def write(data, offset = 0)
94
+ # Track our offset into the remote file
95
+ fptr = offset
96
+
97
+ # Duplicate the data so we can use slice!
98
+ data = data.dup
99
+
100
+ # Take our first chunk of bytes
101
+ chunk = data.slice!(0, self.chunk_size)
102
+
103
+ # Keep writing data until we run out
104
+ while (chunk.length > 0)
105
+ ok = self.client.write(self.file_id, fptr, chunk)
106
+ cl = ok['Payload'].v['CountLow']
107
+
108
+ # Partial write, push the failed data back into the queue
109
+ if (cl != chunk.length)
110
+ data = chunk.slice(cl - 1, chunk.length - cl) + data
111
+ end
112
+
113
+ # Increment our painter and grab the next chunk
114
+ fptr += cl
115
+ chunk = data.slice!(0, self.chunk_size)
116
+ end
117
+ end
118
+ end
119
+
120
+ class OpenPipe < OpenFile
121
+
122
+ # Valid modes are: 'trans' and 'rw'
123
+ attr_accessor :mode
124
+
125
+ def initialize(*args)
126
+ super(*args)
127
+ self.mode = 'rw'
128
+ @buff = ''
129
+ end
130
+
131
+ def read_buffer(length, offset=0)
132
+ length ||= @buff.length
133
+ @buff.slice!(0, length)
134
+ end
135
+
136
+ def read(length = nil, offset = 0)
137
+ case self.mode
138
+ when 'trans'
139
+ read_buffer(length, offset)
140
+ when 'rw'
141
+ super(length, offset)
142
+ else
143
+ raise ArgumentError
144
+ end
145
+ end
146
+
147
+ def write(data, offset = 0)
148
+ case self.mode
149
+
150
+ when 'trans'
151
+ write_trans(data, offset)
152
+ when 'rw'
153
+ super(data, offset)
154
+ else
155
+ raise ArgumentError
156
+ end
157
+ end
158
+
159
+ def write_trans(data, offset=0)
160
+ ack = self.client.trans_named_pipe(self.file_id, data)
161
+ doff = ack['Payload'].v['DataOffset']
162
+ dlen = ack['Payload'].v['DataCount']
163
+ @buff << ack.to_s[4+doff, dlen]
164
+ end
165
+ end
166
+
167
+
168
+ # Public accessors
169
+ attr_accessor :last_error
170
+
171
+ # Private accessors
172
+ attr_accessor :socket, :client, :direct, :shares, :last_share
173
+
174
+ # Pass the socket object and a boolean indicating whether the socket is netbios or cifs
175
+ def initialize(socket, direct = false)
176
+ self.socket = socket
177
+ self.direct = direct
178
+ self.client = Rex::Proto::SMB::Client.new(socket)
179
+ self.shares = { }
180
+ end
181
+
182
+ def login( name = '', user = '', pass = '', domain = '',
183
+ verify_signature = false, usentlmv2 = false, usentlm2_session = true,
184
+ send_lm = true, use_lanman_key = false, send_ntlm = true,
185
+ native_os = 'Windows 2000 2195', native_lm = 'Windows 2000 5.0', spnopt = {})
186
+
187
+ begin
188
+
189
+ if (self.direct != true)
190
+ self.client.session_request(name)
191
+ end
192
+ self.client.native_os = native_os
193
+ self.client.native_lm = native_lm
194
+ self.client.verify_signature = verify_signature
195
+ self.client.use_ntlmv2 = usentlmv2
196
+ self.client.usentlm2_session = usentlm2_session
197
+ self.client.send_lm = send_lm
198
+ self.client.use_lanman_key = use_lanman_key
199
+ self.client.send_ntlm = send_ntlm
200
+ self.client.negotiate
201
+ self.client.spnopt = spnopt
202
+
203
+ ok = self.client.session_setup(user, pass, domain)
204
+ rescue ::Interrupt
205
+ raise $!
206
+ rescue ::Exception => e
207
+ n = XCEPT::LoginError.new
208
+ n.source = e
209
+ if(e.respond_to?('error_code'))
210
+ n.error_code = e.error_code
211
+ n.error_reason = e.get_error(e.error_code)
212
+ end
213
+ raise n
214
+ end
215
+
216
+ return true
217
+ end
218
+
219
+
220
+ def login_split_start_ntlm1(name = '')
221
+
222
+ begin
223
+
224
+ if (self.direct != true)
225
+ self.client.session_request(name)
226
+ end
227
+
228
+ # Disable extended security
229
+ self.client.negotiate(false)
230
+ rescue ::Interrupt
231
+ raise $!
232
+ rescue ::Exception => e
233
+ n = XCEPT::LoginError.new
234
+ n.source = e
235
+ if(e.respond_to?('error_code'))
236
+ n.error_code = e.error_code
237
+ n.error_reason = e.get_error(e.error_code)
238
+ end
239
+ raise n
240
+ end
241
+
242
+ return true
243
+ end
244
+
245
+
246
+ def login_split_next_ntlm1(user, domain, hash_lm, hash_nt)
247
+ begin
248
+ ok = self.client.session_setup_no_ntlmssp_prehash(user, domain, hash_lm, hash_nt)
249
+ rescue ::Interrupt
250
+ raise $!
251
+ rescue ::Exception => e
252
+ n = XCEPT::LoginError.new
253
+ n.source = e
254
+ if(e.respond_to?('error_code'))
255
+ n.error_code = e.error_code
256
+ n.error_reason = e.get_error(e.error_code)
257
+ end
258
+ raise n
259
+ end
260
+
261
+ return true
262
+ end
263
+
264
+ def connect(share)
265
+ ok = self.client.tree_connect(share)
266
+ tree_id = ok['Payload']['SMB'].v['TreeID']
267
+ self.shares[share] = tree_id
268
+ self.last_share = share
269
+ end
270
+
271
+ def disconnect(share)
272
+ ok = self.client.tree_disconnect(self.shares[share])
273
+ self.shares.delete(share)
274
+ end
275
+
276
+
277
+ def open(path, perm, chunk_size = 48000)
278
+ mode = UTILS.open_mode_to_mode(perm)
279
+ access = UTILS.open_mode_to_access(perm)
280
+
281
+ ok = self.client.open(path, mode, access)
282
+ file_id = ok['Payload'].v['FileID']
283
+ fh = OpenFile.new(self.client, path, self.client.last_tree_id, file_id)
284
+ fh.chunk_size = chunk_size
285
+ fh
286
+ end
287
+
288
+ def delete(*args)
289
+ self.client.delete(*args)
290
+ end
291
+
292
+ def create_pipe(path, perm = 'c')
293
+ disposition = UTILS.create_mode_to_disposition(perm)
294
+ ok = self.client.create_pipe(path, disposition)
295
+ file_id = ok['Payload'].v['FileID']
296
+ fh = OpenPipe.new(self.client, path, self.client.last_tree_id, file_id)
297
+ end
298
+
299
+ def trans_pipe(fid, data, no_response = nil)
300
+ client.trans_named_pipe(fid, data, no_response)
301
+ end
302
+
303
+ end
304
+ end
305
+ end
306
+ end
@@ -0,0 +1,128 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ $:.unshift(File.join(File.dirname(__FILE__), '..', '..', '..'))
4
+
5
+ require 'rex/test'
6
+ require 'rex/proto/smb'
7
+ require 'rex/proto/dcerpc'
8
+ require 'rex/socket'
9
+
10
+ class Rex::Proto::SMB::SimpleClient::UnitTest < Test::Unit::TestCase
11
+
12
+ Klass = Rex::Proto::SMB::SimpleClient
13
+
14
+ # Alias over the Rex DCERPC protocol modules
15
+ DCERPCPacket = Rex::Proto::DCERPC::Packet
16
+ DCERPCClient = Rex::Proto::DCERPC::Client
17
+ DCERPCResponse = Rex::Proto::DCERPC::Response
18
+ DCERPCUUID = Rex::Proto::DCERPC::UUID
19
+ XCEPT = Rex::Proto::SMB::Exceptions
20
+
21
+ FILE_CREATE = 0x10
22
+ FILE_TRUNC = 0x02
23
+ FILE_OPEN = 0x01
24
+
25
+
26
+ def test_smb_open_share
27
+ user = 'SMBTest'
28
+ pass = 'SMBTest'
29
+ share = 'C$'
30
+
31
+ write_data = ('A' * (1024 * 8))
32
+ filename = 'smb_tester.txt'
33
+ begin
34
+ Timeout.timeout($_REX_TEST_TIMEOUT) {
35
+ s = Rex::Socket.create_tcp(
36
+ 'PeerHost' => $_REX_TEST_SMB_HOST,
37
+ 'PeerPort' => 445
38
+ )
39
+
40
+ c = Klass.new(s, true)
41
+
42
+ begin
43
+ c.login('*SMBSERVER', user, pass)
44
+ rescue XCEPT::LoginError
45
+ flunk('login failure')
46
+ end
47
+
48
+ c.connect(share)
49
+
50
+ f = c.open(filename, 'rwct')
51
+ f << write_data
52
+ f.close
53
+
54
+ f = c.open(filename, 'ro')
55
+ d = f.read()
56
+ f.close
57
+
58
+ c.delete(filename)
59
+ c.disconnect(share)
60
+
61
+ s.close
62
+ }
63
+ rescue Timeout::Error
64
+ flunk('timeout')
65
+ end
66
+ end
67
+
68
+ def test_smb_dcerpc
69
+ begin
70
+ Timeout.timeout($_REX_TEST_TIMEOUT) {
71
+ s = Rex::Socket.create_tcp(
72
+ 'PeerHost' => $_REX_TEST_SMB_HOST,
73
+ 'PeerPort' => 445
74
+ )
75
+
76
+ c = Klass.new(s, true)
77
+
78
+ user = ''
79
+ pass = ''
80
+
81
+ begin
82
+ c.login('*SMBSERVER', user, pass)
83
+ rescue XCEPT::LoginError
84
+ flunk('login failure')
85
+ end
86
+
87
+ c.connect('IPC$')
88
+ f = c.create_pipe('\BROWSER')
89
+
90
+ bind, ctx = DCERPCPacket.make_bind_fake_multi(
91
+ '4b324fc8-1670-01d3-1278-5a47bf6ee188', '3.0',
92
+ 10,
93
+ 4
94
+ )
95
+
96
+ # Evasion techniques:
97
+ # 1) Write the bind out a few bytes at a time with a random offset
98
+ # 2) Read the response back a few bytes at a time with a random offset
99
+
100
+ # Write the bind request out in random chunk sizes
101
+ while (bind.length > 0)
102
+ f.write( bind.slice!(0, (rand(20)+5)), rand(1024)+1 )
103
+ end
104
+
105
+ d = ''
106
+ # Read the response back a few bytes a time
107
+ begin
108
+ while(true)
109
+ t = (f.read((rand(20)+5), rand(1024)+1))
110
+ last if ! t.length
111
+ d << t
112
+ end
113
+ rescue XCEPT::NoReply
114
+ end
115
+
116
+ r = DCERPCResponse.new(d)
117
+ assert_equal(r.type, 12)
118
+ assert_equal(r.ack_result[ctx-0], 0)
119
+ assert_equal(r.ack_result[ctx-1], 2)
120
+
121
+ s.close
122
+ }
123
+ rescue Timeout::Error
124
+ flunk('timeout')
125
+ end
126
+ end
127
+ end
128
+
@@ -0,0 +1,103 @@
1
+ require 'rex/text'
2
+ require 'rex/proto/smb/constants'
3
+
4
+ module Rex
5
+ module Proto
6
+ module SMB
7
+ class Utils
8
+
9
+ CONST = Rex::Proto::SMB::Constants
10
+
11
+ # Creates an access mask for use with the CLIENT.open() call based on a string
12
+ def self.open_mode_to_access(str)
13
+ access = CONST::OPEN_ACCESS_READ | CONST::OPEN_SHARE_DENY_NONE
14
+ str.each_byte { |c|
15
+ case [c].pack('C').downcase
16
+ when 'w'
17
+ access |= CONST::OPEN_ACCESS_READWRITE
18
+ end
19
+ }
20
+ return access
21
+ end
22
+
23
+ # Creates a mode mask for use with the CLIENT.open() call based on a string
24
+ def self.open_mode_to_mode(str)
25
+ mode = 0
26
+
27
+ str.each_byte { |c|
28
+ case [c].pack('C').downcase
29
+ when 'x' # Fail if the file already exists
30
+ mode |= CONST::OPEN_MODE_EXCL
31
+ when 't' # Truncate the file if it already exists
32
+ mode |= CONST::OPEN_MODE_TRUNC
33
+ when 'c' # Create the file if it does not exist
34
+ mode |= CONST::OPEN_MODE_CREAT
35
+ when 'o' # Just open the file, clashes with x
36
+ mode |= CONST::OPEN_MODE_OPEN
37
+ end
38
+ }
39
+
40
+ return mode
41
+ end
42
+
43
+ # Returns a disposition value for smb.create based on permission string
44
+ def self.create_mode_to_disposition(str)
45
+ str.each_byte { |c|
46
+ case [c].pack('C').downcase
47
+ when 'c' # Create the file if it does not exist
48
+ return CONST::CREATE_ACCESS_OPENCREATE
49
+ when 'o' # Just open the file and fail if it does not exist
50
+ return CONST::CREATE_ACCESS_EXIST
51
+ end
52
+ }
53
+
54
+ return CONST::CREATE_ACCESS_OPENCREATE
55
+ end
56
+
57
+ # NOTE: the difference below came from: Time.utc("1970-1-1") - Time.utc("1601-1-1")
58
+
59
+ # Convert a 64-bit signed SMB time to a unix timestamp
60
+ def self.time_smb_to_unix(thi, tlo)
61
+ (((thi << 32) + tlo) / 10000000) - 11644473600
62
+ end
63
+
64
+ # Convert a unix timestamp to a 64-bit signed server time
65
+ def self.time_unix_to_smb(unix_time)
66
+ t64 = (unix_time + 11644473600) * 10000000
67
+ thi = (t64 & 0xffffffff00000000) >> 32
68
+ tlo = (t64 & 0x00000000ffffffff)
69
+ return [thi, tlo]
70
+ end
71
+
72
+ # Convert a name to its NetBIOS equivalent
73
+ def self.nbname_encode(str)
74
+ encoded = ''
75
+ for x in (0..15)
76
+ if (x >= str.length)
77
+ encoded << 'CA'
78
+ else
79
+ c = str[x, 1].upcase[0,1].unpack('C*')[0]
80
+ encoded << [ (c / 16) + 0x41, (c % 16) + 0x41 ].pack('CC')
81
+ end
82
+ end
83
+ return encoded
84
+ end
85
+
86
+ # Convert a name from its NetBIOS equivalent
87
+ def self.nbname_decode(str)
88
+ decoded = ''
89
+ str << 'A' if str.length % 2 != 0
90
+ while (str.length > 0)
91
+ two = str.slice!(0, 2).unpack('C*')
92
+ if (two.length == 2)
93
+ decoded << [ ((two[0] - 0x41) * 16) + two[1] - 0x41 ].pack('C')
94
+ end
95
+ end
96
+ return decoded
97
+ end
98
+
99
+
100
+ end
101
+ end
102
+ end
103
+ end