librex 0.0.68 → 0.0.70

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (528) hide show
  1. checksums.yaml +15 -0
  2. data/README.markdown +1 -1
  3. data/Rakefile +18 -16
  4. data/lib/rex.rb +14 -10
  5. data/lib/rex/LICENSE +2 -2
  6. data/lib/rex/arch.rb +76 -76
  7. data/lib/rex/arch/sparc.rb +57 -58
  8. data/lib/rex/arch/x86.rb +506 -496
  9. data/lib/rex/assembly/nasm.rb +83 -84
  10. data/lib/rex/compat.rb +228 -173
  11. data/lib/rex/constants.rb +47 -37
  12. data/lib/rex/elfparsey.rb +0 -3
  13. data/lib/rex/elfparsey/elf.rb +107 -110
  14. data/lib/rex/elfparsey/elfbase.rb +244 -247
  15. data/lib/rex/elfparsey/exceptions.rb +0 -3
  16. data/lib/rex/elfscan.rb +0 -3
  17. data/lib/rex/elfscan/scanner.rb +184 -166
  18. data/lib/rex/elfscan/search.rb +35 -38
  19. data/lib/rex/encoder/alpha2.rb +1 -2
  20. data/lib/rex/encoder/alpha2/alpha_mixed.rb +52 -53
  21. data/lib/rex/encoder/alpha2/alpha_upper.rb +62 -63
  22. data/lib/rex/encoder/alpha2/generic.rb +77 -78
  23. data/lib/rex/encoder/alpha2/unicode_mixed.rb +101 -97
  24. data/lib/rex/encoder/alpha2/unicode_upper.rb +106 -107
  25. data/lib/rex/encoder/bloxor/bloxor.rb +326 -0
  26. data/lib/rex/encoder/ndr.rb +68 -68
  27. data/lib/rex/encoder/nonalpha.rb +50 -51
  28. data/lib/rex/encoder/nonupper.rb +50 -51
  29. data/lib/rex/encoder/xdr.rb +78 -78
  30. data/lib/rex/encoder/xor.rb +52 -53
  31. data/lib/rex/encoder/xor/dword.rb +1 -2
  32. data/lib/rex/encoder/xor/dword_additive.rb +1 -2
  33. data/lib/rex/encoders/xor_dword.rb +17 -18
  34. data/lib/rex/encoders/xor_dword_additive.rb +35 -36
  35. data/lib/rex/encoding/xor.rb +0 -1
  36. data/lib/rex/encoding/xor/byte.rb +3 -4
  37. data/lib/rex/encoding/xor/dword.rb +3 -4
  38. data/lib/rex/encoding/xor/dword_additive.rb +72 -73
  39. data/lib/rex/encoding/xor/exceptions.rb +2 -3
  40. data/lib/rex/encoding/xor/generic.rb +129 -130
  41. data/lib/rex/encoding/xor/qword.rb +3 -4
  42. data/lib/rex/encoding/xor/word.rb +3 -4
  43. data/lib/rex/exceptions.rb +100 -101
  44. data/lib/rex/exploitation/cmdstager.rb +3 -3
  45. data/lib/rex/exploitation/cmdstager/base.rb +170 -156
  46. data/lib/rex/exploitation/cmdstager/bourne.rb +105 -0
  47. data/lib/rex/exploitation/cmdstager/debug_asm.rb +110 -113
  48. data/lib/rex/exploitation/cmdstager/debug_write.rb +106 -109
  49. data/lib/rex/exploitation/cmdstager/echo.rb +164 -0
  50. data/lib/rex/exploitation/cmdstager/printf.rb +122 -0
  51. data/lib/rex/exploitation/cmdstager/tftp.rb +34 -27
  52. data/lib/rex/exploitation/cmdstager/vbs.rb +95 -98
  53. data/lib/rex/exploitation/egghunter.rb +359 -346
  54. data/lib/rex/exploitation/encryptjs.rb +60 -60
  55. data/lib/rex/exploitation/heaplib.rb +76 -76
  56. data/lib/rex/exploitation/js.rb +6 -0
  57. data/lib/rex/exploitation/js/detect.rb +69 -0
  58. data/lib/rex/exploitation/js/memory.rb +81 -0
  59. data/lib/rex/exploitation/js/network.rb +84 -0
  60. data/lib/rex/exploitation/js/utils.rb +33 -0
  61. data/lib/rex/exploitation/jsobfu.rb +448 -424
  62. data/lib/rex/exploitation/obfuscatejs.rb +301 -301
  63. data/lib/rex/exploitation/omelet.rb +257 -257
  64. data/lib/rex/exploitation/opcodedb.rb +699 -699
  65. data/lib/rex/exploitation/ropdb.rb +189 -0
  66. data/lib/rex/exploitation/seh.rb +68 -68
  67. data/lib/rex/file.rb +96 -49
  68. data/lib/rex/image_source.rb +0 -3
  69. data/lib/rex/image_source/disk.rb +45 -48
  70. data/lib/rex/image_source/image_source.rb +33 -36
  71. data/lib/rex/image_source/memory.rb +17 -20
  72. data/lib/rex/io/bidirectional_pipe.rb +118 -115
  73. data/lib/rex/io/datagram_abstraction.rb +13 -14
  74. data/lib/rex/io/ring_buffer.rb +273 -273
  75. data/lib/rex/io/stream.rb +284 -284
  76. data/lib/rex/io/stream_abstraction.rb +183 -181
  77. data/lib/rex/io/stream_server.rb +193 -193
  78. data/lib/rex/job_container.rb +167 -167
  79. data/lib/rex/logging.rb +0 -1
  80. data/lib/rex/logging/log_dispatcher.rb +113 -113
  81. data/lib/rex/logging/log_sink.rb +17 -17
  82. data/lib/rex/logging/sinks/flatfile.rb +36 -36
  83. data/lib/rex/logging/sinks/stderr.rb +27 -27
  84. data/lib/rex/mac_oui.rb +16572 -16571
  85. data/lib/rex/machparsey.rb +0 -1
  86. data/lib/rex/machparsey/exceptions.rb +0 -1
  87. data/lib/rex/machparsey/mach.rb +160 -161
  88. data/lib/rex/machparsey/machbase.rb +367 -368
  89. data/lib/rex/machscan.rb +0 -1
  90. data/lib/rex/machscan/scanner.rb +175 -176
  91. data/lib/rex/mime/encoding.rb +17 -0
  92. data/lib/rex/mime/header.rb +58 -58
  93. data/lib/rex/mime/message.rb +140 -137
  94. data/lib/rex/mime/part.rb +41 -12
  95. data/lib/rex/nop/opty2.rb +90 -90
  96. data/lib/rex/nop/opty2_tables.rb +273 -273
  97. data/lib/rex/ole.rb +0 -4
  98. data/lib/rex/ole/clsid.rb +26 -30
  99. data/lib/rex/ole/difat.rb +121 -125
  100. data/lib/rex/ole/directory.rb +205 -209
  101. data/lib/rex/ole/direntry.rb +217 -221
  102. data/lib/rex/ole/fat.rb +79 -83
  103. data/lib/rex/ole/header.rb +178 -182
  104. data/lib/rex/ole/minifat.rb +49 -53
  105. data/lib/rex/ole/propset.rb +113 -117
  106. data/lib/rex/ole/samples/create_ole.rb +8 -9
  107. data/lib/rex/ole/samples/dir.rb +10 -11
  108. data/lib/rex/ole/samples/dump_stream.rb +14 -15
  109. data/lib/rex/ole/samples/ole_info.rb +5 -6
  110. data/lib/rex/ole/storage.rb +372 -376
  111. data/lib/rex/ole/stream.rb +33 -37
  112. data/lib/rex/ole/substorage.rb +20 -24
  113. data/lib/rex/ole/util.rb +137 -141
  114. data/lib/rex/parser/acunetix_nokogiri.rb +398 -398
  115. data/lib/rex/parser/apple_backup_manifestdb.rb +116 -116
  116. data/lib/rex/parser/appscan_nokogiri.rb +359 -359
  117. data/lib/rex/parser/arguments.rb +88 -88
  118. data/lib/rex/parser/burp_session_nokogiri.rb +258 -258
  119. data/lib/rex/parser/ci_nokogiri.rb +184 -184
  120. data/lib/rex/parser/foundstone_nokogiri.rb +334 -333
  121. data/lib/rex/parser/fusionvm_nokogiri.rb +94 -94
  122. data/lib/rex/parser/ini.rb +167 -167
  123. data/lib/rex/parser/ip360_aspl_xml.rb +84 -84
  124. data/lib/rex/parser/ip360_xml.rb +77 -77
  125. data/lib/rex/parser/mbsa_nokogiri.rb +224 -224
  126. data/lib/rex/parser/nessus_xml.rb +100 -100
  127. data/lib/rex/parser/netsparker_xml.rb +89 -75
  128. data/lib/rex/parser/nexpose_raw_nokogiri.rb +677 -677
  129. data/lib/rex/parser/nexpose_simple_nokogiri.rb +322 -322
  130. data/lib/rex/parser/nexpose_xml.rb +105 -105
  131. data/lib/rex/parser/nmap_nokogiri.rb +386 -386
  132. data/lib/rex/parser/nmap_xml.rb +116 -116
  133. data/lib/rex/parser/nokogiri_doc_mixin.rb +223 -221
  134. data/lib/rex/parser/openvas_nokogiri.rb +162 -162
  135. data/lib/rex/parser/outpost24_nokogiri.rb +239 -0
  136. data/lib/rex/parser/retina_xml.rb +90 -90
  137. data/lib/rex/parser/unattend.rb +171 -0
  138. data/lib/rex/parser/wapiti_nokogiri.rb +89 -89
  139. data/lib/rex/payloads/win32/common.rb +14 -14
  140. data/lib/rex/payloads/win32/kernel.rb +36 -36
  141. data/lib/rex/payloads/win32/kernel/common.rb +32 -32
  142. data/lib/rex/payloads/win32/kernel/recovery.rb +27 -27
  143. data/lib/rex/payloads/win32/kernel/stager.rb +170 -170
  144. data/lib/rex/peparsey.rb +0 -3
  145. data/lib/rex/peparsey/exceptions.rb +0 -3
  146. data/lib/rex/peparsey/pe.rb +196 -199
  147. data/lib/rex/peparsey/pe_memdump.rb +35 -38
  148. data/lib/rex/peparsey/pebase.rb +1633 -1652
  149. data/lib/rex/peparsey/section.rb +115 -124
  150. data/lib/rex/pescan.rb +0 -3
  151. data/lib/rex/pescan/analyze.rb +351 -351
  152. data/lib/rex/pescan/scanner.rb +182 -182
  153. data/lib/rex/pescan/search.rb +59 -59
  154. data/lib/rex/platforms/windows.rb +37 -37
  155. data/lib/rex/poly.rb +111 -110
  156. data/lib/rex/poly/block.rb +419 -417
  157. data/lib/rex/poly/machine.rb +12 -0
  158. data/lib/rex/poly/machine/machine.rb +829 -0
  159. data/lib/rex/poly/machine/x86.rb +508 -0
  160. data/lib/rex/poly/register.rb +70 -70
  161. data/lib/rex/poly/register/x86.rb +22 -22
  162. data/lib/rex/post.rb +0 -1
  163. data/lib/rex/post/dir.rb +35 -36
  164. data/lib/rex/post/file.rb +140 -141
  165. data/lib/rex/post/file_stat.rb +198 -199
  166. data/lib/rex/post/io.rb +167 -168
  167. data/lib/rex/post/meterpreter.rb +1 -1
  168. data/lib/rex/post/meterpreter/channel.rb +389 -390
  169. data/lib/rex/post/meterpreter/channel_container.rb +33 -34
  170. data/lib/rex/post/meterpreter/channels/pool.rb +129 -130
  171. data/lib/rex/post/meterpreter/channels/pools/file.rb +35 -36
  172. data/lib/rex/post/meterpreter/channels/pools/stream_pool.rb +72 -73
  173. data/lib/rex/post/meterpreter/channels/stream.rb +62 -63
  174. data/lib/rex/post/meterpreter/client.rb +442 -436
  175. data/lib/rex/post/meterpreter/client_core.rb +326 -310
  176. data/lib/rex/post/meterpreter/dependencies.rb +0 -1
  177. data/lib/rex/post/meterpreter/extension.rb +12 -13
  178. data/lib/rex/post/meterpreter/extensions/espia/espia.rb +35 -36
  179. data/lib/rex/post/meterpreter/extensions/extapi/adsi/adsi.rb +71 -0
  180. data/lib/rex/post/meterpreter/extensions/extapi/clipboard/clipboard.rb +169 -0
  181. data/lib/rex/post/meterpreter/extensions/extapi/extapi.rb +45 -0
  182. data/lib/rex/post/meterpreter/extensions/extapi/service/service.rb +104 -0
  183. data/lib/rex/post/meterpreter/extensions/extapi/tlv.rb +77 -0
  184. data/lib/rex/post/meterpreter/extensions/extapi/window/window.rb +56 -0
  185. data/lib/rex/post/meterpreter/extensions/extapi/wmi/wmi.rb +75 -0
  186. data/lib/rex/post/meterpreter/extensions/incognito/incognito.rb +70 -71
  187. data/lib/rex/post/meterpreter/extensions/kiwi/kiwi.rb +361 -0
  188. data/lib/rex/post/meterpreter/extensions/kiwi/tlv.rb +76 -0
  189. data/lib/rex/post/meterpreter/extensions/lanattacks/dhcp/dhcp.rb +78 -0
  190. data/lib/rex/post/meterpreter/extensions/lanattacks/lanattacks.rb +22 -78
  191. data/lib/rex/post/meterpreter/extensions/lanattacks/tftp/tftp.rb +49 -0
  192. data/lib/rex/post/meterpreter/extensions/lanattacks/tlv.rb +4 -4
  193. data/lib/rex/post/meterpreter/extensions/mimikatz/mimikatz.rb +128 -0
  194. data/lib/rex/post/meterpreter/extensions/mimikatz/tlv.rb +16 -0
  195. data/lib/rex/post/meterpreter/extensions/networkpug/networkpug.rb +38 -39
  196. data/lib/rex/post/meterpreter/extensions/networkpug/tlv.rb +1 -1
  197. data/lib/rex/post/meterpreter/extensions/priv/fs.rb +95 -96
  198. data/lib/rex/post/meterpreter/extensions/priv/passwd.rb +39 -40
  199. data/lib/rex/post/meterpreter/extensions/priv/priv.rb +80 -85
  200. data/lib/rex/post/meterpreter/extensions/sniffer/sniffer.rb +94 -95
  201. data/lib/rex/post/meterpreter/extensions/stdapi/constants.rb +207 -147
  202. data/lib/rex/post/meterpreter/extensions/stdapi/fs/dir.rb +258 -259
  203. data/lib/rex/post/meterpreter/extensions/stdapi/fs/file.rb +366 -301
  204. data/lib/rex/post/meterpreter/extensions/stdapi/fs/file_stat.rb +72 -73
  205. data/lib/rex/post/meterpreter/extensions/stdapi/fs/io.rb +24 -25
  206. data/lib/rex/post/meterpreter/extensions/stdapi/net/arp.rb +59 -0
  207. data/lib/rex/post/meterpreter/extensions/stdapi/net/config.rb +227 -149
  208. data/lib/rex/post/meterpreter/extensions/stdapi/net/interface.rb +107 -108
  209. data/lib/rex/post/meterpreter/extensions/stdapi/net/netstat.rb +97 -0
  210. data/lib/rex/post/meterpreter/extensions/stdapi/net/resolve.rb +106 -0
  211. data/lib/rex/post/meterpreter/extensions/stdapi/net/route.rb +41 -42
  212. data/lib/rex/post/meterpreter/extensions/stdapi/net/socket.rb +102 -101
  213. data/lib/rex/post/meterpreter/extensions/stdapi/net/socket_subsystem/tcp_client_channel.rb +151 -152
  214. data/lib/rex/post/meterpreter/extensions/stdapi/net/socket_subsystem/tcp_server_channel.rb +142 -142
  215. data/lib/rex/post/meterpreter/extensions/stdapi/net/socket_subsystem/udp_channel.rb +185 -185
  216. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/api_constants.rb +38118 -38117
  217. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/buffer_item.rb +7 -7
  218. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_advapi32.rb +2086 -2084
  219. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_crypt32.rb +15 -15
  220. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_iphlpapi.rb +80 -80
  221. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_kernel32.rb +3835 -3833
  222. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_netapi32.rb +84 -28
  223. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_ntdll.rb +151 -137
  224. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_shell32.rb +15 -6
  225. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_user32.rb +3155 -3155
  226. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_version.rb +41 -0
  227. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_wlanapi.rb +70 -70
  228. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_wldap32.rb +128 -0
  229. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_ws2_32.rb +596 -596
  230. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll.rb +310 -301
  231. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_function.rb +71 -61
  232. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_helper.rb +100 -100
  233. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_wrapper.rb +14 -14
  234. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/mock_magic.rb +488 -488
  235. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/multicall.rb +273 -264
  236. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/platform_util.rb +5 -5
  237. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/railgun.rb +240 -238
  238. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/tlv.rb +17 -15
  239. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/type/pointer_util.rb +61 -61
  240. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/util.rb +654 -635
  241. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/win_const_manager.rb +49 -49
  242. data/lib/rex/post/meterpreter/extensions/stdapi/stdapi.rb +103 -102
  243. data/lib/rex/post/meterpreter/extensions/stdapi/sys/config.rb +98 -68
  244. data/lib/rex/post/meterpreter/extensions/stdapi/sys/event_log.rb +165 -166
  245. data/lib/rex/post/meterpreter/extensions/stdapi/sys/event_log_subsystem/event_record.rb +16 -17
  246. data/lib/rex/post/meterpreter/extensions/stdapi/sys/power.rb +34 -36
  247. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process.rb +363 -364
  248. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/image.rb +102 -103
  249. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/io.rb +28 -29
  250. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/memory.rb +303 -304
  251. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/thread.rb +113 -114
  252. data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry.rb +260 -261
  253. data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry_subsystem/registry_key.rb +165 -166
  254. data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry_subsystem/registry_value.rb +69 -70
  255. data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry_subsystem/remote_registry_key.rb +160 -161
  256. data/lib/rex/post/meterpreter/extensions/stdapi/sys/thread.rb +143 -144
  257. data/lib/rex/post/meterpreter/extensions/stdapi/tlv.rb +29 -12
  258. data/lib/rex/post/meterpreter/extensions/stdapi/ui.rb +230 -231
  259. data/lib/rex/post/meterpreter/extensions/stdapi/webcam/webcam.rb +181 -44
  260. data/lib/rex/post/meterpreter/inbound_packet_handler.rb +12 -13
  261. data/lib/rex/post/meterpreter/object_aliases.rb +56 -57
  262. data/lib/rex/post/meterpreter/packet.rb +591 -592
  263. data/lib/rex/post/meterpreter/packet_dispatcher.rb +506 -496
  264. data/lib/rex/post/meterpreter/packet_parser.rb +72 -73
  265. data/lib/rex/post/meterpreter/packet_response_waiter.rb +56 -57
  266. data/lib/rex/post/meterpreter/ui/console.rb +112 -112
  267. data/lib/rex/post/meterpreter/ui/console/command_dispatcher.rb +53 -53
  268. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/core.rb +911 -854
  269. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/espia.rb +86 -86
  270. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi.rb +65 -0
  271. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi/adsi.rb +198 -0
  272. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi/clipboard.rb +444 -0
  273. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi/service.rb +199 -0
  274. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi/window.rb +118 -0
  275. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi/wmi.rb +108 -0
  276. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/incognito.rb +220 -220
  277. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/kiwi.rb +509 -0
  278. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/lanattacks.rb +60 -0
  279. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/lanattacks/dhcp.rb +254 -0
  280. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/lanattacks/tftp.rb +159 -0
  281. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/mimikatz.rb +182 -0
  282. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/networkpug.rb +173 -173
  283. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv.rb +40 -40
  284. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv/elevate.rb +75 -77
  285. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv/passwd.rb +30 -30
  286. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv/timestomp.rb +105 -105
  287. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/sniffer.rb +182 -182
  288. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi.rb +37 -37
  289. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/fs.rb +504 -482
  290. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/net.rb +401 -330
  291. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/sys.rb +883 -581
  292. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/ui.rb +296 -299
  293. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/webcam.rb +320 -153
  294. data/lib/rex/post/meterpreter/ui/console/interactive_channel.rb +78 -78
  295. data/lib/rex/post/permission.rb +0 -1
  296. data/lib/rex/post/process.rb +39 -40
  297. data/lib/rex/post/thread.rb +41 -42
  298. data/lib/rex/post/ui.rb +35 -36
  299. data/lib/rex/proto/addp.rb +218 -0
  300. data/lib/rex/proto/dcerpc/client.rb +344 -344
  301. data/lib/rex/proto/dcerpc/exceptions.rb +128 -128
  302. data/lib/rex/proto/dcerpc/handle.rb +32 -32
  303. data/lib/rex/proto/dcerpc/ndr.rb +56 -56
  304. data/lib/rex/proto/dcerpc/packet.rb +249 -245
  305. data/lib/rex/proto/dcerpc/response.rb +170 -170
  306. data/lib/rex/proto/dcerpc/uuid.rb +65 -65
  307. data/lib/rex/proto/dcerpc/wdscp.rb +3 -0
  308. data/lib/rex/proto/dcerpc/wdscp/constants.rb +89 -0
  309. data/lib/rex/proto/dcerpc/wdscp/packet.rb +94 -0
  310. data/lib/rex/proto/dhcp.rb +0 -1
  311. data/lib/rex/proto/dhcp/constants.rb +0 -1
  312. data/lib/rex/proto/dhcp/server.rb +303 -304
  313. data/lib/rex/proto/drda/constants.rb +1 -1
  314. data/lib/rex/proto/drda/packet.rb +186 -186
  315. data/lib/rex/proto/drda/utils.rb +104 -104
  316. data/lib/rex/proto/http.rb +1 -0
  317. data/lib/rex/proto/http/client.rb +692 -820
  318. data/lib/rex/proto/http/client_request.rb +472 -0
  319. data/lib/rex/proto/http/handler.rb +25 -25
  320. data/lib/rex/proto/http/handler/erb.rb +104 -104
  321. data/lib/rex/proto/http/handler/proc.rb +37 -37
  322. data/lib/rex/proto/http/header.rb +149 -149
  323. data/lib/rex/proto/http/packet.rb +388 -382
  324. data/lib/rex/proto/http/request.rb +332 -335
  325. data/lib/rex/proto/http/response.rb +132 -72
  326. data/lib/rex/proto/http/server.rb +348 -338
  327. data/lib/rex/proto/iax2/call.rb +310 -310
  328. data/lib/rex/proto/iax2/client.rb +197 -197
  329. data/lib/rex/proto/iax2/codecs/alaw.rb +4 -4
  330. data/lib/rex/proto/iax2/codecs/mulaw.rb +4 -4
  331. data/lib/rex/proto/ipmi.rb +57 -0
  332. data/lib/rex/proto/ipmi/channel_auth_reply.rb +88 -0
  333. data/lib/rex/proto/ipmi/open_session_reply.rb +35 -0
  334. data/lib/rex/proto/ipmi/rakp2.rb +35 -0
  335. data/lib/rex/proto/ipmi/utils.rb +125 -0
  336. data/lib/rex/proto/natpmp.rb +1 -5
  337. data/lib/rex/proto/natpmp/constants.rb +4 -4
  338. data/lib/rex/proto/natpmp/packet.rb +25 -25
  339. data/lib/rex/proto/ntlm/base.rb +271 -271
  340. data/lib/rex/proto/ntlm/constants.rb +61 -61
  341. data/lib/rex/proto/ntlm/crypt.rb +348 -352
  342. data/lib/rex/proto/ntlm/exceptions.rb +3 -3
  343. data/lib/rex/proto/ntlm/message.rb +468 -471
  344. data/lib/rex/proto/ntlm/utils.rb +746 -746
  345. data/lib/rex/proto/pjl.rb +30 -0
  346. data/lib/rex/proto/pjl/client.rb +162 -0
  347. data/lib/rex/proto/proxy/socks4a.rb +440 -440
  348. data/lib/rex/proto/rfb.rb +1 -8
  349. data/lib/rex/proto/rfb/cipher.rb +46 -49
  350. data/lib/rex/proto/rfb/client.rb +179 -182
  351. data/lib/rex/proto/rfb/constants.rb +18 -21
  352. data/lib/rex/proto/smb/client.rb +1954 -1843
  353. data/lib/rex/proto/smb/constants.rb +533 -516
  354. data/lib/rex/proto/smb/crypt.rb +21 -21
  355. data/lib/rex/proto/smb/evasions.rb +43 -43
  356. data/lib/rex/proto/smb/exceptions.rb +791 -791
  357. data/lib/rex/proto/smb/simpleclient.rb +142 -286
  358. data/lib/rex/proto/smb/simpleclient/open_file.rb +106 -0
  359. data/lib/rex/proto/smb/simpleclient/open_pipe.rb +57 -0
  360. data/lib/rex/proto/smb/utils.rb +81 -81
  361. data/lib/rex/proto/sunrpc/client.rb +158 -158
  362. data/lib/rex/proto/tftp.rb +0 -1
  363. data/lib/rex/proto/tftp/client.rb +289 -289
  364. data/lib/rex/proto/tftp/constants.rb +9 -10
  365. data/lib/rex/proto/tftp/server.rb +466 -467
  366. data/lib/rex/random_identifier_generator.rb +176 -0
  367. data/lib/rex/registry.rb +1 -1
  368. data/lib/rex/registry/hive.rb +88 -88
  369. data/lib/rex/registry/lfkey.rb +25 -25
  370. data/lib/rex/registry/nodekey.rb +30 -30
  371. data/lib/rex/registry/regf.rb +10 -10
  372. data/lib/rex/registry/valuekey.rb +43 -43
  373. data/lib/rex/registry/valuelist.rb +13 -13
  374. data/lib/rex/ropbuilder/rop.rb +254 -253
  375. data/lib/rex/script.rb +21 -22
  376. data/lib/rex/script/base.rb +51 -50
  377. data/lib/rex/script/meterpreter.rb +2 -2
  378. data/lib/rex/service.rb +24 -24
  379. data/lib/rex/service_manager.rb +132 -132
  380. data/lib/rex/services/local_relay.rb +398 -398
  381. data/lib/rex/socket.rb +758 -763
  382. data/lib/rex/socket/comm.rb +95 -95
  383. data/lib/rex/socket/comm/local.rb +507 -440
  384. data/lib/rex/socket/ip.rb +118 -118
  385. data/lib/rex/socket/parameters.rb +351 -350
  386. data/lib/rex/socket/range_walker.rb +445 -368
  387. data/lib/rex/socket/ssl_tcp.rb +323 -317
  388. data/lib/rex/socket/ssl_tcp_server.rb +173 -158
  389. data/lib/rex/socket/subnet_walker.rb +48 -48
  390. data/lib/rex/socket/switch_board.rb +259 -259
  391. data/lib/rex/socket/tcp.rb +58 -56
  392. data/lib/rex/socket/tcp_server.rb +42 -42
  393. data/lib/rex/socket/udp.rb +152 -152
  394. data/lib/rex/sslscan/result.rb +200 -0
  395. data/lib/rex/sslscan/scanner.rb +205 -0
  396. data/lib/rex/struct2.rb +0 -1
  397. data/lib/rex/struct2/c_struct.rb +162 -163
  398. data/lib/rex/struct2/c_struct_template.rb +21 -22
  399. data/lib/rex/struct2/constant.rb +6 -7
  400. data/lib/rex/struct2/element.rb +30 -31
  401. data/lib/rex/struct2/generic.rb +60 -61
  402. data/lib/rex/struct2/restraint.rb +40 -41
  403. data/lib/rex/struct2/s_string.rb +60 -61
  404. data/lib/rex/struct2/s_struct.rb +97 -98
  405. data/lib/rex/sync.rb +0 -1
  406. data/lib/rex/sync/event.rb +62 -72
  407. data/lib/rex/sync/read_write_lock.rb +149 -149
  408. data/lib/rex/sync/ref.rb +42 -42
  409. data/lib/rex/sync/thread_safe.rb +59 -59
  410. data/lib/rex/text.rb +1803 -1315
  411. data/lib/rex/thread_factory.rb +25 -25
  412. data/lib/rex/time.rb +44 -44
  413. data/lib/rex/transformer.rb +91 -91
  414. data/lib/rex/ui/interactive.rb +265 -265
  415. data/lib/rex/ui/output.rb +66 -60
  416. data/lib/rex/ui/progress_tracker.rb +79 -79
  417. data/lib/rex/ui/subscriber.rb +144 -134
  418. data/lib/rex/ui/text/color.rb +76 -76
  419. data/lib/rex/ui/text/dispatcher_shell.rb +512 -505
  420. data/lib/rex/ui/text/input.rb +96 -96
  421. data/lib/rex/ui/text/input/buffer.rb +58 -58
  422. data/lib/rex/ui/text/input/readline.rb +114 -114
  423. data/lib/rex/ui/text/input/socket.rb +77 -77
  424. data/lib/rex/ui/text/input/stdio.rb +24 -24
  425. data/lib/rex/ui/text/irb_shell.rb +45 -41
  426. data/lib/rex/ui/text/output.rb +64 -60
  427. data/lib/rex/ui/text/output/buffer.rb +42 -42
  428. data/lib/rex/ui/text/output/buffer/stdout.rb +25 -0
  429. data/lib/rex/ui/text/output/file.rb +24 -24
  430. data/lib/rex/ui/text/output/socket.rb +24 -24
  431. data/lib/rex/ui/text/output/stdio.rb +29 -29
  432. data/lib/rex/ui/text/output/tee.rb +36 -36
  433. data/lib/rex/ui/text/progress_tracker.rb +37 -37
  434. data/lib/rex/ui/text/shell.rb +371 -361
  435. data/lib/rex/ui/text/table.rb +320 -284
  436. data/lib/rex/zip.rb +0 -1
  437. data/lib/rex/zip/archive.rb +115 -94
  438. data/lib/rex/zip/blocks.rb +101 -100
  439. data/lib/rex/zip/entry.rb +108 -99
  440. data/lib/rex/zip/jar.rb +261 -206
  441. data/lib/rex/zip/samples/comment.rb +1 -2
  442. data/lib/rex/zip/samples/mkwar.rb +12 -13
  443. data/lib/rex/zip/samples/mkzip.rb +1 -2
  444. data/lib/rex/zip/samples/recursive.rb +29 -30
  445. metadata +424 -446
  446. data/lib/rex/arch/sparc.rb.ut.rb +0 -19
  447. data/lib/rex/arch/x86.rb.ut.rb +0 -94
  448. data/lib/rex/assembly/nasm.rb.ut.rb +0 -23
  449. data/lib/rex/encoder/ndr.rb.ut.rb +0 -45
  450. data/lib/rex/encoder/xdr.rb.ut.rb +0 -30
  451. data/lib/rex/encoders/xor_dword_additive.rb.ut.rb +0 -13
  452. data/lib/rex/encoding/xor.rb.ts.rb +0 -15
  453. data/lib/rex/encoding/xor/byte.rb.ut.rb +0 -22
  454. data/lib/rex/encoding/xor/dword.rb.ut.rb +0 -16
  455. data/lib/rex/encoding/xor/dword_additive.rb.ut.rb +0 -16
  456. data/lib/rex/encoding/xor/generic.rb.ut.rb +0 -121
  457. data/lib/rex/encoding/xor/word.rb.ut.rb +0 -14
  458. data/lib/rex/exceptions.rb.ut.rb +0 -45
  459. data/lib/rex/exploitation/egghunter.rb.ut.rb +0 -28
  460. data/lib/rex/exploitation/javascriptosdetect.js +0 -1014
  461. data/lib/rex/exploitation/javascriptosdetect.rb +0 -43
  462. data/lib/rex/exploitation/omelet.rb.ut.rb +0 -27
  463. data/lib/rex/exploitation/opcodedb.rb.ut.rb +0 -280
  464. data/lib/rex/exploitation/seh.rb.ut.rb +0 -20
  465. data/lib/rex/file.rb.ut.rb +0 -17
  466. data/lib/rex/io/ring_buffer.rb.ut.rb +0 -135
  467. data/lib/rex/nop/opty2.rb.ut.rb +0 -24
  468. data/lib/rex/parser/arguments.rb.ut.rb +0 -68
  469. data/lib/rex/parser/ini.rb.ut.rb +0 -30
  470. data/lib/rex/post/meterpreter/extensions/stdapi/railgun.rb.ts.rb +0 -18
  471. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/api_constants.rb.ut.rb +0 -39
  472. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/buffer_item.rb.ut.rb +0 -37
  473. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll.rb.ut.rb +0 -52
  474. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_function.rb.ut.rb +0 -43
  475. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_helper.rb.ut.rb +0 -128
  476. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_wrapper.rb.ut.rb +0 -64
  477. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/platform_util.rb.ut.rb +0 -29
  478. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/railgun.rb.ut.rb +0 -155
  479. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/type/pointer_util.rb.ut.rb +0 -128
  480. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/win_const_manager.rb.ut.rb +0 -124
  481. data/lib/rex/proto.rb.ts.rb +0 -9
  482. data/lib/rex/proto/dcerpc.rb.ts.rb +0 -10
  483. data/lib/rex/proto/dcerpc/client.rb.ut.rb +0 -492
  484. data/lib/rex/proto/dcerpc/handle.rb.ut.rb +0 -86
  485. data/lib/rex/proto/dcerpc/ndr.rb.ut.rb +0 -42
  486. data/lib/rex/proto/dcerpc/packet.rb.ut.rb +0 -57
  487. data/lib/rex/proto/dcerpc/response.rb.ut.rb +0 -16
  488. data/lib/rex/proto/dcerpc/uuid.rb.ut.rb +0 -47
  489. data/lib/rex/proto/drda.rb.ts.rb +0 -18
  490. data/lib/rex/proto/drda/constants.rb.ut.rb +0 -24
  491. data/lib/rex/proto/drda/packet.rb.ut.rb +0 -110
  492. data/lib/rex/proto/drda/utils.rb.ut.rb +0 -85
  493. data/lib/rex/proto/http.rb.ts.rb +0 -13
  494. data/lib/rex/proto/http/client.rb.ut.rb +0 -96
  495. data/lib/rex/proto/http/handler/erb.rb.ut.rb +0 -22
  496. data/lib/rex/proto/http/handler/erb.rb.ut.rb.rhtml +0 -1
  497. data/lib/rex/proto/http/handler/proc.rb.ut.rb +0 -25
  498. data/lib/rex/proto/http/header.rb.ut.rb +0 -47
  499. data/lib/rex/proto/http/packet.rb.ut.rb +0 -166
  500. data/lib/rex/proto/http/request.rb.ut.rb +0 -215
  501. data/lib/rex/proto/http/response.rb.ut.rb +0 -150
  502. data/lib/rex/proto/http/server.rb.ut.rb +0 -80
  503. data/lib/rex/proto/ntlm.rb.ut.rb +0 -181
  504. data/lib/rex/proto/rfb.rb.ut.rb +0 -40
  505. data/lib/rex/proto/smb.rb.ts.rb +0 -9
  506. data/lib/rex/proto/smb/client.rb.ut.rb +0 -224
  507. data/lib/rex/proto/smb/constants.rb.ut.rb +0 -19
  508. data/lib/rex/proto/smb/simpleclient.rb.ut.rb +0 -129
  509. data/lib/rex/proto/smb/utils.rb.ut.rb +0 -21
  510. data/lib/rex/proto/tftp/server.rb.ut.rb +0 -29
  511. data/lib/rex/service_manager.rb.ut.rb +0 -33
  512. data/lib/rex/socket.rb.ut.rb +0 -108
  513. data/lib/rex/socket/comm/local.rb.ut.rb +0 -76
  514. data/lib/rex/socket/parameters.rb.ut.rb +0 -52
  515. data/lib/rex/socket/range_walker.rb.ut.rb +0 -56
  516. data/lib/rex/socket/ssl_tcp.rb.ut.rb +0 -40
  517. data/lib/rex/socket/ssl_tcp_server.rb.ut.rb +0 -62
  518. data/lib/rex/socket/subnet_walker.rb.ut.rb +0 -29
  519. data/lib/rex/socket/switch_board.rb.ut.rb +0 -53
  520. data/lib/rex/socket/tcp.rb.ut.rb +0 -65
  521. data/lib/rex/socket/tcp_server.rb.ut.rb +0 -45
  522. data/lib/rex/socket/udp.rb.ut.rb +0 -45
  523. data/lib/rex/test.rb +0 -36
  524. data/lib/rex/text.rb.ut.rb +0 -193
  525. data/lib/rex/transformer.rb.ut.rb +0 -39
  526. data/lib/rex/ui/text/color.rb.ut.rb +0 -19
  527. data/lib/rex/ui/text/progress_tracker.rb.ut.rb +0 -35
  528. data/lib/rex/ui/text/table.rb.ut.rb +0 -56
