dstruct 0.0.1

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 (491) hide show
  1. checksums.yaml +15 -0
  2. data/README.markdown +23 -0
  3. data/examples/smb_example.rb +35 -0
  4. data/lib/rex.rb +108 -0
  5. data/lib/rex/LICENSE +29 -0
  6. data/lib/rex/arch.rb +104 -0
  7. data/lib/rex/arch/sparc.rb +75 -0
  8. data/lib/rex/arch/x86.rb +524 -0
  9. data/lib/rex/assembly/nasm.rb +104 -0
  10. data/lib/rex/codepage.map +104 -0
  11. data/lib/rex/compat.rb +389 -0
  12. data/lib/rex/constants.rb +124 -0
  13. data/lib/rex/elfparsey.rb +9 -0
  14. data/lib/rex/elfparsey/elf.rb +121 -0
  15. data/lib/rex/elfparsey/elfbase.rb +256 -0
  16. data/lib/rex/elfparsey/exceptions.rb +25 -0
  17. data/lib/rex/elfscan.rb +10 -0
  18. data/lib/rex/elfscan/scanner.rb +226 -0
  19. data/lib/rex/elfscan/search.rb +44 -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 +90 -0
  24. data/lib/rex/encoder/alpha2/unicode_mixed.rb +116 -0
  25. data/lib/rex/encoder/alpha2/unicode_upper.rb +123 -0
  26. data/lib/rex/encoder/bloxor/bloxor.rb +327 -0
  27. data/lib/rex/encoder/ndr.rb +90 -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 +107 -0
  31. data/lib/rex/encoder/xor.rb +69 -0
  32. data/lib/rex/encoder/xor/dword.rb +13 -0
  33. data/lib/rex/encoder/xor/dword_additive.rb +13 -0
  34. data/lib/rex/encoders/xor_dword.rb +35 -0
  35. data/lib/rex/encoders/xor_dword_additive.rb +53 -0
  36. data/lib/rex/encoding/xor.rb +20 -0
  37. data/lib/rex/encoding/xor/byte.rb +15 -0
  38. data/lib/rex/encoding/xor/dword.rb +21 -0
  39. data/lib/rex/encoding/xor/dword_additive.rb +92 -0
  40. data/lib/rex/encoding/xor/exceptions.rb +17 -0
  41. data/lib/rex/encoding/xor/generic.rb +146 -0
  42. data/lib/rex/encoding/xor/qword.rb +15 -0
  43. data/lib/rex/encoding/xor/word.rb +21 -0
  44. data/lib/rex/exceptions.rb +275 -0
  45. data/lib/rex/exploitation/cmdstager.rb +10 -0
  46. data/lib/rex/exploitation/cmdstager/base.rb +190 -0
  47. data/lib/rex/exploitation/cmdstager/bourne.rb +105 -0
  48. data/lib/rex/exploitation/cmdstager/debug_asm.rb +140 -0
  49. data/lib/rex/exploitation/cmdstager/debug_write.rb +134 -0
  50. data/lib/rex/exploitation/cmdstager/echo.rb +164 -0
  51. data/lib/rex/exploitation/cmdstager/printf.rb +122 -0
  52. data/lib/rex/exploitation/cmdstager/tftp.rb +71 -0
  53. data/lib/rex/exploitation/cmdstager/vbs.rb +126 -0
  54. data/lib/rex/exploitation/egghunter.rb +425 -0
  55. data/lib/rex/exploitation/encryptjs.rb +78 -0
  56. data/lib/rex/exploitation/heaplib.js.b64 +331 -0
  57. data/lib/rex/exploitation/heaplib.rb +107 -0
  58. data/lib/rex/exploitation/js.rb +6 -0
  59. data/lib/rex/exploitation/js/detect.rb +69 -0
  60. data/lib/rex/exploitation/js/memory.rb +81 -0
  61. data/lib/rex/exploitation/js/network.rb +84 -0
  62. data/lib/rex/exploitation/js/utils.rb +33 -0
  63. data/lib/rex/exploitation/jsobfu.rb +513 -0
  64. data/lib/rex/exploitation/obfuscatejs.rb +336 -0
  65. data/lib/rex/exploitation/omelet.rb +321 -0
  66. data/lib/rex/exploitation/opcodedb.rb +819 -0
  67. data/lib/rex/exploitation/powershell.rb +62 -0
  68. data/lib/rex/exploitation/powershell/function.rb +63 -0
  69. data/lib/rex/exploitation/powershell/obfu.rb +98 -0
  70. data/lib/rex/exploitation/powershell/output.rb +151 -0
  71. data/lib/rex/exploitation/powershell/param.rb +23 -0
  72. data/lib/rex/exploitation/powershell/parser.rb +183 -0
  73. data/lib/rex/exploitation/powershell/psh_methods.rb +70 -0
  74. data/lib/rex/exploitation/powershell/script.rb +99 -0
  75. data/lib/rex/exploitation/ropdb.rb +190 -0
  76. data/lib/rex/exploitation/seh.rb +93 -0
  77. data/lib/rex/file.rb +160 -0
  78. data/lib/rex/image_source.rb +10 -0
  79. data/lib/rex/image_source/disk.rb +58 -0
  80. data/lib/rex/image_source/image_source.rb +44 -0
  81. data/lib/rex/image_source/memory.rb +35 -0
  82. data/lib/rex/io/bidirectional_pipe.rb +161 -0
  83. data/lib/rex/io/datagram_abstraction.rb +35 -0
  84. data/lib/rex/io/ring_buffer.rb +369 -0
  85. data/lib/rex/io/stream.rb +312 -0
  86. data/lib/rex/io/stream_abstraction.rb +209 -0
  87. data/lib/rex/io/stream_server.rb +221 -0
  88. data/lib/rex/job_container.rb +200 -0
  89. data/lib/rex/logging.rb +4 -0
  90. data/lib/rex/logging/log_dispatcher.rb +180 -0
  91. data/lib/rex/logging/log_sink.rb +43 -0
  92. data/lib/rex/logging/sinks/flatfile.rb +56 -0
  93. data/lib/rex/logging/sinks/stderr.rb +44 -0
  94. data/lib/rex/mac_oui.rb +16581 -0
  95. data/lib/rex/machparsey.rb +9 -0
  96. data/lib/rex/machparsey/exceptions.rb +34 -0
  97. data/lib/rex/machparsey/mach.rb +209 -0
  98. data/lib/rex/machparsey/machbase.rb +408 -0
  99. data/lib/rex/machscan.rb +9 -0
  100. data/lib/rex/machscan/scanner.rb +217 -0
  101. data/lib/rex/mime.rb +10 -0
  102. data/lib/rex/mime/encoding.rb +17 -0
  103. data/lib/rex/mime/header.rb +78 -0
  104. data/lib/rex/mime/message.rb +150 -0
  105. data/lib/rex/mime/part.rb +50 -0
  106. data/lib/rex/nop/opty2.rb +109 -0
  107. data/lib/rex/nop/opty2_tables.rb +301 -0
  108. data/lib/rex/ole.rb +202 -0
  109. data/lib/rex/ole/clsid.rb +44 -0
  110. data/lib/rex/ole/difat.rb +138 -0
  111. data/lib/rex/ole/directory.rb +228 -0
  112. data/lib/rex/ole/direntry.rb +237 -0
  113. data/lib/rex/ole/docs/dependencies.txt +8 -0
  114. data/lib/rex/ole/docs/references.txt +1 -0
  115. data/lib/rex/ole/fat.rb +96 -0
  116. data/lib/rex/ole/header.rb +201 -0
  117. data/lib/rex/ole/minifat.rb +74 -0
  118. data/lib/rex/ole/propset.rb +141 -0
  119. data/lib/rex/ole/samples/create_ole.rb +27 -0
  120. data/lib/rex/ole/samples/dir.rb +35 -0
  121. data/lib/rex/ole/samples/dump_stream.rb +34 -0
  122. data/lib/rex/ole/samples/ole_info.rb +23 -0
  123. data/lib/rex/ole/storage.rb +392 -0
  124. data/lib/rex/ole/stream.rb +50 -0
  125. data/lib/rex/ole/substorage.rb +46 -0
  126. data/lib/rex/ole/util.rb +154 -0
  127. data/lib/rex/parser/acunetix_nokogiri.rb +406 -0
  128. data/lib/rex/parser/apple_backup_manifestdb.rb +132 -0
  129. data/lib/rex/parser/appscan_nokogiri.rb +367 -0
  130. data/lib/rex/parser/arguments.rb +108 -0
  131. data/lib/rex/parser/burp_session_nokogiri.rb +291 -0
  132. data/lib/rex/parser/ci_nokogiri.rb +193 -0
  133. data/lib/rex/parser/foundstone_nokogiri.rb +342 -0
  134. data/lib/rex/parser/fusionvm_nokogiri.rb +109 -0
  135. data/lib/rex/parser/group_policy_preferences.rb +185 -0
  136. data/lib/rex/parser/ini.rb +186 -0
  137. data/lib/rex/parser/ip360_aspl_xml.rb +103 -0
  138. data/lib/rex/parser/ip360_xml.rb +98 -0
  139. data/lib/rex/parser/mbsa_nokogiri.rb +256 -0
  140. data/lib/rex/parser/nessus_xml.rb +121 -0
  141. data/lib/rex/parser/netsparker_xml.rb +109 -0
  142. data/lib/rex/parser/nexpose_raw_nokogiri.rb +686 -0
  143. data/lib/rex/parser/nexpose_simple_nokogiri.rb +330 -0
  144. data/lib/rex/parser/nexpose_xml.rb +172 -0
  145. data/lib/rex/parser/nmap_nokogiri.rb +394 -0
  146. data/lib/rex/parser/nmap_xml.rb +166 -0
  147. data/lib/rex/parser/nokogiri_doc_mixin.rb +233 -0
  148. data/lib/rex/parser/openvas_nokogiri.rb +172 -0
  149. data/lib/rex/parser/outpost24_nokogiri.rb +240 -0
  150. data/lib/rex/parser/retina_xml.rb +110 -0
  151. data/lib/rex/parser/unattend.rb +171 -0
  152. data/lib/rex/parser/wapiti_nokogiri.rb +105 -0
  153. data/lib/rex/payloads.rb +2 -0
  154. data/lib/rex/payloads/win32.rb +3 -0
  155. data/lib/rex/payloads/win32/common.rb +27 -0
  156. data/lib/rex/payloads/win32/kernel.rb +54 -0
  157. data/lib/rex/payloads/win32/kernel/common.rb +55 -0
  158. data/lib/rex/payloads/win32/kernel/migration.rb +13 -0
  159. data/lib/rex/payloads/win32/kernel/recovery.rb +51 -0
  160. data/lib/rex/payloads/win32/kernel/stager.rb +195 -0
  161. data/lib/rex/peparsey.rb +10 -0
  162. data/lib/rex/peparsey/exceptions.rb +30 -0
  163. data/lib/rex/peparsey/pe.rb +210 -0
  164. data/lib/rex/peparsey/pe_memdump.rb +61 -0
  165. data/lib/rex/peparsey/pebase.rb +1662 -0
  166. data/lib/rex/peparsey/section.rb +128 -0
  167. data/lib/rex/pescan.rb +11 -0
  168. data/lib/rex/pescan/analyze.rb +366 -0
  169. data/lib/rex/pescan/scanner.rb +230 -0
  170. data/lib/rex/pescan/search.rb +68 -0
  171. data/lib/rex/platforms.rb +2 -0
  172. data/lib/rex/platforms/windows.rb +52 -0
  173. data/lib/rex/poly.rb +134 -0
  174. data/lib/rex/poly/block.rb +480 -0
  175. data/lib/rex/poly/machine.rb +13 -0
  176. data/lib/rex/poly/machine/machine.rb +830 -0
  177. data/lib/rex/poly/machine/x86.rb +509 -0
  178. data/lib/rex/poly/register.rb +101 -0
  179. data/lib/rex/poly/register/x86.rb +41 -0
  180. data/lib/rex/post.rb +7 -0
  181. data/lib/rex/post/dir.rb +51 -0
  182. data/lib/rex/post/file.rb +172 -0
  183. data/lib/rex/post/file_stat.rb +220 -0
  184. data/lib/rex/post/gen.pl +13 -0
  185. data/lib/rex/post/io.rb +182 -0
  186. data/lib/rex/post/meterpreter.rb +5 -0
  187. data/lib/rex/post/meterpreter/channel.rb +446 -0
  188. data/lib/rex/post/meterpreter/channel_container.rb +54 -0
  189. data/lib/rex/post/meterpreter/channels/pool.rb +160 -0
  190. data/lib/rex/post/meterpreter/channels/pools/file.rb +62 -0
  191. data/lib/rex/post/meterpreter/channels/pools/stream_pool.rb +103 -0
  192. data/lib/rex/post/meterpreter/channels/stream.rb +87 -0
  193. data/lib/rex/post/meterpreter/client.rb +483 -0
  194. data/lib/rex/post/meterpreter/client_core.rb +352 -0
  195. data/lib/rex/post/meterpreter/dependencies.rb +3 -0
  196. data/lib/rex/post/meterpreter/extension.rb +32 -0
  197. data/lib/rex/post/meterpreter/extensions/android/android.rb +128 -0
  198. data/lib/rex/post/meterpreter/extensions/android/tlv.rb +40 -0
  199. data/lib/rex/post/meterpreter/extensions/espia/espia.rb +58 -0
  200. data/lib/rex/post/meterpreter/extensions/espia/tlv.rb +17 -0
  201. data/lib/rex/post/meterpreter/extensions/extapi/adsi/adsi.rb +71 -0
  202. data/lib/rex/post/meterpreter/extensions/extapi/clipboard/clipboard.rb +169 -0
  203. data/lib/rex/post/meterpreter/extensions/extapi/extapi.rb +45 -0
  204. data/lib/rex/post/meterpreter/extensions/extapi/service/service.rb +104 -0
  205. data/lib/rex/post/meterpreter/extensions/extapi/tlv.rb +77 -0
  206. data/lib/rex/post/meterpreter/extensions/extapi/window/window.rb +56 -0
  207. data/lib/rex/post/meterpreter/extensions/extapi/wmi/wmi.rb +75 -0
  208. data/lib/rex/post/meterpreter/extensions/incognito/incognito.rb +94 -0
  209. data/lib/rex/post/meterpreter/extensions/incognito/tlv.rb +22 -0
  210. data/lib/rex/post/meterpreter/extensions/kiwi/kiwi.rb +361 -0
  211. data/lib/rex/post/meterpreter/extensions/kiwi/tlv.rb +76 -0
  212. data/lib/rex/post/meterpreter/extensions/lanattacks/dhcp/dhcp.rb +78 -0
  213. data/lib/rex/post/meterpreter/extensions/lanattacks/lanattacks.rb +43 -0
  214. data/lib/rex/post/meterpreter/extensions/lanattacks/tftp/tftp.rb +49 -0
  215. data/lib/rex/post/meterpreter/extensions/lanattacks/tlv.rb +17 -0
  216. data/lib/rex/post/meterpreter/extensions/mimikatz/mimikatz.rb +128 -0
  217. data/lib/rex/post/meterpreter/extensions/mimikatz/tlv.rb +16 -0
  218. data/lib/rex/post/meterpreter/extensions/networkpug/networkpug.rb +57 -0
  219. data/lib/rex/post/meterpreter/extensions/networkpug/tlv.rb +16 -0
  220. data/lib/rex/post/meterpreter/extensions/priv/fs.rb +118 -0
  221. data/lib/rex/post/meterpreter/extensions/priv/passwd.rb +61 -0
  222. data/lib/rex/post/meterpreter/extensions/priv/priv.rb +109 -0
  223. data/lib/rex/post/meterpreter/extensions/priv/tlv.rb +29 -0
  224. data/lib/rex/post/meterpreter/extensions/sniffer/sniffer.rb +117 -0
  225. data/lib/rex/post/meterpreter/extensions/sniffer/tlv.rb +27 -0
  226. data/lib/rex/post/meterpreter/extensions/stdapi/constants.rb +396 -0
  227. data/lib/rex/post/meterpreter/extensions/stdapi/fs/dir.rb +284 -0
  228. data/lib/rex/post/meterpreter/extensions/stdapi/fs/file.rb +399 -0
  229. data/lib/rex/post/meterpreter/extensions/stdapi/fs/file_stat.rb +104 -0
  230. data/lib/rex/post/meterpreter/extensions/stdapi/fs/io.rb +48 -0
  231. data/lib/rex/post/meterpreter/extensions/stdapi/net/arp.rb +59 -0
  232. data/lib/rex/post/meterpreter/extensions/stdapi/net/config.rb +256 -0
  233. data/lib/rex/post/meterpreter/extensions/stdapi/net/interface.rb +129 -0
  234. data/lib/rex/post/meterpreter/extensions/stdapi/net/netstat.rb +97 -0
  235. data/lib/rex/post/meterpreter/extensions/stdapi/net/resolve.rb +106 -0
  236. data/lib/rex/post/meterpreter/extensions/stdapi/net/route.rb +67 -0
  237. data/lib/rex/post/meterpreter/extensions/stdapi/net/socket.rb +139 -0
  238. data/lib/rex/post/meterpreter/extensions/stdapi/net/socket_subsystem/tcp_client_channel.rb +180 -0
  239. data/lib/rex/post/meterpreter/extensions/stdapi/net/socket_subsystem/tcp_server_channel.rb +168 -0
  240. data/lib/rex/post/meterpreter/extensions/stdapi/net/socket_subsystem/udp_channel.rb +209 -0
  241. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/api_constants.rb +38146 -0
  242. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/buffer_item.rb +48 -0
  243. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_advapi32.rb +2102 -0
  244. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_crypt32.rb +32 -0
  245. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_iphlpapi.rb +97 -0
  246. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_kernel32.rb +3852 -0
  247. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_netapi32.rb +100 -0
  248. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_ntdll.rb +168 -0
  249. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_psapi.rb +32 -0
  250. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_shell32.rb +32 -0
  251. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_user32.rb +3170 -0
  252. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_version.rb +41 -0
  253. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_wlanapi.rb +87 -0
  254. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_wldap32.rb +128 -0
  255. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_ws2_32.rb +613 -0
  256. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll.rb +388 -0
  257. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_function.rb +111 -0
  258. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_helper.rb +149 -0
  259. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_wrapper.rb +27 -0
  260. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/mock_magic.rb +515 -0
  261. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/multicall.rb +319 -0
  262. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/platform_util.rb +23 -0
  263. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/railgun.rb +301 -0
  264. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/tlv.rb +56 -0
  265. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/type/pointer_util.rb +106 -0
  266. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/util.rb +676 -0
  267. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/win_const_manager.rb +96 -0
  268. data/lib/rex/post/meterpreter/extensions/stdapi/stdapi.rb +151 -0
  269. data/lib/rex/post/meterpreter/extensions/stdapi/sys/config.rb +128 -0
  270. data/lib/rex/post/meterpreter/extensions/stdapi/sys/event_log.rb +192 -0
  271. data/lib/rex/post/meterpreter/extensions/stdapi/sys/event_log_subsystem/event_record.rb +41 -0
  272. data/lib/rex/post/meterpreter/extensions/stdapi/sys/power.rb +60 -0
  273. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process.rb +408 -0
  274. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/image.rb +129 -0
  275. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/io.rb +55 -0
  276. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/memory.rb +336 -0
  277. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/thread.rb +141 -0
  278. data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry.rb +328 -0
  279. data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry_subsystem/registry_key.rb +193 -0
  280. data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry_subsystem/registry_value.rb +102 -0
  281. data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry_subsystem/remote_registry_key.rb +188 -0
  282. data/lib/rex/post/meterpreter/extensions/stdapi/sys/thread.rb +180 -0
  283. data/lib/rex/post/meterpreter/extensions/stdapi/tlv.rb +236 -0
  284. data/lib/rex/post/meterpreter/extensions/stdapi/ui.rb +259 -0
  285. data/lib/rex/post/meterpreter/extensions/stdapi/webcam/webcam.rb +201 -0
  286. data/lib/rex/post/meterpreter/inbound_packet_handler.rb +30 -0
  287. data/lib/rex/post/meterpreter/object_aliases.rb +83 -0
  288. data/lib/rex/post/meterpreter/packet.rb +709 -0
  289. data/lib/rex/post/meterpreter/packet_dispatcher.rb +543 -0
  290. data/lib/rex/post/meterpreter/packet_parser.rb +94 -0
  291. data/lib/rex/post/meterpreter/packet_response_waiter.rb +83 -0
  292. data/lib/rex/post/meterpreter/ui/console.rb +142 -0
  293. data/lib/rex/post/meterpreter/ui/console/command_dispatcher.rb +86 -0
  294. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/android.rb +383 -0
  295. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/core.rb +939 -0
  296. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/espia.rb +109 -0
  297. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi.rb +65 -0
  298. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi/adsi.rb +198 -0
  299. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi/clipboard.rb +444 -0
  300. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi/service.rb +199 -0
  301. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi/window.rb +118 -0
  302. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi/wmi.rb +108 -0
  303. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/incognito.rb +242 -0
  304. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/kiwi.rb +509 -0
  305. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/lanattacks.rb +60 -0
  306. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/lanattacks/dhcp.rb +254 -0
  307. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/lanattacks/tftp.rb +159 -0
  308. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/mimikatz.rb +182 -0
  309. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/networkpug.rb +232 -0
  310. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv.rb +62 -0
  311. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv/elevate.rb +97 -0
  312. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv/passwd.rb +52 -0
  313. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv/timestomp.rb +133 -0
  314. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/sniffer.rb +204 -0
  315. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi.rb +66 -0
  316. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/fs.rb +527 -0
  317. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/net.rb +448 -0
  318. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/sys.rb +906 -0
  319. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/ui.rb +318 -0
  320. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/webcam.rb +343 -0
  321. data/lib/rex/post/meterpreter/ui/console/interactive_channel.rb +99 -0
  322. data/lib/rex/post/permission.rb +26 -0
  323. data/lib/rex/post/process.rb +57 -0
  324. data/lib/rex/post/thread.rb +57 -0
  325. data/lib/rex/post/ui.rb +52 -0
  326. data/lib/rex/proto.rb +15 -0
  327. data/lib/rex/proto/addp.rb +218 -0
  328. data/lib/rex/proto/dcerpc.rb +7 -0
  329. data/lib/rex/proto/dcerpc/client.rb +362 -0
  330. data/lib/rex/proto/dcerpc/exceptions.rb +151 -0
  331. data/lib/rex/proto/dcerpc/handle.rb +48 -0
  332. data/lib/rex/proto/dcerpc/ndr.rb +73 -0
  333. data/lib/rex/proto/dcerpc/packet.rb +264 -0
  334. data/lib/rex/proto/dcerpc/response.rb +188 -0
  335. data/lib/rex/proto/dcerpc/uuid.rb +85 -0
  336. data/lib/rex/proto/dcerpc/wdscp.rb +3 -0
  337. data/lib/rex/proto/dcerpc/wdscp/constants.rb +89 -0
  338. data/lib/rex/proto/dcerpc/wdscp/packet.rb +94 -0
  339. data/lib/rex/proto/dhcp.rb +7 -0
  340. data/lib/rex/proto/dhcp/constants.rb +34 -0
  341. data/lib/rex/proto/dhcp/server.rb +334 -0
  342. data/lib/rex/proto/drda.rb +6 -0
  343. data/lib/rex/proto/drda/constants.rb +50 -0
  344. data/lib/rex/proto/drda/packet.rb +253 -0
  345. data/lib/rex/proto/drda/utils.rb +124 -0
  346. data/lib/rex/proto/http.rb +7 -0
  347. data/lib/rex/proto/http/client.rb +722 -0
  348. data/lib/rex/proto/http/client_request.rb +472 -0
  349. data/lib/rex/proto/http/handler.rb +47 -0
  350. data/lib/rex/proto/http/handler/erb.rb +129 -0
  351. data/lib/rex/proto/http/handler/proc.rb +61 -0
  352. data/lib/rex/proto/http/header.rb +173 -0
  353. data/lib/rex/proto/http/packet.rb +414 -0
  354. data/lib/rex/proto/http/request.rb +354 -0
  355. data/lib/rex/proto/http/response.rb +151 -0
  356. data/lib/rex/proto/http/server.rb +385 -0
  357. data/lib/rex/proto/iax2.rb +2 -0
  358. data/lib/rex/proto/iax2/call.rb +326 -0
  359. data/lib/rex/proto/iax2/client.rb +218 -0
  360. data/lib/rex/proto/iax2/codecs.rb +5 -0
  361. data/lib/rex/proto/iax2/codecs/alaw.rb +16 -0
  362. data/lib/rex/proto/iax2/codecs/g711.rb +2176 -0
  363. data/lib/rex/proto/iax2/codecs/mulaw.rb +17 -0
  364. data/lib/rex/proto/iax2/constants.rb +262 -0
  365. data/lib/rex/proto/ipmi.rb +57 -0
  366. data/lib/rex/proto/ipmi/channel_auth_reply.rb +89 -0
  367. data/lib/rex/proto/ipmi/open_session_reply.rb +36 -0
  368. data/lib/rex/proto/ipmi/rakp2.rb +36 -0
  369. data/lib/rex/proto/ipmi/utils.rb +125 -0
  370. data/lib/rex/proto/natpmp.rb +7 -0
  371. data/lib/rex/proto/natpmp/constants.rb +19 -0
  372. data/lib/rex/proto/natpmp/packet.rb +45 -0
  373. data/lib/rex/proto/ntlm.rb +8 -0
  374. data/lib/rex/proto/ntlm/base.rb +327 -0
  375. data/lib/rex/proto/ntlm/constants.rb +75 -0
  376. data/lib/rex/proto/ntlm/crypt.rb +412 -0
  377. data/lib/rex/proto/ntlm/exceptions.rb +17 -0
  378. data/lib/rex/proto/ntlm/message.rb +534 -0
  379. data/lib/rex/proto/ntlm/utils.rb +765 -0
  380. data/lib/rex/proto/ntp.rb +3 -0
  381. data/lib/rex/proto/ntp/constants.rb +12 -0
  382. data/lib/rex/proto/ntp/modes.rb +130 -0
  383. data/lib/rex/proto/pjl.rb +31 -0
  384. data/lib/rex/proto/pjl/client.rb +163 -0
  385. data/lib/rex/proto/proxy/socks4a.rb +441 -0
  386. data/lib/rex/proto/rfb.rb +13 -0
  387. data/lib/rex/proto/rfb/cipher.rb +82 -0
  388. data/lib/rex/proto/rfb/client.rb +205 -0
  389. data/lib/rex/proto/rfb/constants.rb +50 -0
  390. data/lib/rex/proto/sip.rb +4 -0
  391. data/lib/rex/proto/sip/response.rb +61 -0
  392. data/lib/rex/proto/smb.rb +8 -0
  393. data/lib/rex/proto/smb/client.rb +2064 -0
  394. data/lib/rex/proto/smb/constants.rb +1064 -0
  395. data/lib/rex/proto/smb/crypt.rb +37 -0
  396. data/lib/rex/proto/smb/evasions.rb +67 -0
  397. data/lib/rex/proto/smb/exceptions.rb +867 -0
  398. data/lib/rex/proto/smb/simpleclient.rb +173 -0
  399. data/lib/rex/proto/smb/simpleclient/open_file.rb +106 -0
  400. data/lib/rex/proto/smb/simpleclient/open_pipe.rb +57 -0
  401. data/lib/rex/proto/smb/utils.rb +104 -0
  402. data/lib/rex/proto/sunrpc.rb +2 -0
  403. data/lib/rex/proto/sunrpc/client.rb +196 -0
  404. data/lib/rex/proto/tftp.rb +13 -0
  405. data/lib/rex/proto/tftp/client.rb +344 -0
  406. data/lib/rex/proto/tftp/constants.rb +39 -0
  407. data/lib/rex/proto/tftp/server.rb +497 -0
  408. data/lib/rex/random_identifier_generator.rb +177 -0
  409. data/lib/rex/registry.rb +14 -0
  410. data/lib/rex/registry/hive.rb +132 -0
  411. data/lib/rex/registry/lfkey.rb +51 -0
  412. data/lib/rex/registry/nodekey.rb +54 -0
  413. data/lib/rex/registry/regf.rb +25 -0
  414. data/lib/rex/registry/valuekey.rb +67 -0
  415. data/lib/rex/registry/valuelist.rb +29 -0
  416. data/lib/rex/ropbuilder.rb +8 -0
  417. data/lib/rex/ropbuilder/rop.rb +271 -0
  418. data/lib/rex/script.rb +42 -0
  419. data/lib/rex/script/base.rb +61 -0
  420. data/lib/rex/script/meterpreter.rb +16 -0
  421. data/lib/rex/script/shell.rb +10 -0
  422. data/lib/rex/service.rb +49 -0
  423. data/lib/rex/service_manager.rb +154 -0
  424. data/lib/rex/services/local_relay.rb +424 -0
  425. data/lib/rex/socket.rb +788 -0
  426. data/lib/rex/socket/comm.rb +120 -0
  427. data/lib/rex/socket/comm/local.rb +526 -0
  428. data/lib/rex/socket/ip.rb +132 -0
  429. data/lib/rex/socket/parameters.rb +363 -0
  430. data/lib/rex/socket/range_walker.rb +470 -0
  431. data/lib/rex/socket/ssl_tcp.rb +345 -0
  432. data/lib/rex/socket/ssl_tcp_server.rb +188 -0
  433. data/lib/rex/socket/subnet_walker.rb +76 -0
  434. data/lib/rex/socket/switch_board.rb +289 -0
  435. data/lib/rex/socket/tcp.rb +79 -0
  436. data/lib/rex/socket/tcp_server.rb +67 -0
  437. data/lib/rex/socket/udp.rb +165 -0
  438. data/lib/rex/sslscan/result.rb +201 -0
  439. data/lib/rex/sslscan/scanner.rb +206 -0
  440. data/lib/rex/struct2.rb +5 -0
  441. data/lib/rex/struct2/c_struct.rb +181 -0
  442. data/lib/rex/struct2/c_struct_template.rb +39 -0
  443. data/lib/rex/struct2/constant.rb +26 -0
  444. data/lib/rex/struct2/element.rb +44 -0
  445. data/lib/rex/struct2/generic.rb +73 -0
  446. data/lib/rex/struct2/restraint.rb +54 -0
  447. data/lib/rex/struct2/s_string.rb +72 -0
  448. data/lib/rex/struct2/s_struct.rb +111 -0
  449. data/lib/rex/sync.rb +6 -0
  450. data/lib/rex/sync/event.rb +85 -0
  451. data/lib/rex/sync/read_write_lock.rb +177 -0
  452. data/lib/rex/sync/ref.rb +58 -0
  453. data/lib/rex/sync/thread_safe.rb +83 -0
  454. data/lib/rex/text.rb +1813 -0
  455. data/lib/rex/thread_factory.rb +43 -0
  456. data/lib/rex/time.rb +66 -0
  457. data/lib/rex/transformer.rb +116 -0
  458. data/lib/rex/ui.rb +22 -0
  459. data/lib/rex/ui/interactive.rb +304 -0
  460. data/lib/rex/ui/output.rb +85 -0
  461. data/lib/rex/ui/output/none.rb +19 -0
  462. data/lib/rex/ui/progress_tracker.rb +97 -0
  463. data/lib/rex/ui/subscriber.rb +160 -0
  464. data/lib/rex/ui/text/color.rb +98 -0
  465. data/lib/rex/ui/text/dispatcher_shell.rb +538 -0
  466. data/lib/rex/ui/text/input.rb +119 -0
  467. data/lib/rex/ui/text/input/buffer.rb +79 -0
  468. data/lib/rex/ui/text/input/readline.rb +129 -0
  469. data/lib/rex/ui/text/input/socket.rb +96 -0
  470. data/lib/rex/ui/text/input/stdio.rb +46 -0
  471. data/lib/rex/ui/text/irb_shell.rb +62 -0
  472. data/lib/rex/ui/text/output.rb +86 -0
  473. data/lib/rex/ui/text/output/buffer.rb +62 -0
  474. data/lib/rex/ui/text/output/buffer/stdout.rb +26 -0
  475. data/lib/rex/ui/text/output/file.rb +44 -0
  476. data/lib/rex/ui/text/output/socket.rb +44 -0
  477. data/lib/rex/ui/text/output/stdio.rb +53 -0
  478. data/lib/rex/ui/text/output/tee.rb +56 -0
  479. data/lib/rex/ui/text/progress_tracker.rb +57 -0
  480. data/lib/rex/ui/text/shell.rb +403 -0
  481. data/lib/rex/ui/text/table.rb +346 -0
  482. data/lib/rex/zip.rb +96 -0
  483. data/lib/rex/zip/archive.rb +130 -0
  484. data/lib/rex/zip/blocks.rb +184 -0
  485. data/lib/rex/zip/entry.rb +122 -0
  486. data/lib/rex/zip/jar.rb +283 -0
  487. data/lib/rex/zip/samples/comment.rb +32 -0
  488. data/lib/rex/zip/samples/mkwar.rb +138 -0
  489. data/lib/rex/zip/samples/mkzip.rb +19 -0
  490. data/lib/rex/zip/samples/recursive.rb +58 -0
  491. metadata +536 -0
