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
@@ -8,45 +8,45 @@ module Windows
8
8
  #
9
9
  # Windows Registry Constants
10
10
  #
11
- REG_NONE = 1
12
- REG_SZ = 1
13
- REG_EXPAND_SZ = 2
14
- REG_BINARY = 3
15
- REG_DWORD = 4
16
- REG_LITTLE_ENDIAN = 4
17
- REG_BIG_ENDIAN = 5
18
- REG_LINK = 6
19
- REG_MULTI_SZ = 7
11
+ REG_NONE = 1
12
+ REG_SZ = 1
13
+ REG_EXPAND_SZ = 2
14
+ REG_BINARY = 3
15
+ REG_DWORD = 4
16
+ REG_LITTLE_ENDIAN = 4
17
+ REG_BIG_ENDIAN = 5
18
+ REG_LINK = 6
19
+ REG_MULTI_SZ = 7
20
20
 
21
- HKEY_CLASSES_ROOT = 0x80000000
22
- HKEY_CURRENT_USER = 0x80000001
23
- HKEY_LOCAL_MACHINE = 0x80000002
24
- HKEY_USERS = 0x80000003
25
- HKEY_PERFORMANCE_DATA = 0x80000004
26
- HKEY_CURRENT_CONFIG = 0x80000005
27
- HKEY_DYN_DATA = 0x80000006
21
+ HKEY_CLASSES_ROOT = 0x80000000
22
+ HKEY_CURRENT_USER = 0x80000001
23
+ HKEY_LOCAL_MACHINE = 0x80000002
24
+ HKEY_USERS = 0x80000003
25
+ HKEY_PERFORMANCE_DATA = 0x80000004
26
+ HKEY_CURRENT_CONFIG = 0x80000005
27
+ HKEY_DYN_DATA = 0x80000006
28
+
29
+ def registry_hive_lookup(hive)
30
+ case hive
31
+ when 'HKCR'
32
+ HKEY_LOCAL_MACHINE
33
+ when 'HKCU'
34
+ HKEY_CURRENT_USER
35
+ when 'HKLM'
36
+ HKEY_LOCAL_MACHINE
37
+ when 'HKU'
38
+ HKEY_USERS
39
+ when 'HKPD'
40
+ HKEY_PERFORMANCE_DATA
41
+ when 'HKCC'
42
+ HKEY_CURRENT_CONFIG
43
+ when 'HKDD'
44
+ HKEY_DYN_DATA
45
+ else
46
+ HKEY_LOCAL_MACHINE
47
+ end
48
+ end
28
49
 
29
- def registry_hive_lookup(hive)
30
- case hive
31
- when 'HKCR'
32
- HKEY_LOCAL_MACHINE
33
- when 'HKCU'
34
- HKEY_CURRENT_USER
35
- when 'HKLM'
36
- HKEY_LOCAL_MACHINE
37
- when 'HKU'
38
- HKEY_USERS
39
- when 'HKPD'
40
- HKEY_PERFORMANCE_DATA
41
- when 'HKCC'
42
- HKEY_CURRENT_CONFIG
43
- when 'HKDD'
44
- HKEY_DYN_DATA
45
- else
46
- HKEY_LOCAL_MACHINE
47
- end
48
- end
49
-
50
50
  end
51
51
  end
52
52
  end
@@ -4,6 +4,7 @@ module Poly
4
4
 
5
5
  require 'rex/poly/register'
6
6
  require 'rex/poly/block'
7
+ require 'rex/poly/machine'
7
8
 
8
9
  ###
9
10
  #
@@ -16,116 +17,116 @@ require 'rex/poly/block'
16
17
  ###
17
18
  class State
18
19
 
