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,205 @@
1
+ ##
2
+ # $Id: ole.rb 11444 2010-12-29 17:07:46Z jduck $
3
+ # Version: $Revision: 11444 $
4
+ ##
5
+
6
+ ##
7
+ # Rex::OLE - an OLE implementation
8
+ # written in 2010 by Joshua J. Drake <jduck [at] metasploit.com>
9
+ #
10
+ # License: MSF_LICENSE
11
+ #
12
+ #
13
+ # This module implements Object-Linking-and-Embedding otherwise known as
14
+ # Compound File Binary File Format or Windows Compound Binary File Format.
15
+ # OLE is the container format for modern Excel, Word, PowerPoint, and many
16
+ # other file formats.
17
+ #
18
+ # NOTE: This implementation is almost fully compliant with [MS-CFB] v1.1
19
+ #
20
+ #
21
+ # SUPPORTS:
22
+ #
23
+ # 1. R/W v3 OLE files (v4 may work, but wasn't tested)
24
+ # 2. RO double-indirect fat sectors
25
+ # 3. RO fat sectors (including those in double-indirect parts)
26
+ # 4. WO support for less than 109 fat sectors :)
27
+ # 5. R/W minifat sectors
28
+ # 6. R/W ministream
29
+ # 7. R/W normal streams
30
+ # 8. R/W substorages (including nesting)
31
+ # 9. full directory support (hierarchal and flattened access)
32
+ # 10. big and little endian files (although only little endian was tested)
33
+ # 11. PropertySet streams (except .to_s)
34
+ #
35
+ #
36
+ # TODO (in order of priority):
37
+ #
38
+ # 1. support deleting storages/streams
39
+ # 2. create copyto and other typical interface functions
40
+ # 3. support writing DIF sectors > 109
41
+ # - may lead to allocating more fat sectors :-/
42
+ # 4. properly support mode params for open_stream/open_storage/etc
43
+ # 5. optimize to prevent unecessary loading/writing
44
+ # 6. support non-committal editing (open, change, close w/o save)
45
+ # 7. support timestamps
46
+ # 8. provide interface to change paramters (endian, etc)
47
+ #
48
+ #
49
+ # TO INVESTIGATE:
50
+ #
51
+ # 1. moving storage interface functions into something used by both
52
+ # the main storage and substorages (unifying the code) (mixin?)
53
+ # 2. eliminating flattening the directory prior to writing it out
54
+ #
55
+ ##
56
+
57
+ require 'rex'
58
+
59
+ module Rex
60
+ module OLE
61
+
62
+ # misc util
63
+ # NOTE: the v1.1 spec says that everything "MUST be stored in little-endian byte order"
64
+ BIG_ENDIAN = 0xfeff
65
+ LITTLE_ENDIAN = 0xfffe
66
+ # defines Util class
67
+ require 'rex/ole/util'
68
+ require 'rex/ole/clsid'
69
+
70
+
71
+ # constants for dealing with the header
72
+ HDR_SZ = 512
73
+ # signatures
74
+ SIG = "\xd0\xcf\x11\xe0\xa1\xb1\x1a\xe1"
75
+ SIG_BETA = "\x0e\x11\xfc\x0d\xd0\xcf\x11\xe0"
76
+ # defines Header class
77
+ require 'rex/ole/header'
78
+
79
+
80
+ # sector types
81
+ SECT_MAX = 0xfffffffa
82
+ SECT_DIF = 0xfffffffc
83
+ SECT_FAT = 0xfffffffd
84
+ SECT_END = 0xfffffffe
85
+ SECT_FREE = 0xffffffff
86
+ # defines DIFAT class
87
+ require 'rex/ole/difat'
88
+ # defines FAT class
89
+ require 'rex/ole/fat'
90
+ # defines MiniFAT class
91
+ require 'rex/ole/minifat'
92
+
93
+
94
+ # directory entries
95
+ DIRENTRY_SZ = 128
96
+ DIR_NOSTREAM = 0xffffffff
97
+ DIR_MAXREGSID = 0xfffffffa
98
+ # defines Directory class
99
+ require 'rex/ole/directory'
100
+
101
+ # types
102
+ STGTY_INVALID = 0
103
+ STGTY_STORAGE = 1
104
+ STGTY_STREAM = 2
105
+ STGTY_LOCKBYTES = 3
106
+ STGTY_PROPERTY = 4
107
+ STGTY_ROOT = 5
108
+ # for red/black tree
109
+ COLOR_RED = 0
110
+ COLOR_BLACK = 1
111
+ # defines DirEntry base class
112
+ require 'rex/ole/direntry'
113
+
114
+
115
+ # constants for storages
116
+ STGM_READ = 0
117
+ STGM_WRITE = 1
118
+ STGM_READWRITE = 2
119
+ # defines Storage class
120
+ require 'rex/ole/storage'
121
+ # defines SubStorage class
122
+ require 'rex/ole/substorage'
123
+ # defines Stream class
124
+ require 'rex/ole/stream'
125
+
126
+
127
+ # constants for property sets
128
+ # PropertyIds
129
+ PID_DICTIONARY = 0x00000000
130
+ PID_CODEPAGE = 0x00000001
131
+ PID_LOCALE = 0x80000000
132
+ PID_BEHAVIOR = 0x80000003
133
+ # Well-known PropertyIds
134
+ PIDSI_TITLE = 0x02
135
+ PIDSI_SUBJECT = 0x03
136
+ PIDSI_AUTHOR = 0x04
137
+ PIDSI_KEYWORDS = 0x05
138
+ PIDSI_COMMENTS = 0x06
139
+ PIDSI_TEMPLATE = 0x07
140
+ PIDSI_LASTAUTHOR = 0x08
141
+ PIDSI_REVNUMBER = 0x09
142
+ PIDSI_EDITTIME = 0x0a
143
+ PIDSI_LASTPRINTED = 0x0b
144
+ PIDSI_CREATE_DTM = 0x0c
145
+ PIDSI_LASTSAVE_DTM = 0x0d
146
+ PIDSI_PAGECOUNT = 0x0e
147
+ PIDSI_WORDCOUNT = 0x0f
148
+ PIDSI_CHARCOUNT = 0x10
149
+ PIDSI_THUMBNAIL = 0x11
150
+ PIDSI_APPNAME = 0x12
151
+ PIDSI_DOC_SECURITY = 0x13
152
+ # PropertyTypes
153
+ VT_EMPTY = 0x00
154
+ VT_NULL = 0x01
155
+ VT_I2 = 0x02
156
+ VT_I4 = 0x03
157
+ VT_R4 = 0x04
158
+ VT_R8 = 0x05
159
+ VT_CY = 0x06
160
+ VT_DATE = 0x07
161
+ VT_BSTR = 0x08
162
+ VT_ERROR = 0x0a
163
+ VT_BOOL = 0x0b
164
+ VT_VARIANT = 0x0c # used with VT_VECTOR
165
+ # 0xd
166
+ VT_DECIMAL = 0x0e
167
+ # 0xf
168
+ VT_I1 = 0x10
169
+ VT_UI1 = 0x11
170
+ VT_UI2 = 0x12
171
+ VT_UI4 = 0x13
172
+ VT_I8 = 0x14
173
+ VT_UI8 = 0x15
174
+ VT_INT = 0x16
175
+ VT_UINT = 0x17
176
+ VT_LPSTR = 0x1e
177
+ VT_LPWSTR = 0x1f
178
+ # 0x20-0x3f
179
+ VT_FILETIME = 0x40
180
+ VT_BLOB = 0x41
181
+ VT_STREAM = 0x42
182
+ VT_STORAGE = 0x43
183
+ VT_STREAMED_OBJ = 0x44
184
+ VT_STORED_OBJ = 0x45
185
+ VT_BLOB_OBJ = 0x46
186
+ VT_CF = 0x47 # Clipboard Format
187
+ VT_CLSID = 0x48
188
+ VT_VERSIONED_STREAM = 0x49
189
+ # Flags
190
+ VT_VECTOR = 0x1000
191
+ VT_ARRAY = 0x2000 # Requires OLE version >= 1
192
+ # Format IDs
193
+ FMTID_SummaryInformation = "\xe0\x85\x9f\xf2\xf9\x4f\x68\x10\xab\x91\x08\x00\x2b\x27\xb3\xd9"
194
+ FMTID_DocSummaryInformation = "\x02\xd5\xcd\xd5\x9c\x2e\x1b\x10\x93\x97\x08\x00\x2b\x2c\xf9\xae"
195
+ FMTID_UserDefinedProperties = "\x05\xd5\xcd\xd5\x9c\x2e\x1b\x10\x93\x97\x08\x00\x2b\x2c\xf9\xae"
196
+ FMTID_GlobalInfo = "\x00\x6f\x61\x56\x54\xc1\xce\x11\x85\x53\x00\xaa\x00\xa1\xf9\x5b"
197
+ FMTID_ImageContents = "\x00\x64\x61\x56\x54\xc1\xce\x11\x85\x53\x00\xaa\x00\xa1\xf9\x5b"
198
+ FMTID_ImageInfo = "\x00\x65\x61\x56\x54\xc1\xce\x11\x85\x53\x00\xaa\x00\xa1\xf9\x5b"
199
+ FMTID_PropertyBag = "\x01\x18\x00\x20\xe6\x5d\xd1\x11\x8e\x38\x00\xc0\x4f\xb9\x38\x6d"
200
+ # defines PropertySet class
201
+ require 'rex/ole/propset'
202
+
203
+
204
+ end
205
+ end
@@ -0,0 +1,47 @@
1
+ ##
2
+ # $Id: clsid.rb 8457 2010-02-11 18:36:38Z jduck $
3
+ # Version: $Revision: 8457 $
4
+ ##
5
+
6
+ ##
7
+ # Rex::OLE - an OLE implementation
8
+ # written in 2010 by Joshua J. Drake <jduck [at] metasploit.com>
9
+ ##
10
+
11
+
12
+ module Rex
13
+ module OLE
14
+
15
+ class CLSID
16
+
17
+ def initialize(buf=nil)
18
+ @buf = buf
19
+ @buf ||= "\x00" * 16
20
+ end
21
+
22
+ def pack
23
+ @buf
24
+ end
25
+
26
+ def to_s
27
+ ret = ""
28
+ ret << "%08x" % Util.get32(@buf, 0)
29
+ ret << "-"
30
+ ret << "%04x" % Util.get16(@buf, 4)
31
+ ret << "-"
32
+ ret << "%04x" % Util.get16(@buf, 6)
33
+ ret << "-"
34
+ idx = 0
35
+ last8 = @buf[8,8]
36
+ last8.unpack('C*').each { |byte|
37
+ ret << [byte].pack('C').unpack('H*')[0]
38
+ ret << "-" if (idx == 1)
39
+ idx += 1
40
+ }
41
+ ret
42
+ end
43
+
44
+ end
45
+
46
+ end
47
+ end
@@ -0,0 +1,141 @@
1
+ ##
2
+ # $Id: difat.rb 8457 2010-02-11 18:36:38Z jduck $
3
+ # Version: $Revision: 8457 $
4
+ ##
5
+
6
+ ##
7
+ # Rex::OLE - an OLE implementation
8
+ # written in 2010 by Joshua J. Drake <jduck [at] metasploit.com>
9
+ ##
10
+
11
+ module Rex
12
+ module OLE
13
+
14
+ class DIFAT
15
+
16
+ def initialize stg
17
+ @stg = stg
18
+ @entries = []
19
+ end
20
+
21
+ #
22
+ # convenience access to entries
23
+ #
24
+ def []=(idx,expr)
25
+ @entries[idx] = expr
26
+ end
27
+
28
+ def [](idx)
29
+ @entries[idx]
30
+ end
31
+
32
+ def +(expr)
33
+ @entries += expr
34
+ self
35
+ end
36
+
37
+ def <<(expr)
38
+ @entries << expr
39
+ end
40
+
41
+ def length
42
+ @entries.length
43
+ end
44
+
45
+ def slice!(start,stop)
46
+ @entries.slice!(start,stop)
47
+ end
48
+
49
+ def reset
50
+ @entries = []
51
+ end
52
+
53
+ def each
54
+ @entries.each { |el|
55
+ yield el
56
+ }
57
+ end
58
+
59
+ #
60
+ # woop
61
+ #
62
+ def to_s
63
+ ret = "{ "
64
+ @entries.each { |el|
65
+ ret << ", " if (ret.length > 2)
66
+ case el
67
+ when SECT_END
68
+ ret << "END"
69
+ when SECT_DIF
70
+ ret << "DIF"
71
+ when SECT_FAT
72
+ ret << "FAT"
73
+ when SECT_FREE
74
+ ret << "FREE"
75
+ else
76
+ ret << "0x%x" % el
77
+ end
78
+ }
79
+ ret << " }"
80
+ ret
81
+ end
82
+
83
+ #
84
+ # low-level functions
85
+ #
86
+ def read
87
+ @entries = []
88
+
89
+ # start with the header part
90
+ @entries += @stg.header._sectFat
91
+
92
+ # double indirect fat
93
+ sect = @stg.header._sectDifStart
94
+ while (sect != SECT_END)
95
+ if (@entries.include?(sect))
96
+ raise RuntimeError, 'Sector chain loop detected (0x%08x)' % sect
97
+ end
98
+
99
+ @entries << sect
100
+ buf = @stg.read_sector(sect, @stg.header.sector_size)
101
+
102
+ # the last sect ptr in the block becomes the next entry
103
+ sect = Util.get32(buf, ((@stg.header.idx_per_sect)-1) * 4)
104
+ end
105
+
106
+ # don't need these free ones, but it doesn't hurt to keep them.
107
+ #@difat.delete(SECT_FREE)
108
+ end
109
+
110
+ def write
111
+ len = @entries.length
112
+ first109 = @entries.dup
113
+
114
+ rest = nil
115
+ if (len > 109)
116
+ rest = first109.slice!(109,len)
117
+ end
118
+
119
+ @stg.header._sectFat = []
120
+ @stg.header._sectFat += first109
121
+ if (len < 109)
122
+ need = 109 - len
123
+ need.times {
124
+ @stg.header._sectFat << SECT_FREE
125
+ }
126
+ end
127
+
128
+ if (rest and rest.length > 0)
129
+ raise RuntimeError, 'TODO: support writing DIF properly!'
130
+ # may require adding more fat sectors :-/
131
+ #@stg.header._csectDif = rest.length
132
+ #@stg.header._sectDifStart = idx
133
+ end
134
+
135
+ @stg.header._csectFat = len
136
+ end
137
+
138
+ end
139
+
140
+ end
141
+ end
@@ -0,0 +1,231 @@
1
+ ##
2
+ # $Id: directory.rb 9287 2010-05-12 05:33:35Z jduck $
3
+ # Version: $Revision: 9287 $
4
+ ##
5
+
6
+ ##
7
+ # Rex::OLE - an OLE implementation
8
+ # written in 2010 by Joshua J. Drake <jduck [at] metasploit.com>
9
+ ##
10
+
11
+ module Rex
12
+ module OLE
13
+
14
+ require 'rex/ole/direntry'
15
+
16
+ #
17
+ # This class serves as the root directory entry in addition to
18
+ # an abstraction around the concept of a directory as a whole.
19
+ #
20
+ class Directory < DirEntry
21
+
22
+ # XXX: num_entries is not maintained once a stream/storage is added!
23
+ attr_accessor :num_entries
24
+
25
+ def initialize(stg)
26
+ super
27
+
28
+ @num_entries = 1
29
+ end
30
+
31
+
32
+ # woop, recursive each
33
+ def yield_entries(de, &block)
34
+ block.call(de)
35
+ de.each { |el|
36
+ yield_entries(el, &block)
37
+ }
38
+ end
39
+ def each_entry(&block)
40
+ yield_entries(self, &block)
41
+ end
42
+
43
+
44
+ def set_ministream_params(start, size)
45
+ @_sectStart = start
46
+ @_ulSize = size
47
+ end
48
+
49
+ def link_item(parent, child)
50
+ # set sid, advance count
51
+ child.sid = @num_entries
52
+ @num_entries += 1
53
+
54
+ # link item to siblings and/or parent
55
+ if (parent._sidChild == DIR_NOSTREAM)
56
+ parent._sidChild = child.sid
57
+ dlog("Linking #{child.name} as THE child of #{parent.name} as sid #{child.sid}", 'rex', LEV_3)
58
+ else
59
+ sib = nil
60
+ parent.each { |el|
61
+ if (el._sidLeftSib == DIR_NOSTREAM)
62
+ sib = el
63
+ el._sidLeftSib = child.sid
64
+ dlog("Linking #{child.name} as the LEFT sibling of #{sib.name} as sid #{child.sid}", 'rex', LEV_3)
65
+ break
66
+ end
67
+ if (el._sidRightSib == DIR_NOSTREAM)
68
+ sib = el
69
+ el._sidRightSib = child.sid
70
+ dlog("Linking #{child.name} as the RIGHT sibling of #{sib.name} as sid #{child.sid}", 'rex', LEV_3)
71
+ break
72
+ end
73
+ }
74
+ if (not sib)
75
+ raise RuntimeError, 'Unable to find a sibling to link to in the directory'
76
+ end
77
+ end
78
+ parent << child
79
+ end
80
+
81
+
82
+ #
83
+ # low-level functions
84
+ #
85
+ def from_s(sid, buf)
86
+ super
87
+
88
+ if (@_sidRightSib != DIR_NOSTREAM)
89
+ raise RuntimeError, 'Root Entry is invalid! (has right sibling)'
90
+ end
91
+ if (@_sidLeftSib != DIR_NOSTREAM)
92
+ raise RuntimeError, 'Root Entry is invalid! (has left sibling)'
93
+ end
94
+ end
95
+
96
+ def read
97
+ @children = []
98
+ visited = []
99
+ entries = []
100
+ root_node = nil
101
+ sect = @stg.header._sectDirStart
102
+ while (sect != SECT_END)
103
+
104
+ if (visited.include?(sect))
105
+ raise RuntimeError, 'Sector chain loop detected (0x%08x)' % sect
106
+ end
107
+ visited << sect
108
+
109
+ sbuf = @stg.read_sector(sect, @stg.header.sector_size)
110
+ while (sbuf.length >= DIRENTRY_SZ)
111
+ debuf = sbuf.slice!(0, DIRENTRY_SZ)
112
+
113
+ type = Util.get8(debuf, 0x42)
114
+ case type
115
+ when STGTY_ROOT
116
+ if (entries.length != 0)
117
+ raise RuntimeError, 'Root Entry found, but not first encountered!'
118
+ end
119
+ if (root_node)
120
+ raise RuntimeError, 'Multiple root directory sectors detected (0x%08x)' % sect
121
+ end
122
+ de = self
123
+ root_node = de
124
+
125
+ when STGTY_STORAGE
126
+ de = SubStorage.new @stg
127
+
128
+ when STGTY_STREAM
129
+ de = Stream.new @stg
130
+
131
+ when STGTY_INVALID
132
+ # skip invalid entries
133
+ next
134
+
135
+ else
136
+ raise RuntimeError, 'Unsupported directory entry type (0x%02x)' % type
137
+ end
138
+
139
+ # read content
140
+ de.from_s(entries.length, debuf)
141
+ entries << de
142
+ end
143
+ sect = @stg.next_sector(sect)
144
+ end
145
+
146
+ @num_entries = entries.length
147
+
148
+ # sort out the tree structure, starting with the root
149
+ if (@_sidChild != DIR_NOSTREAM)
150
+ populate_children(entries, root_node, @_sidChild)
151
+ end
152
+ end
153
+
154
+
155
+ # recursively add entries to their proper parents :)
156
+ def populate_children(entries, parent, sid)
157
+ node = entries[sid]
158
+ dlog("populate_children(entries, \"#{parent.name}\", #{sid}) - node: #{node.name}", 'rex', LEV_3)
159
+ parent << node
160
+ if (node.type == STGTY_STORAGE) and (node._sidChild != DIR_NOSTREAM)
161
+ populate_children(entries, node, node._sidChild)
162
+ end
163
+ if (node._sidLeftSib != DIR_NOSTREAM)
164
+ populate_children(entries, parent, node._sidLeftSib)
165
+ end
166
+ if (node._sidRightSib != DIR_NOSTREAM)
167
+ populate_children(entries, parent, node._sidRightSib)
168
+ end
169
+ end
170
+
171
+ # NOTE: this may not be necessary if we were to use each_entry
172
+ def flatten_tree(entries, parent)
173
+ entries << parent
174
+ parent.each { |el|
175
+ flatten_tree(entries, el)
176
+ }
177
+ end
178
+
179
+
180
+ def write
181
+ # flatten the directory again
182
+ entries = []
183
+ flatten_tree(entries, self)
184
+ dlog("flattened tree has #{entries.length} entries...", 'rex', LEV_3)
185
+
186
+ # count directory sectors
187
+ ds_count = entries.length / 4
188
+ if ((entries.length % 4) > 0)
189
+ # one more sector to hold the rest
190
+ ds_count += 1
191
+ end
192
+
193
+ # put the root entry first
194
+ sbuf = self.pack
195
+
196
+ # add the rest
197
+ prev_sect = nil
198
+ dir_start = nil
199
+ entries.each { |de|
200
+ # we already got the root entry, no more!
201
+ next if (de.type == STGTY_ROOT)
202
+
203
+ dir = de.pack
204
+ dlog("writing dir entry #{de.name}", 'rex', LEV_3)
205
+ sbuf << dir
206
+
207
+ if (sbuf.length == @stg.header.sector_size)
208
+ # we have a full sector, add it!
209
+ sect = @stg.write_sector(sbuf, nil, prev_sect)
210
+ prev_sect = sect
211
+ dir_start ||= sect
212
+ # reset..
213
+ sbuf = ""
214
+ end
215
+ }
216
+
217
+ # still a partial sector left?
218
+ if (sbuf.length > 0)
219
+ # add it! (NOTE: it will get padded with nul bytes if its not sector sized)
220
+ sect = @stg.write_sector(sbuf, nil, prev_sect)
221
+ prev_sect = sect
222
+ dir_start ||= sect
223
+ end
224
+
225
+ @stg.header._sectDirStart = dir_start
226
+ end
227
+
228
+ end
229
+
230
+ end
231
+ end