@@ -0,0 +1,101 @@
1
+ # -*- coding: binary -*-
2
+ module Rex
3
+ module Poly
4
+
5
+ ###
6
+ #
7
+ # This class represents a register that is used in the context of one or more
8
+ # logical blocks. The register number is assigned on demand or is statically
9
+ # specified if passed in to the constructor.
10
+ #
11
+ ###
12
+ class LogicalRegister
13
+
14
+ require 'rex/poly/register/x86'
15
+
16
+ #
17
+ # This class method is meant to return an array of register numbers that
18
+ # can be used to pool from. Architecture specific classes must implement
19
+ # this method on their own.
20
+ #
21
+ def self.regnum_set
22
+ nil
23
+ end
24
+
25
+ #
26
+ # Initializes the register's name and number, if assigned. If a register
27
+ # number is specified, the instance will be assumed to have a statically
28
+ # assigned register number. The name is meant to be used as a symbolic
29
+ # variable name, such as 'counter' or 'key'.
30
+ #
31
+ def initialize(name, regnum = nil)
32
+ @name = name
33
+ @regnum = regnum
34
+ @static = (regnum) ? true : false
35
+ end
36
+
37
+ #
38
+ # Returns true if the register number should be assumed static.
39
+ #
40
+ def static?
41
+ @static
42
+ end
43
+
44
+ #
45
+ # Sets the register number to the value specified. If the register number
46
+ # is declared static, a RuntimeError exception is raised.
47
+ #
48
+ def regnum=(val)
49
+ raise RuntimeError, "Attempted to assign regnum to static register" if (static?)
50
+
51
+ @regnum = val
52
+ end
53
+
54
+ #
55
+ # Returns the register number that has currently been assigned. If no
56
+ # register number is assigned, an InvalidRegisterError exception is raised.
57
+ # This exception can be used to assign the LogicalRegister instance a
58
+ # register number on demand.
59
+ #
60
+ def regnum
61
+ raise InvalidRegisterError.new(self), "Register has not been assigned" if (@regnum == nil)
62
+
63
+ @regnum
64
+ end
65
+
66
+ #
67
+ # Returns the variable (friendly) name for the register that was passed to
68
+ # the constructor.
69
+ #
70
+ attr_reader :name
71
+
72
+ protected
73
+
74
+ end
75
+
76
+ ###
77
+ #
78
+ # An exception that is raised when the regnum method is accessed on a
79
+ # LogicalRegister that does not currently have a regnum assigned to it.
80
+ #
81
+ ###
82
+ class InvalidRegisterError < RuntimeError
83
+
84
+ #
85
+ # Initializes the exception with the instance that lead to the generation
86
+ # of the exception such that it can be assigned a register number as
87
+ # needed.
88
+ #
89
+ def initialize(reg)
90
+ @reg = reg
91
+ end
92
+
93
+ #
94
+ # The LogicalRegister instance that generated the exception.
95
+ #
96
+ attr_reader :reg
97
+
98
+ end
99
+
100
+ end
101
+ end
@@ -0,0 +1,41 @@
1
+ # -*- coding: binary -*-
2
+ require 'rex/arch/x86'
3
+
4
+ module Rex
5
+ module Poly
6
+
7
+ ###
8
+ #
9
+ # This class encapsulates logical registers for the X86 architecture.
10
+ #
11
+ ###
12
+ class LogicalRegister::X86 < LogicalRegister
13
+
14
+ #
15
+ # The default set of register numbers that can be used on x86.
16
+ #
17
+ def self.regnum_set
18
+ [
19
+ Rex::Arch::X86::EAX,
20
+ Rex::Arch::X86::EBX,
21
+ Rex::Arch::X86::ECX,
22
+ Rex::Arch::X86::EDX,
23
+ Rex::Arch::X86::ESI,
24
+ Rex::Arch::X86::EDI,
25
+ Rex::Arch::X86::EBP,
26
+ Rex::Arch::X86::ESP
27
+ ]
28
+ end
29
+
30
+ #
31
+ # Calls the base class constructor after translating the register name to
32
+ # number.
33
+ #
34
+ def initialize(name, register = nil)
35
+ super(name, register ? Rex::Arch::X86.reg_number(register) : nil)
36
+ end
37
+
38
+ end
39
+
40
+ end
41
+ end
@@ -0,0 +1,7 @@
1
+ # -*- coding: binary -*-
2
+
3
+ # General independent containers
4
+ require 'rex/post/permission'
5
+
6
+ # Post-exploitation clients
7
+ require 'rex/post/meterpreter'
@@ -0,0 +1,51 @@
1
+ # -*- coding: binary -*-
2
+
3
+ module Rex
4
+ module Post
5
+
6
+ ###
7
+ #
8
+ # This class wraps the behavior of the Ruby Dir class against a remote entity.
9
+ # Refer to the Ruby documentation for expected behavior.
10
+ #
11
+ ###
12
+ class Dir
13
+
14
+ def Dir.entries(name)
15
+ raise NotImplementedError
16
+ end
17
+
18
+ def Dir.foreach(name, &block)
19
+ entries(name).each(&block)
20
+ end
21
+
22
+ def Dir.chdir(path)
23
+ raise NotImplementedError
24
+ end
25
+
26
+ def Dir.mkdir(path)
27
+ raise NotImplementedError
28
+ end
29
+
30
+ def Dir.pwd
31
+ raise NotImplementedError
32
+ end
33
+
34
+ def Dir.getwd
35
+ raise NotImplementedError
36
+ end
37
+
38
+ def Dir.delete(path)
39
+ raise NotImplementedError
40
+ end
41
+
42
+ def Dir.rmdir(path)
43
+ raise NotImplementedError
44
+ end
45
+
46
+ def Dir.unlink(path)
47
+ raise NotImplementedError
48
+ end
49
+ end
50
+
51
+ end; end # Post/Rex
@@ -0,0 +1,172 @@
1
+ # -*- coding: binary -*-
2
+
3
+ require 'rex/post/io'
4
+
5
+ module Rex
6
+ module Post
7
+
8
+ # make this a module so we can mix it in, and have inheritence like..
9
+ # => [Rex::Post::DispatchNinja::File, Rex::Post::File,
10
+ # Rex::Post::DispatchNinja::IO, Rex::Post::IO, Object, Kernel]
11
+
12
+ ###
13
+ #
14
+ # This module simulates the behavior that one would expect from the Ruby File
15
+ # class against a remote entity. Refer to the ruby documentation for expected
16
+ # behavior.
17
+ #
18
+ ###
19
+ module File
20
+
21
+ protected
22
+ # inherits fd and mode from IO
23
+ attr_accessor :filename
24
+ public
25
+
26
+ # f = File.new("testfile", "r")
27
+ # f = File.new("newfile", "w+")
28
+ # f = File.new("newfile", File::CREAT|File::TRUNC|File::RDWR, 0644)
29
+ # !!! I suppose I should figure out the correct default for perm..
30
+ def initialize(name, mode='r', perm=0)
31
+ end
32
+
33
+ def path
34
+ filename
35
+ end
36
+
37
+ # ctime/atime blah need fstat..
38
+ # need lchown/chown/fchown, etc, etc
39
+
40
+ # proxy these methods
41
+ def File.basename(*a)
42
+ ::File.basename(*a)
43
+ end
44
+ def File.dirname(*a)
45
+ ::File.dirname(*a)
46
+ end
47
+ def File.extname(*a)
48
+ ::File.extname(*a)
49
+ end
50
+ # !!! we might actually want to handle this File::SEPERATOR stuff
51
+ # for win32 support, etc.
52
+ def File.join(*a)
53
+ ::File.join(*a)
54
+ end
55
+
56
+ def File.chmod
57
+ raise NotImplementedError
58
+ end
59
+ def File.chown
60
+ raise NotImplementedError
61
+ end
62
+ def File.delete(*a)
63
+ unlink(*a)
64
+ end
65
+ def File.unlink
66
+ raise NotImplementedError
67
+ end
68
+ def File.lchmod
69
+ raise NotImplementedError
70
+ end
71
+ def File.lchown
72
+ raise NotImplementedError
73
+ end
74
+ def File.link
75
+ raise NotImplementedError
76
+ end
77
+ def File.lstat
78
+ raise NotImplementedError
79
+ end
80
+
81
+ # this, along with all the other globbing/search stuff, probably
82
+ # won't get implemented, atleast for a bit...
83
+ def File.expand_path
84
+ raise NotImplementedError
85
+ end
86
+ def File.fnmatch(*a)
87
+ fnmatch?(*a)
88
+ end
89
+ def File.fnmatch?
90
+ raise NotImplementedError
91
+ end
92
+
93
+ #
94
+ # autogen'd stat passthroughs
95
+ #
96
+ def File.atime(name)
97
+ stat(name).atime
98
+ end
99
+ def File.blockdev?(name)
100
+ stat(name).blockdev?
101
+ end
102
+ def File.chardev?(name)
103
+ stat(name).chardev?
104
+ end
105
+ def File.ctime(name)
106
+ stat(name).ctime
107
+ end
108
+ def File.directory?(name)
109
+ stat(name).directory?
110
+ end
111
+ def File.executable?(name)
112
+ stat(name).executable?
113
+ end
114
+ def File.executable_real?(name)
115
+ stat(name).executable_real?
116
+ end
117
+ def File.file?(name)
118
+ stat(name).file?
119
+ end
120
+ def File.ftype(name)
121
+ stat(name).ftype
122
+ end
123
+ def File.grpowned?(name)
124
+ stat(name).grpowned?
125
+ end
126
+ def File.mtime(name)
127
+ stat(name).mtime
128
+ end
129
+ def File.owned?(name)
130
+ stat(name).owned?
131
+ end
132
+ def File.pipe?(name)
133
+ stat(name).pipe?
134
+ end
135
+ def File.readable?(name)
136
+ stat(name).readable?
137
+ end
138
+ def File.readable_real?(name)
139
+ stat(name).readable_real?
140
+ end
141
+ def File.setuid?(name)
142
+ stat(name).setuid?
143
+ end
144
+ def File.setgid?(name)
145
+ stat(name).setgid?
146
+ end
147
+ def File.size(name)
148
+ stat(name).size
149
+ end
150
+ def File.socket?(name)
151
+ stat(name).socket?
152
+ end
153
+ def File.sticky?(name)
154
+ stat(name).sticky?
155
+ end
156
+ def File.symlink?(name)
157
+ stat(name).symlink?
158
+ end
159
+ def File.writeable?(name)
160
+ stat(name).writeable?
161
+ end
162
+ def File.writeable_real?(name)
163
+ stat(name).writeable_real?
164
+ end
165
+ def File.zero?(name)
166
+ stat(name).zero?
167
+ end
168
+
169
+ end
170
+
171
+ end; end # Post/Rex
172
+
@@ -0,0 +1,220 @@
1
+ # -*- coding: binary -*-
2
+
3
+ #
4
+ # This is just a container class basically, that acts like File::Struct
5
+ #
6
+ # You must supply an initialize method that somehow populates the stathash..
7
+ #
8
+
9
+ module Rex
10
+ module Post
11
+
12
+ ###
13
+ #
14
+ # This class emulates the ruby FileStat class against a remote entity in a
15
+ # generic fashion. Refer to the ruby documentation for expected behavior.
16
+ #
17
+ ###
18
+ class FileStat
19
+
20
+ #
21
+ # Basic file types.
22
+ #
23
+ @@ftypes = [
24
+ 'fifo', 'characterSpecial', 'directory',
25
+ 'blockSpecial', 'file', 'link', 'socket'
26
+ ]
27
+
28
+ attr_accessor :stathash
29
+
30
+ def initialize(buf='')
31
+ self.stathash = {}
32
+ update(buf) if (buf and not buf.empty?)
33
+ end
34
+
35
+ def dev
36
+ self.stathash['st_dev']
37
+ end
38
+ def ino
39
+ self.stathash['st_ino']
40
+ end
41
+ def mode
42
+ self.stathash['st_mode']
43
+ end
44
+ def nlink
45
+ self.stathash['st_nlink']
46
+ end
47
+ def uid
48
+ self.stathash['st_uid']
49
+ end
50
+ def gid
51
+ self.stathash['st_gid']
52
+ end
53
+ def rdev
54
+ self.stathash['st_rdev']
55
+ end
56
+ def size
57
+ self.stathash['st_size']
58
+ end
59
+ def blksize
60
+ self.stathash['st_blksize']
61
+ end
62
+ def blocks
63
+ self.stathash['st_blocks']
64
+ end
65
+ def atime
66
+ Time.at(self.stathash['st_atime'])
67
+ end
68
+ def mtime
69
+ Time.at(self.stathash['st_mtime'])
70
+ end
71
+ def ctime
72
+ Time.at(self.stathash['st_ctime'])
73
+ end
74
+
75
+ def update(buf)
76
+
77
+ # XXX: This needs to understand more than just 'stat' structures
78
+ # Windows can also return _stat32, _stat32i64, _stat64i32, and _stat64 structures
79
+
80
+ skeys = %W{st_dev st_ino st_mode st_wtf st_nlink st_uid st_gid st_rdev st_size st_ctime st_atime st_mtime}
81
+ svals = buf.unpack("VvvvvvvVVVVV")
82
+ skeys.each_index do |i|
83
+ self.stathash[ skeys[i] ] = svals[i]
84
+ end
85
+ end
86
+
87
+ #
88
+ # S_IFMT 0170000 bitmask for the file type bitfields
89
+ # S_IFSOCK 0140000 socket
90
+ # S_IFLNK 0120000 symbolic link
91
+ # S_IFREG 0100000 regular file
92
+ # S_IFBLK 0060000 block device
93
+ # S_IFDIR 0040000 directory
94
+ # S_IFCHR 0020000 character device
95
+ # S_IFIFO 0010000 fifo
96
+ #
97
+
98
+ # this is my own, just a helper...
99
+ def filetype?(mask)
100
+ return true if mode & 0170000 == mask
101
+ return false
102
+ end
103
+
104
+ def blockdev?
105
+ filetype?(060000)
106
+ end
107
+ def chardev?
108
+ filetype?(020000)
109
+ end
110
+ def directory?
111
+ filetype?(040000)
112
+ end
113
+ def file?
114
+ filetype?(0100000)
115
+ end
116
+ def pipe?
117
+ filetype?(010000) # ??? fifo?
118
+ end
119
+ def socket?
120
+ filetype(0140000)
121
+ end
122
+ def symlink?
123
+ filetype(0120000)
124
+ end
125
+
126
+ def ftype
127
+ return @@ftypes[(mode & 0170000) >> 13].dup
128
+ end
129
+
130
+ #
131
+ # S_ISUID 0004000 set UID bit
132
+ # S_ISGID 0002000 set GID bit (see below)
133
+ # S_ISVTX 0001000 sticky bit (see below)
134
+ # S_IRWXU 00700 mask for file owner permissions
135
+ # S_IRUSR 00400 owner has read permission
136
+ # S_IWUSR 00200 owner has write permission
137
+ # S_IXUSR 00100 owner has execute permission
138
+ # S_IRWXG 00070 mask for group permissions
139
+ # S_IRGRP 00040 group has read permission
140
+ # S_IWGRP 00020 group has write permission
141
+ # S_IXGRP 00010 group has execute permission
142
+ # S_IRWXO 00007 mask for permissions for others (not in group)
143
+ # S_IROTH 00004 others have read permission
144
+ # S_IWOTH 00002 others have write permisson
145
+ # S_IXOTH 00001 others have execute permission
146
+ #
147
+
148
+ def perm?(mask)
149
+ return true if mode & mask == mask
150
+ return false
151
+ end
152
+
153
+ def setgid?
154
+ perm?(02000)
155
+ end
156
+ def setuid?
157
+ perm?(04000)
158
+ end
159
+ def sticky?
160
+ perm?(01000)
161
+ end
162
+
163
+ def executable?
164
+ raise NotImplementedError
165
+ end
166
+ def executable_real?
167
+ raise NotImplementedError
168
+ end
169
+ def grpowned?
170
+ raise NotImplementedError
171
+ end
172
+ def owned?
173
+ raise NotImplementedError
174
+ end
175
+ def readable?
176
+ raise NotImplementedError
177
+ end
178
+ def readable_real?
179
+ raise NotImplementedError
180
+ end
181
+ def writeable?
182
+ raise NotImplementedError
183
+ end
184
+ def writeable_real?
185
+ raise NotImplementedError
186
+ end
187
+
188
+ #
189
+ # Return pretty information about a file's permissions.
190
+ #
191
+ def prettymode
192
+ m = mode
193
+ om = '%04o' % m
194
+ perms = ''
195
+
196
+ 3.times {
197
+ perms = ((m & 01) == 01 ? 'x' : '-') + perms
198
+ perms = ((m & 02) == 02 ? 'w' : '-') + perms
199
+ perms = ((m & 04) == 04 ? 'r' : '-') + perms
200
+ m >>= 3
201
+ }
202
+
203
+ return "#{om}/#{perms}"
204
+ end
205
+
206
+ #
207
+ # Return pretty information about a file.
208
+ #
209
+ def pretty
210
+ " Size: #{size} Blocks: #{blocks} IO Block: #{blksize} Type: #{rdev}\n"\
211
+ "Device: #{dev} Inode: #{ino} Links: #{nlink}\n"\
212
+ " Mode: #{prettymode}\n"\
213
+ " Uid: #{uid} Gid: #{gid}\n"\
214
+ "Access: #{atime}\n"\
215
+ "Modify: #{mtime}\n"\
216
+ "Change: #{ctime}\n"
217
+ end
218
+
219
+ end
220
+ end; end # Post/Rex