@@ -1,8 +1,4 @@
1
1
  # -*- coding: binary -*-
2
- ##
3
- # $Id: propset.rb 15548 2012-06-29 06:08:20Z rapid7 $
4
- # Version: $Revision: 15548 $
5
- ##
6
2
 
7
3
  ##
8
4
  # Rex::OLE - an OLE implementation
@@ -14,129 +10,129 @@ module OLE
14
10
 
15
11
  class Property
16
12
 
17
- def initialize(id, type, data)
18
- @id = id
19
- @type = type
20
- @data = data
21
- end
22
-
23
- def pack_pio(off = 0)
24
- [ @id, off ].pack('V*')
25
- end
26
-
27
- def pack_data
28
- buf = [ @type ].pack('V')
29
- case @type
30
- when VT_BLOB
31
- buf << [ @data.length ].pack('V')
32
- when VT_CF
33
- buf << [ 4 + @data.length, -1 ].pack('V*')
34
- end
35
- buf << @data
36
- buf
37
- end
38
-
39
- def to_s
40
- "Rex::OLE::Property - to_s unimplemented"
41
- end
13
+ def initialize(id, type, data)
14
+ @id = id
15
+ @type = type
16
+ @data = data
17
+ end
18
+
19
+ def pack_pio(off = 0)
20
+ [ @id, off ].pack('V*')
21
+ end
22
+
23
+ def pack_data
24
+ buf = [ @type ].pack('V')
25
+ case @type
26
+ when VT_BLOB
27
+ buf << [ @data.length ].pack('V')
28
+ when VT_CF
29
+ buf << [ 4 + @data.length, -1 ].pack('V*')
30
+ end
31
+ buf << @data
32
+ buf
33
+ end
34
+
35
+ def to_s
36
+ "Rex::OLE::Property - to_s unimplemented"
37
+ end
42
38
 