19
- #
20
- # Initializes the polymorphic generation state.
21
- #
22
- def initialize
23
- @block_list = nil
24
- reset
25
- end
26
-
27
- #
28
- # Resets the generation state to have a plain start by clearing all
29
- # consumed registers, resetting the polymorphic buffer back to its
30
- # beginning and destroying any block generation state.
31
- #
32
- def reset
33
- # Reset the generation flag on any blocks in the block list
34
- @block_list.each { |block|
35
- block[0].generated = false
36
- } if (@block_list)
37
-
38
- @regnums = Hash.new
39
- @buffer = ''
40
- @block_list = []
41
- @curr_offset = 0
42
- @first_phase = true
43
- @badchars = nil
44
- end
45
-
46
- #
47
- # Returns true if the supplied register number is already consumed.
48
- #
49
- def consumed_regnum?(regnum)
50
- @regnums[regnum]
51
- end
52
-
53
- #
54
- # Consumes a register number, thus removing it from the pool that can be
55
- # assigned. The consumed register number is returned to the caller.
56
- #
57
- def consume_regnum(regnum)
58
- raise RuntimeError, "Register #{regnum} is already consumed." if (consumed_regnum?(regnum))
59
-
60
- @regnums[regnum] = true
61
-
62
- regnum
63
- end
64
-
65
- #
66
- # Acquires a register number that has not already been consumed from the
67
- # supplied register number set and consumes it, returning the selected
68
- # register number to the caller. The register number is selected from the
69
- # set at random.
70
- #
71
- def consume_regnum_from_set(regnum_set)
72
- # Pick a random starting point within the supplied set.
73
- idx = rand(regnum_set.length)
74
-
75
- # Try each index in the set.
76
- regnum_set.length.times { |x|
77
- regnum = regnum_set[(idx + x) % regnum_set.length]
78
-
79
- next if (consumed_regnum?(regnum))
80
-
81
- return consume_regnum(regnum)
82
- }
83
-
84
- # If we get through the entire iteration without finding a register,
85
- # then we are out of registers to assign.
86
- raise RuntimeError, "No registers are available to consume from the set"
87
- end
88
-
89
- #
90
- # Eliminates a register number from the consumed pool so that it can be
91
- # used in the future. This happens after a block indicates that a register
92
- # has been clobbered.
93
- #
94
- def defecate_regnum(regnum)
95
- @regnums.delete(regnum)
96
- end
97
-
98
- #
99
- # The buffer state for the current polymorphic generation. This stores the
100
- # end-result of a call to generate on a LogicalBlock.
101
- #
102
- attr_accessor :buffer
103
-
104
- #
105
- # The linear list of blocks that is generated by calling the generate
106
- # method on a LogicalBlock.
107
- #
108
- attr_accessor :block_list
109
-
110
- #
111
- # The current offset into the polymorphic buffer that is being generated.
112
- # This is updated as blocks are appended to the block_list.
113
- #
114
- attr_accessor :curr_offset
115
-
116
- #
117
- # A boolean field that is used by the LogicalBlock class to track whether
118
- # or not it is in the first phase (generating the block list), or in the
119
- # second phase (generating the polymorphic buffer). This phases are used
120
- # to indicate whether or not the offset_of and regnum_of methods will
121
- # return actual results.
122
- #
123
- attr_accessor :first_phase
124
-
125
- #
126
- # Characters to avoid when selecting permutations, if any.
127
- #
128
- attr_accessor :badchars
20
+ #
21
+ # Initializes the polymorphic generation state.
22
+ #
23
+ def initialize
24
+ @block_list = nil
25
+ reset
26
+ end
27
+
28
+ #
29
+ # Resets the generation state to have a plain start by clearing all
30
+ # consumed registers, resetting the polymorphic buffer back to its
31
+ # beginning and destroying any block generation state.
32
+ #
33
+ def reset
34
+ # Reset the generation flag on any blocks in the block list
35
+ @block_list.each { |block|
36
+ block[0].generated = false
37
+ } if (@block_list)
38
+
39
+ @regnums = Hash.new
40
+ @buffer = ''
41
+ @block_list = []
42
+ @curr_offset = 0
43
+ @first_phase = true
44
+ @badchars = nil
45
+ end
46
+
47
+ #
48
+ # Returns true if the supplied register number is already consumed.
49
+ #
50
+ def consumed_regnum?(regnum)
51
+ @regnums[regnum]
52
+ end
53
+
54
+ #
55
+ # Consumes a register number, thus removing it from the pool that can be
56
+ # assigned. The consumed register number is returned to the caller.
57
+ #
58
+ def consume_regnum(regnum)
59
+ raise RuntimeError, "Register #{regnum} is already consumed." if (consumed_regnum?(regnum))
60
+
61
+ @regnums[regnum] = true
62
+
63
+ regnum
64
+ end
65
+
66
+ #
67
+ # Acquires a register number that has not already been consumed from the
68
+ # supplied register number set and consumes it, returning the selected
69
+ # register number to the caller. The register number is selected from the
70
+ # set at random.
71
+ #
72
+ def consume_regnum_from_set(regnum_set)
73
+ # Pick a random starting point within the supplied set.
74
+ idx = rand(regnum_set.length)
75
+
76
+ # Try each index in the set.
77
+ regnum_set.length.times { |x|
78
+ regnum = regnum_set[(idx + x) % regnum_set.length]
79
+
80
+ next if (consumed_regnum?(regnum))
81
+
82
+ return consume_regnum(regnum)
83
+ }
84
+
85
+ # If we get through the entire iteration without finding a register,
86
+ # then we are out of registers to assign.
87
+ raise RuntimeError, "No registers are available to consume from the set"
88
+ end
89
+
90
+ #
91
+ # Eliminates a register number from the consumed pool so that it can be
92
+ # used in the future. This happens after a block indicates that a register
93
+ # has been clobbered.
94
+ #
95
+ def defecate_regnum(regnum)
96
+ @regnums.delete(regnum)
97
+ end
98
+
99
+ #
100
+ # The buffer state for the current polymorphic generation. This stores the
101
+ # end-result of a call to generate on a LogicalBlock.
102
+ #
103
+ attr_accessor :buffer
104
+
105
+ #
106
+ # The linear list of blocks that is generated by calling the generate
107
+ # method on a LogicalBlock.
108
+ #
109
+ attr_accessor :block_list
110
+
111
+ #
112
+ # The current offset into the polymorphic buffer that is being generated.
113
+ # This is updated as blocks are appended to the block_list.
114
+ #
115
+ attr_accessor :curr_offset
116
+
117
+ #
118
+ # A boolean field that is used by the LogicalBlock class to track whether
119
+ # or not it is in the first phase (generating the block list), or in the
120
+ # second phase (generating the polymorphic buffer). This phases are used
121
+ # to indicate whether or not the offset_of and regnum_of methods will
122
+ # return actual results.
123
+ #
124
+ attr_accessor :first_phase
125
+
126
+ #
127
+ # Characters to avoid when selecting permutations, if any.
128
+ #
129
+ attr_accessor :badchars
129
130
 