43
39
  end
44
40
 
45
41
  class PropertySet
46
42
 
47
- def initialize(fmtid = nil)
48
- @fmtid = CLSID.new(fmtid)
49
- @properties = []
50
- end
51
-
52
- def <<(val)
53
- @properties << val
54
- end
55
-
56
- def pack_fno(off = 0)
57
- @fmtid.pack + [ off ].pack('V')
58
- end
59
-
60
- def pack_data
61
- # Pack all the property data
62
- data = []
63
- dlen = 0
64
- @properties.each { |p|
65
- dat = p.pack_data
66
- dlen += dat.length
67
- data << dat
68
- }
69
-
70
- buf = ''
71
- # First the header
72
- off = 8 + (@properties.length * 8)
73
- buf << [ off + dlen, @properties.length ].pack('V*')
74
- # Now, the Property Id and Offset for each
75
- @properties.each_with_index { |p,x|
76
- buf << p.pack_pio(off)
77
- off += data[x].length
78
- }
79
- # Finally, all the data
80
- buf << data.join
81
- buf
82
- end
83
-
84
- def to_s
85
- "Rex::OLE::PropertySet - to_s unimplemented"
86
- end
43
+ def initialize(fmtid = nil)
44
+ @fmtid = CLSID.new(fmtid)
45
+ @properties = []
46
+ end
47
+
48
+ def <<(val)
49
+ @properties << val
50
+ end
51
+
52
+ def pack_fno(off = 0)
53
+ @fmtid.pack + [ off ].pack('V')
54
+ end
55
+
56
+ def pack_data
57
+ # Pack all the property data
58
+ data = []
59
+ dlen = 0
60
+ @properties.each { |p|
61
+ dat = p.pack_data
62
+ dlen += dat.length
63
+ data << dat
64
+ }
65
+
66
+ buf = ''
67
+ # First the header
68
+ off = 8 + (@properties.length * 8)
69
+ buf << [ off + dlen, @properties.length ].pack('V*')
70
+ # Now, the Property Id and Offset for each
71
+ @properties.each_with_index { |p,x|
72
+ buf << p.pack_pio(off)
73
+ off += data[x].length
74
+ }
75
+ # Finally, all the data
76
+ buf << data.join
77
+ buf
78
+ end
79
+
80
+ def to_s
81
+ "Rex::OLE::PropertySet - to_s unimplemented"
82
+ end
87
83
 