130
131
  end
131
132
 
@@ -14,35 +14,35 @@ module Poly
14
14
  ###
15
15
  class Permutation
16
16
 
17
- #
18
- # Initializes the permutation and its associated block.
19
- #
20
- def initialize(perm, block)
21
- @perm = perm
22
- @block = block
23
- end
24
-
25
- #
26
- # Returns the length of the string returned by to_s.
27
- #
28
- def length
29
- to_s.length
30
- end
31
-
32
- #
33
- # Returns the string representation of the permutation. If the underlying
34
- # permutation is a procedure, the procedure is called. Otherwise, the
35
- # string representation of the permutation is returned.
36
- #
37
- def to_s
38
- if (@perm.kind_of?(Proc))
39
- @perm.call(@block).to_s
40
- else
41
- @perm.to_s
42
- end
43
- end
44
-
45
- attr_reader :perm
17
+ #
18
+ # Initializes the permutation and its associated block.
19
+ #
20
+ def initialize(perm, block)
21
+ @perm = perm
22
+ @block = block
23
+ end
24
+
25
+ #
26
+ # Returns the length of the string returned by to_s.
27
+ #
28
+ def length
29
+ to_s.length
30
+ end
31
+
32
+ #
33
+ # Returns the string representation of the permutation. If the underlying
34
+ # permutation is a procedure, the procedure is called. Otherwise, the
35
+ # string representation of the permutation is returned.
36
+ #
37
+ def to_s
38
+ if (@perm.kind_of?(Proc))
39
+ @perm.call(@block).to_s
40
+ else
41
+ @perm.to_s
42
+ end
43
+ end
44
+
45
+ attr_reader :perm
46
46
 
47
47
  end
48
48
 
@@ -69,387 +69,389 @@ end
69
69
  ###
70
70
  class LogicalBlock
71
71
 