88
84
  end
89
85
 
90
86
  class PropertySetStream
91
87
 
92
- def initialize
93
- @byte_order = 0xfffe
94
- @ole_version = 0
95
- @os_version = 1
96
- @os_platform = 2
97
- @clsid = CLSID.new
98
-
99
- @propsets = []
100
- end
101
-
102
- def <<(ps)
103
- @propsets << ps
104
- end
105
-
106
- def pack
107
- buf = ''
108
-
109
- # First, add the header
110
- buf << [
111
- @byte_order,
112
- @ole_version,
113
- @os_version,
114
- @os_platform
115
- ].pack('vvvv')
116
- buf << @clsid.pack
117
- buf << [@propsets.length].pack('V')
118
-
119
- # Pack all the PropertySet children
120
- data = []
121
- @propsets.each { |p|
122
- data << p.pack_data
123
- }
124
-
125
- # Next, add all the FMTID and Offset headers
126
- off = buf.length + (20 * @propsets.length)
127
- @propsets.each_with_index { |ps,x|
128
- buf << ps.pack_fno(off)
129
- off += data[x].length
130
- }
131
-
132
- # Finally, add all the data
133
- buf << data.join
134
- buf
135
- end
136
-
137
- def to_s
138
- "Rex::OLE::PropertySetStream - to_s unimplemented"
139
- end
88
+ def initialize
89
+ @byte_order = 0xfffe
90
+ @ole_version = 0
91
+ @os_version = 1
92
+ @os_platform = 2
93
+ @clsid = CLSID.new
94
+
95
+ @propsets = []
96
+ end
97
+
98
+ def <<(ps)
99
+ @propsets << ps
100
+ end
101
+
102
+ def pack
103
+ buf = ''
104
+
105
+ # First, add the header
106
+ buf << [
107
+ @byte_order,
108
+ @ole_version,
109
+ @os_version,
110
+ @os_platform
111
+ ].pack('vvvv')
112
+ buf << @clsid.pack
113
+ buf << [@propsets.length].pack('V')
114
+
115
+ # Pack all the PropertySet children
116
+ data = []
117
+ @propsets.each { |p|
118
+ data << p.pack_data
119
+ }
120
+
121
+ # Next, add all the FMTID and Offset headers
122
+ off = buf.length + (20 * @propsets.length)
123
+ @propsets.each_with_index { |ps,x|
124
+ buf << ps.pack_fno(off)
125
+ off += data[x].length
126
+ }
127
+
128
+ # Finally, add all the data
129
+ buf << data.join
130
+ buf
131
+ end
132
+
133
+ def to_s
134
+ "Rex::OLE::PropertySetStream - to_s unimplemented"
135
+ end
140
136
 