72
- #
73
- # Initializes the logical block's name along with zero or more specific
74
- # blocks.
75
- #
76
- def initialize(name, *perms)
77
- @name = name
78
-
79
- reset
80
-
81
- add_perm(*perms)
82
- end
83
-
84
- #
85
- # Resets the block back to its starting point.
86
- #
87
- def reset
88
- @perms = []
89
- @depends = []
90
- @next_blocks = []
91
- @clobbers = []
92
- @offset = nil
93
- @state = nil
94
- @once = false
95
- @references = 0
96
- @used_references = 0
97
- @generated = false
98
- end
99
-
100
- #
101
- # Returns the block's name.
102
- #
103
- def name
104
- @name
105
- end
106
-
107
- #
108
- # Flags whether or not the block should only be generated once. This can
109
- # be used to mark a blog as being depended upon by multiple blocks, but
110
- # making it such that it is only generated once.
111
- #
112
- def once=(tf)
113
- @once = tf
114
- end
115
-
116
- #
117
- # Returns true if this block is a 'once' block. That is, this block is
118
- # dependend upon by multiple blocks but should only be generated once.
119
- #
120
- def once
121
- @once
122
- end
123
-
124
- #
125
- # Increments the number of blocks that depend on this block.
126
- #
127
- def ref
128
- @references += 1
129
- end
130
-
131
- #
132
- # Increments the number of blocks that have completed their dependency
133
- # pass on this block. This number should never become higher than the
134
- # @references attribute.
135
- #
136
- def deref
137
- @used_references += 1
138
- end
139
-
140
- #
141
- # Returns true if there is only one block reference remaining.
142
- #
143
- def last_reference?
144
- (@references - @used_references <= 0)
145
- end
146
-
147
- #
148
- # Adds zero or more specific permutations that may be represented either as
149
- # strings or as Proc's to be called at evaluation time.
150
- #
151
- def add_perm(*perms)
152
- @perms.concat(perms)
153
- end
154
-
155
- #
156
- # Returns a random permutation that is encapsulated in a Permutation class
157
- # instance.
158
- #
159
- def rand_perm
160
- perm = nil
161
-
162
- if (@state.badchars)
163
- perm = rand_perm_badchars
164
- else
165
- perm = Permutation.new(@perms[rand(@perms.length)], self)
166
- end
167
-
168
- if (perm.nil?)
169
- raise RuntimeError, "Failed to locate a valid permutation."
170
- end
171
-
172
- perm
173
- end
174
-
175
- #
176
- # Returns a random permutation that passes any necessary bad character
177
- # checks.
178
- #
179
- def rand_perm_badchars
180
- idx = rand(@perms.length)
181
- off = 0
182
-
183
- while (off < @perms.length)
184
- p = @perms[(idx + off) % @perms.length]
185
-
186
- if (p.kind_of?(Proc) or
187
- @state.badchars.nil? or
188
- Rex::Text.badchar_index(p, @state.badchars).nil?)
189
- return Permutation.new(p, self)
190
- end
191
-
192
- off += 1
193
- end
194
- end
195
-
196
- #
197
- # Sets the blocks that this block instance depends on.
198
- #
199
- def depends_on(*depends)
200
- @depends = depends.dup
201
-
202
- # Increment dependent references
203
- @depends.each { |b| b.ref }
204
- end
205
-
206
- #
207
- # Defines the next blocks, but not in a dependency fashion but rather in a
208
- # linking of separate block contexts.
209
- #
210
- def next_blocks(*blocks)
211
- @next_blocks = blocks.dup
212
- end
213
-
214
- #
215
- # Defines the list of zero or more LogicalRegister's that this block
216
- # clobbers.
217
- #
218
- def clobbers(*registers)
219
- @clobbers = registers
220
- end
221
-
222
- #
223
- # Enumerates each register instance that is clobbered by this block.
224
- #
225
- def each_clobbers(&block)
226
- @clobbers.each(&block)
227
- end
228
-
229
- #
230
- # Generates the polymorphic buffer that results from this block and any of
231
- # the blocks that it either directly or indirectly depends on. A list of
232
- # register numbers to be saved can be passed in as an argument.
233
- #
234
- # This method is not thread safe. To call this method on a single block
235
- # instance from within multiple threads, be sure to encapsulate the calls
236
- # inside a locked context.
237
- #
238
- def generate(save_registers = nil, state = nil, badchars = nil)
239
- # Create a localized state instance if one was not supplied.
240
- state = Rex::Poly::State.new if (state == nil)
241
- buf = nil
242
- cnt = 0
243
-
244
- # This is a lame way of doing this. We just try to generate at most 128
245
- # times until we don't have badchars. The reason we have to do it this
246
- # way is because of the fact that badchars can be introduced through
247
- # block offsetting and register number selection which can't be readily
248
- # predicted or detected during the generation phase. In the future we
249
- # can make this better, but for now this will have to do.
250
- begin
251
- buf = do_generate(save_registers, state, badchars)
252
-
253
- if (buf and
254
- (badchars.nil? or Rex::Text.badchar_index(buf, badchars).nil?))
255
- break
256
- end
257
- end while ((cnt += 1) < 128)
258
-
259
- # If we passed 128 tries, then we can't succeed.
260
- buf = nil if (cnt >= 128)
261
-
262
- buf
263
- end
264
-
265
- #
266
- # Returns the offset of a block. If the active state for this instance is
267
- # operating in the first phase, then zero is always returned. Otherwise,
268
- # the correct offset for the supplied block is returned.
269
- #
270
- def offset_of(lblock)
271
- if (@state.first_phase)
272
- 0
273
- else
274
- if (lblock.kind_of?(SymbolicBlock::End))
275
- @state.curr_offset
276
- else
277
- lblock.offset
278
- end
279
- end
280
- end
281
-
282
- #
283
- # Returns the register number associated with the supplied LogicalRegister
284
- # instance. If the active state for this instance is operating in the
285
- # first phase, then zero is always returned. Otherwise, the correct
286
- # register number is returned based on what is currently assigned to the
287
- # supplied LogicalRegister instance, if anything.
288
- #
289
- def regnum_of(reg)
290
- (@state.first_phase) ? 0 : reg.regnum
291
- end
292
-
293
- def size_of(lblock)
294
- @state.block_list.map { |b, p|
295
- if b == lblock
296
- return p.length
297
- end
298
- }
299
- 0
300
- end
301
-
302
- #
303
- # This attributes contains the currently assigned offset of the permutation
304
- # associated with this block into the polymorphic buffer that is being
305
- # generated.
306
- #
307
- attr_accessor :offset
308
-
309
- #
310
- # Whether or not this block has currently been generated for a given
311
- # iteration.
312
- #
313
- attr_accessor :generated
72
+ #
73
+ # Initializes the logical block's name along with zero or more specific
74
+ # blocks.
75
+ #
76
+ def initialize(name, *perms)
77
+ @name = name
78
+
79
+ reset
80
+
81
+ add_perm(*perms)
82
+ end
83
+
84
+ #
85
+ # Resets the block back to its starting point.
86
+ #
87
+ def reset
88
+ @perms = []
89
+ @depends = []
90
+ @next_blocks = []
91
+ @clobbers = []
92
+ @offset = nil
93
+ @state = nil
94
+ @once = false
95
+ @references = 0
96
+ @used_references = 0
97
+ @generated = false
98
+ end
99
+
100
+ #
101
+ # Returns the block's name.
102
+ #
103
+ def name
104
+ @name
105
+ end
106
+
107
+ #
108
+ # Flags whether or not the block should only be generated once. This can
109
+ # be used to mark a blog as being depended upon by multiple blocks, but
110
+ # making it such that it is only generated once.
111
+ #
112
+ def once=(tf)
113
+ @once = tf
114
+ end
115
+
116
+ #
117
+ # Returns true if this block is a 'once' block. That is, this block is
118
+ # dependend upon by multiple blocks but should only be generated once.
119
+ #
120
+ def once
121
+ @once
122
+ end
123
+
124
+ #
125
+ # Increments the number of blocks that depend on this block.
126
+ #
127
+ # @see #deref
128
+ def ref
129
+ @references += 1
130
+ end
131
+
132
+ #
133
+ # Increments the number of blocks that have completed their dependency
134
+ # pass on this block. This number should never become higher than the
135
+ # `@references` attribute.
136
+ #
137
+ # @see #ref
138
+ def deref
139
+ @used_references += 1
140
+ end
141
+
142
+ #
143
+ # Returns true if there is only one block reference remaining.
144
+ #
145
+ def last_reference?
146
+ (@references - @used_references <= 0)
147
+ end
148
+
149
+ #
150
+ # Adds zero or more specific permutations that may be represented either as
151
+ # strings or as Proc's to be called at evaluation time.
152
+ #
153
+ def add_perm(*perms)
154
+ @perms.concat(perms)
155
+ end
156
+
157
+ #
158
+ # Returns a random permutation that is encapsulated in a Permutation class
159
+ # instance.
160
+ #
161
+ def rand_perm
162
+ perm = nil
163
+
164
+ if (@state.badchars)
165
+ perm = rand_perm_badchars
166
+ else
167
+ perm = Permutation.new(@perms[rand(@perms.length)], self)
168
+ end
169
+
170
+ if (perm.nil?)
171
+ raise RuntimeError, "Failed to locate a valid permutation."
172
+ end
173
+
174
+ perm
175
+ end
176
+
177
+ #
178
+ # Returns a random permutation that passes any necessary bad character
179
+ # checks.
180
+ #
181
+ def rand_perm_badchars
182
+ idx = rand(@perms.length)
183
+ off = 0
184
+
185
+ while (off < @perms.length)
186
+ p = @perms[(idx + off) % @perms.length]
187
+
188
+ if (p.kind_of?(Proc) or
189
+ @state.badchars.nil? or
190
+ Rex::Text.badchar_index(p, @state.badchars).nil?)
191
+ return Permutation.new(p, self)
192
+ end
193
+
194
+ off += 1
195
+ end
196
+ end
197
+
198
+ #
199
+ # Sets the blocks that this block instance depends on.
200
+ #
201
+ def depends_on(*depends)
202
+ @depends = depends.dup
203
+
204
+ # Increment dependent references
205
+ @depends.each { |b| b.ref }
206
+ end
207
+
208
+ #
209
+ # Defines the next blocks, but not in a dependency fashion but rather in a
210
+ # linking of separate block contexts.
211
+ #
212
+ def next_blocks(*blocks)
213
+ @next_blocks = blocks.dup
214
+ end
215
+
216
+ #
217
+ # Defines the list of zero or more LogicalRegister's that this block
218
+ # clobbers.
219
+ #
220
+ def clobbers(*registers)
221
+ @clobbers = registers
222
+ end
223
+
224
+ #
225
+ # Enumerates each register instance that is clobbered by this block.
226
+ #
227
+ def each_clobbers(&block)
228
+ @clobbers.each(&block)
229
+ end
230
+
231
+ #
232
+ # Generates the polymorphic buffer that results from this block and any of
233
+ # the blocks that it either directly or indirectly depends on. A list of
234
+ # register numbers to be saved can be passed in as an argument.
235
+ #
236
+ # This method is not thread safe. To call this method on a single block
237
+ # instance from within multiple threads, be sure to encapsulate the calls
238
+ # inside a locked context.
239
+ #
240
+ def generate(save_registers = nil, state = nil, badchars = nil)
241
+ # Create a localized state instance if one was not supplied.
242
+ state = Rex::Poly::State.new if (state == nil)
243
+ buf = nil
244
+ cnt = 0
245
+
246
+ # This is a lame way of doing this. We just try to generate at most 128
247
+ # times until we don't have badchars. The reason we have to do it this
248
+ # way is because of the fact that badchars can be introduced through
249
+ # block offsetting and register number selection which can't be readily
250
+ # predicted or detected during the generation phase. In the future we
251
+ # can make this better, but for now this will have to do.
252
+ begin
253
+ buf = do_generate(save_registers, state, badchars)
254
+
255
+ if (buf and
256
+ (badchars.nil? or Rex::Text.badchar_index(buf, badchars).nil?))
257
+ break
258
+ end
259
+ end while ((cnt += 1) < 128)
260
+
261
+ # If we passed 128 tries, then we can't succeed.
262
+ buf = nil if (cnt >= 128)
263
+
264
+ buf
265
+ end
266
+
267
+ #
268
+ # Returns the offset of a block. If the active state for this instance is
269
+ # operating in the first phase, then zero is always returned. Otherwise,
270
+ # the correct offset for the supplied block is returned.
271
+ #
272
+ def offset_of(lblock)
273
+ if (@state.first_phase)
274
+ 0
275
+ else
276
+ if (lblock.kind_of?(SymbolicBlock::End))
277
+ @state.curr_offset
278
+ else
279
+ lblock.offset
280
+ end
281
+ end
282
+ end
283
+
284
+ #
285
+ # Returns the register number associated with the supplied LogicalRegister
286
+ # instance. If the active state for this instance is operating in the
287
+ # first phase, then zero is always returned. Otherwise, the correct
288
+ # register number is returned based on what is currently assigned to the
289
+ # supplied LogicalRegister instance, if anything.
290
+ #
291
+ def regnum_of(reg)
292
+ (@state.first_phase) ? 0 : reg.regnum
293
+ end
294
+
295
+ def size_of(lblock)
296
+ @state.block_list.map { |b, p|
297
+ if b == lblock
298
+ return p.length
299
+ end
300
+ }
301
+ 0
302
+ end
303
+
304
+ #
305
+ # This attributes contains the currently assigned offset of the permutation
306
+ # associated with this block into the polymorphic buffer that is being
307
+ # generated.
308
+ #
309
+ attr_accessor :offset
310
+
311
+ #
312
+ # Whether or not this block has currently been generated for a given
313
+ # iteration.
314
+ #
315
+ attr_accessor :generated
314
316
 