141
137
  end
142
138
 
@@ -1,9 +1,8 @@
1
- #!/usr/bin/env ruby
2
1
  # -*- coding: binary -*-
3
2
 
4
3
  msfbase = __FILE__
5
4
  while File.symlink?(msfbase)
6
- msfbase = File.expand_path(File.readlink(msfbase), File.dirname(msfbase))
5
+ msfbase = File.expand_path(File.readlink(msfbase), File.dirname(msfbase))
7
6
  end
8
7
  path = File.expand_path(File.dirname(msfbase))
9
8
  path += "/../../../"
@@ -13,16 +12,16 @@ $:.unshift(path)
13
12
  require 'rex/ole'
14
13
 
15
14
  if (ARGV.length < 1)
16
- $stderr.puts "usage: make_ole <file>"
17
- exit(1)
15
+ $stderr.puts "usage: make_ole <file>"
16
+ exit(1)
18
17
  end
19
18
 
20
19
  document = ARGV.shift
21
20
 
22
21
  if (stg = Rex::OLE::Storage.new(document, Rex::OLE::STGM_WRITE))
23
- if (stm = stg.create_stream("testing"))
24
- stm << "A" * 1024
25
- stm.close
26
- end
27
- stg.close
22
+ if (stm = stg.create_stream("testing"))
23
+ stm << "A" * 1024
24
+ stm.close
25
+ end
26
+ stg.close
28
27
  end
@@ -1,9 +1,8 @@
1
- #!/usr/bin/env ruby
2
1
  # -*- coding: binary -*-
3
2
 
4
3
  msfbase = __FILE__
5
4
  while File.symlink?(msfbase)
6
- msfbase = File.expand_path(File.readlink(msfbase), File.dirname(msfbase))
5
+ msfbase = File.expand_path(File.readlink(msfbase), File.dirname(msfbase))
7
6
  end
8
7
  path = File.expand_path(File.dirname(msfbase))
9
8
  path += "/../../../"
@@ -13,8 +12,8 @@ $:.unshift(path)
13
12
  require 'rex/ole'
14
13
 
15
14
  if (ARGV.length < 1)
16
- $stderr.puts "usage: dir <file>"
17
- exit(1)
15
+ $stderr.puts "usage: dir <file>"
16
+ exit(1)
18
17
  end
19
18
 
20
19
  document = ARGV.shift
@@ -22,15 +21,15 @@ document = ARGV.shift
22
21
 