315
317
  protected
316
318
 
317
- #
318
- # Performs the actual polymorphic buffer generation. Called from generate
319
- #
320
- def do_generate(save_registers, state, badchars)
321
- # Reset the state in case it was passed in.
322
- state.reset
323
-
324
- # Set the bad character list
325
- state.badchars = badchars if (badchars)
326
-
327
- # Consume any registers that should be saved.
328
- save_registers.each { |reg|
329
- state.consume_regnum(reg)
330
- } if (save_registers)
331
-
332
- # Build the linear list of blocks that will be processed. This
333
- # list is built in a dynamic fashion based on block dependencies.
334
- # The list that is returned is an Array of which each element is a two
335
- # member array, the first element being the LogicalBlock instance that
336
- # the permutation came from and the second being an instance of the
337
- # Permutation class associated with the selected permutation.
338
- block_list = generate_block_list(state)
339
-
340
- # Transition into the second phase which enables offset_of and regnum_of
341
- # calls to return real values.
342
- state.first_phase = false
343
-
344
- # Now that every block has been assigned an offset, generate the
345
- # buffer block by block, assigning registers as necessary.
346
- block_list.each { |b|
347
-
348
- # Generate the next permutation and append it to the buffer.
349
- begin
350
- state.buffer += b[1].to_s
351
- # If an invalid register exception is raised, try to consume a random
352
- # register from the register's associated architecture register
353
- # number set.
354
- rescue InvalidRegisterError => e
355
- e.reg.regnum = state.consume_regnum_from_set(e.reg.class.regnum_set)
356
- retry
357
- end
358
-
359
- # Remove any of the registers that have been clobbered by this block
360
- # from the list of consumed register numbers so that they can be used
361
- # in the future.
362
- b[0].each_clobbers { |reg|
363
- begin
364
- state.defecate_regnum(reg.regnum)
365
-
366
- reg.regnum = nil
367
- rescue InvalidRegisterError
368
- end
369
- }
370
-
371
- }
372
-
373
- # Finally, return the buffer that has been created.
374
- state.buffer
375
- end
376
-
377
- #
378
- # Generates the linear list of block permutations which is stored in the
379
- # supplied state instance. This is done prior to assigning blocks offsets
380
- #
381
- def generate_block_list(state, level=0)
382
- if @depends.length > 1
383
- @depends.length.times {
384
- f = rand(@depends.length)
385
- @depends.push(@depends.delete_at(f))
386
- }
387
- end
388
-
389
- @depends.length.times { |cidx|
390
-
391
- pass = false
392
-
393
- while (not pass)
394
-
395
- if (@depends[cidx].generated)
396
- break
397
-
398
- # If this dependent block is a once block and the magic 8 ball turns
399
- # up zero, skip it and let a later block pick it up. We only do this
400
- # if we are not the last block to have a dependency on this block.
401
- elsif ((@depends[cidx].once) and
402
- (rand(2).to_i == 0) and
403
- (@depends[cidx].last_reference? == false))
404
- break
405
- end
406
-
407
- # Generate this block
408
- @depends[cidx].generate_block_list(state, level+1)
409
-
410
- if level != 0
411
- return
412
- else
413
- @depends.length.times {
414
- f = rand(@depends.length)
415
- @depends.push(@depends.delete_at(f))
416
- }
417
-
418
- next
419
- end
420
- end
421
-
422
- next
423
- }
424
-
425
- self.deref
426
-
427
- # Assign the instance local state for the duration of this generation
428
- @state = state
429
-
430
- # Select a random permutation
431
- perm = rand_perm
432
-
433
- # Set our block offset to the current state offset
434
- self.offset = state.curr_offset
435
-
436
- # Flag ourselves as having been generated for this iteration.
437
- self.generated = true
438
-
439
- # Adjust the current offset based on the permutations length
440
- state.curr_offset += perm.length
441
-
442
- # Add it to the linear list of blocks
443
- state.block_list << [ self, perm ]
444
-
445
- # Generate all the blocks that follow this one.
446
- @next_blocks.each { |b|
447
- b.generate_block_list(state)
448
- }
449
-
450
- # Return the state's block list
451
- state.block_list
452
- end
319
+ #
320
+ # Performs the actual polymorphic buffer generation. Called from generate
321
+ #
322
+ def do_generate(save_registers, state, badchars)
323
+ # Reset the state in case it was passed in.
324
+ state.reset
325
+
326
+ # Set the bad character list
327
+ state.badchars = badchars if (badchars)
328
+
329
+ # Consume any registers that should be saved.
330
+ save_registers.each { |reg|
331
+ state.consume_regnum(reg)
332
+ } if (save_registers)
333
+
334
+ # Build the linear list of blocks that will be processed. This
335
+ # list is built in a dynamic fashion based on block dependencies.
336
+ # The list that is returned is an Array of which each element is a two
337
+ # member array, the first element being the LogicalBlock instance that
338
+ # the permutation came from and the second being an instance of the
339
+ # Permutation class associated with the selected permutation.
340
+ block_list = generate_block_list(state)
341
+
342
+ # Transition into the second phase which enables offset_of and regnum_of
343
+ # calls to return real values.
344
+ state.first_phase = false
345
+
346
+ # Now that every block has been assigned an offset, generate the
347
+ # buffer block by block, assigning registers as necessary.
348
+ block_list.each { |b|
349
+
350
+ # Generate the next permutation and append it to the buffer.
351
+ begin
352
+ state.buffer += b[1].to_s
353
+ # If an invalid register exception is raised, try to consume a random
354
+ # register from the register's associated architecture register
355
+ # number set.
356
+ rescue InvalidRegisterError => e
357
+ e.reg.regnum = state.consume_regnum_from_set(e.reg.class.regnum_set)
358
+ retry
359
+ end
360
+
361
+ # Remove any of the registers that have been clobbered by this block
362
+ # from the list of consumed register numbers so that they can be used
363
+ # in the future.
364
+ b[0].each_clobbers { |reg|
365
+ begin
366
+ state.defecate_regnum(reg.regnum)
367
+
368
+ reg.regnum = nil
369
+ rescue InvalidRegisterError
370
+ end
371
+ }
372
+
373
+ }
374
+
375
+ # Finally, return the buffer that has been created.
376
+ state.buffer
377
+ end
378
+
379
+ #
380
+ # Generates the linear list of block permutations which is stored in the
381
+ # supplied state instance. This is done prior to assigning blocks offsets
382
+ #
383
+ def generate_block_list(state, level=0)
384
+ if @depends.length > 1
385
+ @depends.length.times {
386
+ f = rand(@depends.length)
387
+ @depends.push(@depends.delete_at(f))
388
+ }
389
+ end
390
+
391
+ @depends.length.times { |cidx|
392
+
393
+ pass = false
394
+
395
+ while (not pass)
396
+
397
+ if (@depends[cidx].generated)
398
+ break
399
+
400
+ # If this dependent block is a once block and the magic 8 ball turns
401
+ # up zero, skip it and let a later block pick it up. We only do this
402
+ # if we are not the last block to have a dependency on this block.
403
+ elsif ((@depends[cidx].once) and
404
+ (rand(2).to_i == 0) and
405
+ (@depends[cidx].last_reference? == false))
406
+ break
407
+ end
408
+
409
+ # Generate this block
410
+ @depends[cidx].generate_block_list(state, level+1)
411
+
412
+ if level != 0
413
+ return
414
+ else
415
+ @depends.length.times {
416
+ f = rand(@depends.length)
417
+ @depends.push(@depends.delete_at(f))
418
+ }
419
+
420
+ next
421
+ end
422
+ end
423
+
424
+ next
425
+ }
426
+
427
+ self.deref
428
+
429
+ # Assign the instance local state for the duration of this generation
430
+ @state = state
431
+
432
+ # Select a random permutation
433
+ perm = rand_perm
434
+
435
+ # Set our block offset to the current state offset
436
+ self.offset = state.curr_offset
437
+
438
+ # Flag ourselves as having been generated for this iteration.
439
+ self.generated = true
440
+
441
+ # Adjust the current offset based on the permutations length
442
+ state.curr_offset += perm.length
443
+
444
+ # Add it to the linear list of blocks
445
+ state.block_list << [ self, perm ]
446
+
447
+ # Generate all the blocks that follow this one.
448
+ @next_blocks.each { |b|
449
+ b.generate_block_list(state)
450
+ }
451
+
452
+ # Return the state's block list
453
+ state.block_list
454
+ end
453
455
 
454
456
  end
455
457
 
@@ -462,16 +464,16 @@ end
462
464
  ###
463
465
  module SymbolicBlock
464
466
 
465
- ###
466
- #
467
- # The symbolic end of a polymorphic buffer.
468
- #
469
- ###
470
- class End < LogicalBlock
471
- def initialize
472
- super('__SYMBLK_END__')
473
- end
474
- end
467
+ ###
468
+ #
469
+ # The symbolic end of a polymorphic buffer.
470
+ #
471
+ ###
472
+ class End < LogicalBlock
473
+ def initialize
474
+ super('__SYMBLK_END__')
475
+ end
476
+ end
475
477
  end
476
478
 
477
479
  end