23
22
  # recursive printer :)
24
23
  def show_entries(ent, spaces=0)
25
- spstr = " " * spaces
24
+ spstr = " " * spaces
26
25
 
27
- puts "%s + #{ent.name}" % spstr
28
- ent.each { |el|
29
- show_entries(el, spaces+2)
30
- }
26
+ puts "%s + #{ent.name}" % spstr
27
+ ent.each { |el|
28
+ show_entries(el, spaces+2)
29
+ }
31
30
  end
32
31
 
33
32
  if (stg = Rex::OLE::Storage.new(document))
34
- show_entries(stg)
35
- stg.close
33
+ show_entries(stg)
34
+ stg.close
36
35
  end
@@ -1,9 +1,8 @@
1
- #!/usr/bin/env ruby
2
1
  # -*- coding: binary -*-
3
2
 
4
3
  msfbase = __FILE__
5
4
  while File.symlink?(msfbase)
6
- msfbase = File.expand_path(File.readlink(msfbase), File.dirname(msfbase))
5
+ msfbase = File.expand_path(File.readlink(msfbase), File.dirname(msfbase))
7
6
  end
8
7
  path = File.expand_path(File.dirname(msfbase))
9
8
  path += "/../../../"
@@ -12,24 +11,24 @@ $:.unshift(path)
12
11
  require 'rex/ole'
13
12
 
14
13
  if (ARGV.length < 2)
15
- $stderr.puts "usage: dump_stream <file> <stream>"
16
- exit(1)
14
+ $stderr.puts "usage: dump_stream <file> <stream>"
15
+ exit(1)
17
16
  end
18
17
 
19
18
  document = ARGV.shift
20
19
  stream = ARGV.shift
21
20
 
22
21
  if (stg = Rex::OLE::Storage.new(document))
23
- if (stm = stg.open_stream(stream))
24
- data = stm.read(stm.length)
25
- data ||= ""
26
- $stderr.puts "Successfully opened the \"%s\" stream (%u bytes)" % [stream, data.length]
27
- $stdout.print data
28
- stm.close
29
- else
30
- $stderr.puts "Unable to open stream: #{stream}"
31
- end
32
- stg.close
22
+ if (stm = stg.open_stream(stream))
23
+ data = stm.read(stm.length)
24
+ data ||= ""
25
+ $stderr.puts "Successfully opened the \"%s\" stream (%u bytes)" % [stream, data.length]
26
+ $stdout.print data
27
+ stm.close
28
+ else
29
+ $stderr.puts "Unable to open stream: #{stream}"
30
+ end
31
+ stg.close
33
32
  else
34
- $stderr.puts "Unable to open storage: #{document}"
33
+ $stderr.puts "Unable to open storage: #{document}"
35
34
  end
@@ -1,9 +1,8 @@
1
- #!/usr/bin/env ruby
2
1
  # -*- coding: binary -*-
3
2
 
4
3
  msfbase = __FILE__
5
4
  while File.symlink?(msfbase)
6
- msfbase = File.expand_path(File.readlink(msfbase), File.dirname(msfbase))
5
+ msfbase = File.expand_path(File.readlink(msfbase), File.dirname(msfbase))
7
6
  end
8
7
  path = File.expand_path(File.dirname(msfbase))
9
8
  path += "/../../../"
@@ -12,13 +11,13 @@ $:.unshift(path)
12
11
  require 'rex/ole'
13
12
 
14
13
  if (ARGV.length < 1)
15
- $stderr.puts "usage: ole_info <file>"
16
- exit(1)
14
+ $stderr.puts "usage: ole_info <file>"
15
+ exit(1)
17
16
  end
18
17
 
19
18
  document = ARGV.shift
20
19
 
21
20
  if (stg = Rex::OLE::Storage.new(document))
22
- puts stg.inspect
23
- stg.close
21
+ puts stg.inspect
22
+ stg.close
24
23
  end
@@ -1,8 +1,4 @@
1
1
  # -*- coding: binary -*-
2
- ##
3
- # $Id: storage.rb 15548 2012-06-29 06:08:20Z rapid7 $
4
- # Version: $Revision: 15548 $
5
- ##
6
2
 
7
3
  ##
8
4
  # Rex::OLE - an OLE implementation
@@ -14,381 +10,381 @@ module OLE
14
10
 
15
11
  class Storage
16
12
 
17
- attr_accessor :header
18
-
19
- def initialize(filename=nil, mode=STGM_READ)
20
- @mode = mode
21
- @modified = nil
22
-
23
- @fd = nil
24
- @filename = nil
25
- @header = Header.new
26
- @difat = DIFAT.new self
27
- @fat = FAT.new self
28
- @minifat = MiniFAT.new self
29
- @directory = Directory.new self
30
- @ministream = Stream.new self
31
-
32
- if (filename)
33
- @filename = filename
34
- open(filename, mode)
35
- return
36
- end
37
- end
38
-
39
-
40
- def each
41
- @directory.each { |el|
42
- yield el
43
- }
44
- end
45
-
46
-
47
- def name
48
- @filename
49
- end
50
-
51
-
52
- def open(filename, mode)
53
- if (mode == STGM_READWRITE)
54
- fmode = 'r+b'
55
- elsif (mode == STGM_WRITE)
56
- fmode = 'w+b'
57
- else
58
- fmode = 'rb'
59
- end
60
-
61
- @fd = File.new(filename, fmode)
62
-
63
- # don't read for new files
64
- if (mode == STGM_WRITE)
65
- # ensure there is a root
66
- write_to_disk
67
- return
68
- end
69
-
70
- # parse the header
71
- @header.read @fd
72
- @difat.read
73
- @fat.read @difat
74
- @minifat.read
75
- @directory.read
76
- # NOTE: we can't use read_stream_data here (must read using regular FAT, regardless of size)
77
- # read data using the root node's start/length
78
- @ministream << read_data(@directory)
79
- end
80
-
81
- def close
82
- if (@modified) and (@mode != STGM_READ)
83
- write_to_disk
84
- end
85
- @fd.close
86
- end
87
-
88
- def inspect
89
- ret = ""
90
- ret << "header = %s\n" % @header.to_s
91
-
92
- ret << "*** %u DIFAT sectors\n" % @difat.length
93
- ret << @difat.to_s << "\n"
94
-
95
- ret << "*** %u FAT sectors\n" % @fat.length
96
- ret << @fat.to_s << "\n"
97
-
98
- ret << "*** %u MiniFAT sectors:\n" % @minifat.length
99
- if (@minifat.length > 0)
100
- ret << @minifat.to_s << "\n"
101
- end
102
-
103
- ret << "*** ministream (%u bytes):\n" % @ministream.length
104
- if (@ministream.length > 0)
105
- ret << @ministream.to_s << "\n"
106
- end
107
-
108
- ret << "*** %u directory entries\n" % @directory.num_entries
109
- ret << @directory.to_s << "\n"
110
- end
111
-
112
-
113
- #
114
- # stream manipulation functions
115
- #
116
- def create_stream(name, mode=STGM_WRITE, parent_stg=nil)
117
- if (stm = open_stream(name, mode, parent_stg))
118
- stm.close
119
- return nil
120
- end
121
-
122
- # eek, don't check the name for now
123
- # if we do, we cant create alot of streams (summary info for example)
13
+ attr_accessor :header
14
+
15
+ def initialize(filename=nil, mode=STGM_READ)
16
+ @mode = mode
17
+ @modified = nil
18
+
19
+ @fd = nil
20
+ @filename = nil
21
+ @header = Header.new
22
+ @difat = DIFAT.new self
23
+ @fat = FAT.new self
24
+ @minifat = MiniFAT.new self
25
+ @directory = Directory.new self
26
+ @ministream = Stream.new self
27
+
28
+ if (filename)
29
+ @filename = filename
30
+ open(filename, mode)
31
+ return
32
+ end
33
+ end
34
+
35
+
36
+ def each
37
+ @directory.each { |el|
38
+ yield el
39
+ }
40
+ end
41
+
42
+
43
+ def name
44
+ @filename
45
+ end
46
+
47
+
48
+ def open(filename, mode)
49
+ if (mode == STGM_READWRITE)
50
+ fmode = 'r+b'
51
+ elsif (mode == STGM_WRITE)
52
+ fmode = 'w+b'
53
+ else
54
+ fmode = 'rb'
55
+ end
56
+
57
+ @fd = File.new(filename, fmode)
58
+
59
+ # don't read for new files
60
+ if (mode == STGM_WRITE)
61
+ # ensure there is a root
62
+ write_to_disk
63
+ return
64
+ end
65
+
66
+ # parse the header
67
+ @header.read @fd
68
+ @difat.read
69
+ @fat.read @difat
70
+ @minifat.read
71
+ @directory.read
72
+ # NOTE: we can't use read_stream_data here (must read using regular FAT, regardless of size)
73
+ # read data using the root node's start/length
74
+ @ministream << read_data(@directory)
75
+ end
76
+
77
+ def close
78
+ if (@modified) and (@mode != STGM_READ)
79
+ write_to_disk
80
+ end
81
+ @fd.close
82
+ end
83
+
84
+ def inspect
85
+ ret = ""
86
+ ret << "header = %s\n" % @header.to_s
87
+
88
+ ret << "*** %u DIFAT sectors\n" % @difat.length
89
+ ret << @difat.to_s << "\n"
90
+
91
+ ret << "*** %u FAT sectors\n" % @fat.length
92
+ ret << @fat.to_s << "\n"
93
+
94
+ ret << "*** %u MiniFAT sectors:\n" % @minifat.length
95
+ if (@minifat.length > 0)
96
+ ret << @minifat.to_s << "\n"
97
+ end
98
+
99
+ ret << "*** ministream (%u bytes):\n" % @ministream.length
100
+ if (@ministream.length > 0)
101
+ ret << @ministream.to_s << "\n"
102
+ end
103
+
104
+ ret << "*** %u directory entries\n" % @directory.num_entries
105
+ ret << @directory.to_s << "\n"
106
+ end
107
+
108
+
109
+ #
110
+ # stream manipulation functions
111
+ #
112
+ def create_stream(name, mode=STGM_WRITE, parent_stg=nil)
113
+ if (stm = open_stream(name, mode, parent_stg))
114
+ stm.close
115
+ return nil
116
+ end
117
+
118
+ # eek, don't check the name for now
119
+ # if we do, we cant create alot of streams (summary info for example)
124
120
  =begin
125
- if (not Util.name_is_valid(name))
126
- return nil
127
- end
121
+ if (not Util.name_is_valid(name))
122
+ return nil
123
+ end
128
124
  =end
129
125
 
130
- stm = Stream.new self
131
- stm.name = name
132
- parent_stg ||= @directory
133
- dlog("Adding stream #{name} to storage #{parent_stg.name}", 'rex', LEV_3)
134
- @directory.link_item(parent_stg, stm)
135
- @modified = true
136
- stm
137
- end
138
-
139
- def open_stream(name, mode=STGM_READ, parent_stg=nil)
140
- parent_stg ||= @directory
141
- stm = parent_stg.find_stream_by_name_and_type(name, STGTY_STREAM)
142
- if (stm)
143
- # TODO: optimize out the need to read all of the data up-front
144
- stm << read_stream_data(stm)
145
- end
146
- stm
147
- end
148
-
149
-
150
- #
151
- # storage manipulation functions
152
- #
153
- def create_storage(name, mode=STGM_READ, parent_stg=nil)
154
- stg = SubStorage.new self
155
- stg.name = name
156
- parent_stg ||= @directory
157
- dlog("Adding storage #{name} to storage #{parent_stg.name}", 'rex', LEV_3)
158
- @directory.link_item(parent_stg, stg)
159
- stg
160
- end
161
-
162
- def open_storage(name, mode=STGM_READ, parent_stg=nil)
163
- @directory.find_stream_by_name_and_type(name, STGTY_STORAGE)
164
- end
165
-
166
-
167
- #
168
- # low-level functions
169
- #
170
- def write_to_disk
171
- # reset FAT/DIFAT
172
- @difat = DIFAT.new self
173
- @fat = FAT.new self
174
-
175
- @header.write @fd
176
- write_user_data
177
-
178
- # NOTE: we call write_stream here since we MUST write this to
179
- # the regular stream (regardless of size)
180
- ms_start = write_stream(@ministream)
181
- @directory.set_ministream_params(ms_start, @ministream.length)
182
-
183
- @minifat.write
184
- @directory.write
185
- @fat.write(@difat)
186
- @difat.write
187
-
188
- # write it again, now that its complete
189
- @header.write @fd
190
- @fd.flush
191
- end
192
-
193
- def write_sector(sbuf, type=nil, prev_sect=nil)
194
- len = sbuf.length
195
- if (len != @header.sector_size)
196
- # pad it if less
197
- if (len < @header.sector_size)
198
- sbuf = sbuf.dup
199
- sbuf << "\x00" * (@header.sector_size - len)
200
- else
201
- raise RuntimeError, 'not sector sized!'
202
- end
203
- end
204
-
205
- # write the data
206
- idx = @fat.allocate_sector(type)
207
- # point previous sector to here
208
- if (prev_sect)
209
- @fat[prev_sect] = idx
210
- end
211
- write_sector_raw(idx, sbuf)
212
- return idx
213
- end
214
-
215
- def write_sector_raw(sect, sbuf)
216
- dlog("Writing sector 0x%02x" % sect, 'rex', LEV_3)
217
- @fd.seek((sect + 1) * @header.sector_size, ::IO::SEEK_SET)
218
- @fd.write(sbuf)
219
- end
220
-
221
-
222
- def write_mini_sector(sbuf, prev_sect=nil)
223
- len = sbuf.length
224
- if (len != @header.mini_sector_size)
225
- if (len < @header.mini_sector_size)
226
- sbuf = sbuf.dup
227
- sbuf << "\x00" * (@header.mini_sector_size - len)
228
- else
229
- raise RuntimeError, 'not mini sector sized!'
230
- end
231
- end
232
-
233
- idx = @minifat.allocate_sector
234
- # point the previous mini sector to here
235
- if (prev_sect)
236
- @minifat[prev_sect] = idx
237
- end
238
- write_mini_sector_raw(idx, sbuf)
239
- idx
240
- end
241
-
242
- def write_mini_sector_raw(sect, sbuf)
243
- dlog("Writing mini sector 0x%02x" % sect, 'rex', LEV_3)
244
- @ministream << sbuf
245
- end
246
-
247
-
248
-
249
- def write_user_data
250
- @directory.each_entry { |stm|
251
- # only regular streams this pass
252
- next if (stm.type != STGTY_STREAM)
253
-
254
- if (stm.length >= @header._ulMiniSectorCutoff)
255
- stm.start_sector = write_stream(stm)
256
- else
257
- # NOTE: stm_start is a minifat value
258
- stm.start_sector = write_mini_stream(stm)
259
- end
260
- }
261
- end
262
-
263
- def write_stream(stm)
264
- dlog("Writing \"%s\" to regular stream" % stm.name, 'rex', LEV_3)
265
- stm_start = nil
266
- prev_sect = nil
267
- stm.seek(0)
268
- while (sbuf = stm.read(@header.sector_size))
269
- sect = write_sector(sbuf, nil, prev_sect)
270
- stm_start ||= sect
271
- prev_sect = sect
272
- end
273
- stm_start
274
- end
275
-
276
- def write_mini_stream(stm)
277
- dlog("Writing \"%s\" to mini stream" % stm.name, 'rex', LEV_3)
278
- prev_sect = nil
279
- stm.seek(0)
280
- while (sbuf = stm.read(@header.mini_sector_size))
281
- sect = write_mini_sector(sbuf, prev_sect)
282
- stm_start ||= sect
283
- prev_sect = sect
284
- end
285
- stm_start
286
- end
287
-
288
-
289
- def read_stream_data(direntry)
290
- if (direntry.length < @header._ulMiniSectorCutoff)
291
- return read_data_mini(direntry)
292
- end
293
-
294
- read_data(direntry)
295
- end
296
-
297
- def read_data(direntry)
298
- ret = ""
299
- visited = []
300
- left = direntry.length
301
- sect = direntry.start_sector
302
- while (sect != SECT_END)
303
- if (visited.include?(sect))
304
- raise RuntimeError, 'Sector chain loop detected (0x%08x)' % sect
305
- end
306
- visited << sect
307
-
308
- # how much to read?
309
- block = @header.sector_size
310
- block = left if (block > left)
311
-
312
- # read it.
313
- dlog("read_data - reading 0x%x bytes" % block, 'rex', LEV_3)
314
- buf = read_sector(sect, block)
315
- ret << buf
316
- left -= buf.length
317
-
318
- # done?
319
- break if (left == 0)
320
-
321
- sect = next_sector(sect)
322
- end
323
- ret
324
- end
325
-
326
- def read_data_mini(direntry)
327
- ret = ""
328
- visited = []
329
- left = direntry.length
330
- sect = direntry.start_sector
331
- while (sect != SECT_END)
332
- if (visited.include?(sect))
333
- raise RuntimeError, 'Sector chain loop detected (0x%08x mini)' % sect
334
- end
335
- visited << sect
336
-
337
- # how much to read?
338
- block = @header.mini_sector_size
339
- block = left if (block > left)
340
-
341
- # read it.
342
- dlog("read_data_mini - reading 0x%x bytes" % block, 'rex', LEV_3)
343
- buf = read_mini_sector(sect, block)
344
- ret << buf
345
- left -= buf.length
346
-
347
- # done?
348
- break if (left == 0)
349
-
350
- sect = next_mini_sector(sect)
351
- end
352
- ret
353
- end
354
-
355
-
356
- def read_sector(sect, len)
357
- off = ((sect + 1) * @header.sector_size)
358
- @fd.seek(off, ::IO::SEEK_SET)
359
- buf = @fd.read(len)
360
- if (not buf)
361
- if (@fd.eof?)
362
- raise RuntimeError, 'EOF while reading sector data (0x%08x)' % sect
363
- else
364
- raise RuntimeError, 'Unknown error while reading sector data (0x%08x)' % sect
365
- end
366
- end
367
- if (buf.length != len)
368
- raise RuntimeError, 'Insufficient data for sector (0x%08x): got %u of %u' % [sect, buf.length, len]
369
- end
370
- buf
371
- end
372
-
373
- def next_sector(sect)
374
- return SECT_END if (sect >= @fat.length)
375
- @fat[sect]
376
- end
377
-
378
-
379
- def read_mini_sector(sect, len)
380
- dlog("Reading mini sector 0x%x" % sect, 'rex', LEV_3)
381
- off = (@header.mini_sector_size * sect)
382
- dlog("Reading from offset 0x%x of ministream" % off, 'rex', LEV_3)
383
- @ministream.seek(off)
384
- data = @ministream.read(len)
385
- data
386
- end
387
-
388
- def next_mini_sector(sect)
389
- return SECT_END if (sect >= @minifat.length)
390
- @minifat[sect]
391
- end
126
+ stm = Stream.new self
127
+ stm.name = name
128
+ parent_stg ||= @directory
129
+ dlog("Adding stream #{name} to storage #{parent_stg.name}", 'rex', LEV_3)
130
+ @directory.link_item(parent_stg, stm)
131
+ @modified = true
132
+ stm
133
+ end
134
+
135
+ def open_stream(name, mode=STGM_READ, parent_stg=nil)
136
+ parent_stg ||= @directory
137
+ stm = parent_stg.find_stream_by_name_and_type(name, STGTY_STREAM)
138
+ if (stm)
139
+ # TODO: optimize out the need to read all of the data up-front
140
+ stm << read_stream_data(stm)
141
+ end
142
+ stm
143
+ end
144
+
145
+
146
+ #
147
+ # storage manipulation functions
148
+ #
149
+ def create_storage(name, mode=STGM_READ, parent_stg=nil)
150
+ stg = SubStorage.new self
151
+ stg.name = name
152
+ parent_stg ||= @directory
153
+ dlog("Adding storage #{name} to storage #{parent_stg.name}", 'rex', LEV_3)
154
+ @directory.link_item(parent_stg, stg)
155
+ stg
156
+ end
157
+
158
+ def open_storage(name, mode=STGM_READ, parent_stg=nil)
159
+ @directory.find_stream_by_name_and_type(name, STGTY_STORAGE)
160
+ end
161
+
162
+
163
+ #
164
+ # low-level functions
165
+ #
166
+ def write_to_disk
167
+ # reset FAT/DIFAT
168
+ @difat = DIFAT.new self
169
+ @fat = FAT.new self
170
+
171
+ @header.write @fd
172
+ write_user_data
173
+
174
+ # NOTE: we call write_stream here since we MUST write this to
175
+ # the regular stream (regardless of size)
176
+ ms_start = write_stream(@ministream)
177
+ @directory.set_ministream_params(ms_start, @ministream.length)
178
+
179
+ @minifat.write
180
+ @directory.write
181
+ @fat.write(@difat)
182
+ @difat.write
183
+
184
+ # write it again, now that its complete
185
+ @header.write @fd
186
+ @fd.flush
187
+ end
188
+
189
+ def write_sector(sbuf, type=nil, prev_sect=nil)
190
+ len = sbuf.length
191
+ if (len != @header.sector_size)
192
+ # pad it if less
193
+ if (len < @header.sector_size)
194
+ sbuf = sbuf.dup
195
+ sbuf << "\x00" * (@header.sector_size - len)
196
+ else
197
+ raise RuntimeError, 'not sector sized!'
198
+ end
199
+ end
200
+
201
+ # write the data
202
+ idx = @fat.allocate_sector(type)
203
+ # point previous sector to here
204
+ if (prev_sect)
205
+ @fat[prev_sect] = idx
206
+ end
207
+ write_sector_raw(idx, sbuf)
208
+ return idx
209
+ end
210
+
211
+ def write_sector_raw(sect, sbuf)
212
+ dlog("Writing sector 0x%02x" % sect, 'rex', LEV_3)
213
+ @fd.seek((sect + 1) * @header.sector_size, ::IO::SEEK_SET)
214
+ @fd.write(sbuf)
215
+ end
216
+
217
+
218
+ def write_mini_sector(sbuf, prev_sect=nil)
219
+ len = sbuf.length
220
+ if (len != @header.mini_sector_size)
221
+ if (len < @header.mini_sector_size)
222
+ sbuf = sbuf.dup
223
+ sbuf << "\x00" * (@header.mini_sector_size - len)
224
+ else
225
+ raise RuntimeError, 'not mini sector sized!'
226
+ end
227
+ end
228
+
229
+ idx = @minifat.allocate_sector
230
+ # point the previous mini sector to here
231
+ if (prev_sect)
232
+ @minifat[prev_sect] = idx
233
+ end
234
+ write_mini_sector_raw(idx, sbuf)
235
+ idx
236
+ end
237
+
238
+ def write_mini_sector_raw(sect, sbuf)
239
+ dlog("Writing mini sector 0x%02x" % sect, 'rex', LEV_3)
240
+ @ministream << sbuf
241
+ end
242
+
243
+
244
+
245
+ def write_user_data
246
+ @directory.each_entry { |stm|
247
+ # only regular streams this pass
248
+ next if (stm.type != STGTY_STREAM)
249
+
250
+ if (stm.length >= @header._ulMiniSectorCutoff)
251
+ stm.start_sector = write_stream(stm)
252
+ else
253
+ # NOTE: stm_start is a minifat value
254
+ stm.start_sector = write_mini_stream(stm)
255
+ end
256
+ }
257
+ end
258
+
259
+ def write_stream(stm)
260
+ dlog("Writing \"%s\" to regular stream" % stm.name, 'rex', LEV_3)
261
+ stm_start = nil
262
+ prev_sect = nil
263
+ stm.seek(0)
264
+ while (sbuf = stm.read(@header.sector_size))
265
+ sect = write_sector(sbuf, nil, prev_sect)
266
+ stm_start ||= sect
267
+ prev_sect = sect
268
+ end
269
+ stm_start
270
+ end
271
+
272
+ def write_mini_stream(stm)
273
+ dlog("Writing \"%s\" to mini stream" % stm.name, 'rex', LEV_3)
274
+ prev_sect = nil
275
+ stm.seek(0)
276
+ while (sbuf = stm.read(@header.mini_sector_size))
277
+ sect = write_mini_sector(sbuf, prev_sect)
278
+ stm_start ||= sect
279
+ prev_sect = sect
280
+ end
281
+ stm_start
282
+ end
283
+
284
+
285
+ def read_stream_data(direntry)
286
+ if (direntry.length < @header._ulMiniSectorCutoff)
287
+ return read_data_mini(direntry)
288
+ end
289
+
290
+ read_data(direntry)
291
+ end
292
+
293
+ def read_data(direntry)
294
+ ret = ""
295
+ visited = []
296
+ left = direntry.length
297
+ sect = direntry.start_sector
298
+ while (sect != SECT_END)
299
+ if (visited.include?(sect))
300
+ raise RuntimeError, 'Sector chain loop detected (0x%08x)' % sect
301
+ end
302
+ visited << sect
303
+
304
+ # how much to read?
305
+ block = @header.sector_size
306
+ block = left if (block > left)
307
+
308
+ # read it.
309
+ dlog("read_data - reading 0x%x bytes" % block, 'rex', LEV_3)
310
+ buf = read_sector(sect, block)
311
+ ret << buf
312
+ left -= buf.length
313
+
314
+ # done?
315
+ break if (left == 0)
316
+
317
+ sect = next_sector(sect)
318
+ end
319
+ ret
320
+ end
321
+
322
+ def read_data_mini(direntry)
323
+ ret = ""
324
+ visited = []
325
+ left = direntry.length
326
+ sect = direntry.start_sector
327
+ while (sect != SECT_END)
328
+ if (visited.include?(sect))
329
+ raise RuntimeError, 'Sector chain loop detected (0x%08x mini)' % sect
330
+ end
331
+ visited << sect
332
+
333
+ # how much to read?
334
+ block = @header.mini_sector_size
335
+ block = left if (block > left)
336
+
337
+ # read it.
338
+ dlog("read_data_mini - reading 0x%x bytes" % block, 'rex', LEV_3)
339
+ buf = read_mini_sector(sect, block)
340
+ ret << buf
341
+ left -= buf.length
342
+
343
+ # done?
344
+ break if (left == 0)
345
+
346
+ sect = next_mini_sector(sect)
347
+ end
348
+ ret
349
+ end
350
+
351
+
352
+ def read_sector(sect, len)
353
+ off = ((sect + 1) * @header.sector_size)
354
+ @fd.seek(off, ::IO::SEEK_SET)
355
+ buf = @fd.read(len)
356
+ if (not buf)
357
+ if (@fd.eof?)
358
+ raise RuntimeError, 'EOF while reading sector data (0x%08x)' % sect
359
+ else
360
+ raise RuntimeError, 'Unknown error while reading sector data (0x%08x)' % sect
361
+ end
362
+ end
363
+ if (buf.length != len)
364
+ raise RuntimeError, 'Insufficient data for sector (0x%08x): got %u of %u' % [sect, buf.length, len]
365
+ end
366
+ buf
367
+ end
368
+
369
+ def next_sector(sect)
370
+ return SECT_END if (sect >= @fat.length)
371
+ @fat[sect]
372
+ end
373
+
374
+
375
+ def read_mini_sector(sect, len)
376
+ dlog("Reading mini sector 0x%x" % sect, 'rex', LEV_3)
377
+ off = (@header.mini_sector_size * sect)
378
+ dlog("Reading from offset 0x%x of ministream" % off, 'rex', LEV_3)
379
+ @ministream.seek(off)
380
+ data = @ministream.read(len)
381
+ data
382
+ end
383
+
384
+ def next_mini_sector(sect)
385
+ return SECT_END if (sect >= @minifat.length)
386
+ @minifat[sect]
387
+ end
392
388
 
393
389
  end
394
390