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
@@ -32,23 +32,25 @@ module Extensions
32
32
  module Stdapi
33
33
  module Railgun
34
34
 
35
- TLV_TYPE_EXTENSION_RAILGUN = 0
36
- TLV_TYPE_RAILGUN_SIZE_OUT = TLV_META_TYPE_UINT | (TLV_TYPE_EXTENSION_RAILGUN + TLV_EXTENSIONS + 1)
37
- TLV_TYPE_RAILGUN_STACKBLOB = TLV_META_TYPE_RAW | (TLV_TYPE_EXTENSION_RAILGUN + TLV_EXTENSIONS + 2)
38
- TLV_TYPE_RAILGUN_BUFFERBLOB_IN = TLV_META_TYPE_RAW | (TLV_TYPE_EXTENSION_RAILGUN + TLV_EXTENSIONS + 3)
39
- TLV_TYPE_RAILGUN_BUFFERBLOB_INOUT = TLV_META_TYPE_RAW | (TLV_TYPE_EXTENSION_RAILGUN + TLV_EXTENSIONS + 4)
35
+ TLV_TYPE_EXTENSION_RAILGUN = 0
36
+ TLV_TYPE_RAILGUN_SIZE_OUT = TLV_META_TYPE_UINT | (TLV_TYPE_EXTENSION_RAILGUN + TLV_EXTENSIONS + 1)
37
+ TLV_TYPE_RAILGUN_STACKBLOB = TLV_META_TYPE_RAW | (TLV_TYPE_EXTENSION_RAILGUN + TLV_EXTENSIONS + 2)
38
+ TLV_TYPE_RAILGUN_BUFFERBLOB_IN = TLV_META_TYPE_RAW | (TLV_TYPE_EXTENSION_RAILGUN + TLV_EXTENSIONS + 3)
39
+ TLV_TYPE_RAILGUN_BUFFERBLOB_INOUT = TLV_META_TYPE_RAW | (TLV_TYPE_EXTENSION_RAILGUN + TLV_EXTENSIONS + 4)
40
40
 
41
- TLV_TYPE_RAILGUN_BACK_BUFFERBLOB_OUT = TLV_META_TYPE_RAW | (TLV_TYPE_EXTENSION_RAILGUN + TLV_EXTENSIONS + 5)
42
- TLV_TYPE_RAILGUN_BACK_BUFFERBLOB_INOUT = TLV_META_TYPE_RAW | (TLV_TYPE_EXTENSION_RAILGUN + TLV_EXTENSIONS + 6)
43
- TLV_TYPE_RAILGUN_BACK_RET = TLV_META_TYPE_QWORD | (TLV_TYPE_EXTENSION_RAILGUN + TLV_EXTENSIONS + 7)
44
- TLV_TYPE_RAILGUN_BACK_ERR = TLV_META_TYPE_UINT | (TLV_TYPE_EXTENSION_RAILGUN + TLV_EXTENSIONS + 8)
41
+ TLV_TYPE_RAILGUN_BACK_BUFFERBLOB_OUT = TLV_META_TYPE_RAW | (TLV_TYPE_EXTENSION_RAILGUN + TLV_EXTENSIONS + 5)
42
+ TLV_TYPE_RAILGUN_BACK_BUFFERBLOB_INOUT = TLV_META_TYPE_RAW | (TLV_TYPE_EXTENSION_RAILGUN + TLV_EXTENSIONS + 6)
43
+ TLV_TYPE_RAILGUN_BACK_RET = TLV_META_TYPE_QWORD | (TLV_TYPE_EXTENSION_RAILGUN + TLV_EXTENSIONS + 7)
44
+ TLV_TYPE_RAILGUN_BACK_ERR = TLV_META_TYPE_UINT | (TLV_TYPE_EXTENSION_RAILGUN + TLV_EXTENSIONS + 8)
45
45
 
46
- TLV_TYPE_RAILGUN_DLLNAME = TLV_META_TYPE_STRING | (TLV_TYPE_EXTENSION_RAILGUN + TLV_EXTENSIONS + 9)
47
- TLV_TYPE_RAILGUN_FUNCNAME = TLV_META_TYPE_STRING | (TLV_TYPE_EXTENSION_RAILGUN + TLV_EXTENSIONS + 10)
48
- TLV_TYPE_RAILGUN_MULTI_GROUP = TLV_META_TYPE_GROUP | (TLV_TYPE_EXTENSION_RAILGUN + TLV_EXTENSIONS + 11)
46
+ TLV_TYPE_RAILGUN_DLLNAME = TLV_META_TYPE_STRING | (TLV_TYPE_EXTENSION_RAILGUN + TLV_EXTENSIONS + 9)
47
+ TLV_TYPE_RAILGUN_FUNCNAME = TLV_META_TYPE_STRING | (TLV_TYPE_EXTENSION_RAILGUN + TLV_EXTENSIONS + 10)
48
+ TLV_TYPE_RAILGUN_MULTI_GROUP = TLV_META_TYPE_GROUP | (TLV_TYPE_EXTENSION_RAILGUN + TLV_EXTENSIONS + 11)
49
49
 
50
- TLV_TYPE_RAILGUN_MEM_ADDRESS = TLV_META_TYPE_QWORD | (TLV_TYPE_EXTENSION_RAILGUN + TLV_EXTENSIONS + 12 )
51
- TLV_TYPE_RAILGUN_MEM_DATA = TLV_META_TYPE_RAW | (TLV_TYPE_EXTENSION_RAILGUN + TLV_EXTENSIONS + 13 )
52
- TLV_TYPE_RAILGUN_MEM_LENGTH = TLV_META_TYPE_UINT | (TLV_TYPE_EXTENSION_RAILGUN + TLV_EXTENSIONS + 14 )
50
+ TLV_TYPE_RAILGUN_MEM_ADDRESS = TLV_META_TYPE_QWORD | (TLV_TYPE_EXTENSION_RAILGUN + TLV_EXTENSIONS + 12)
51
+ TLV_TYPE_RAILGUN_MEM_DATA = TLV_META_TYPE_RAW | (TLV_TYPE_EXTENSION_RAILGUN + TLV_EXTENSIONS + 13)
52
+ TLV_TYPE_RAILGUN_MEM_LENGTH = TLV_META_TYPE_UINT | (TLV_TYPE_EXTENSION_RAILGUN + TLV_EXTENSIONS + 14)
53
53
 
54
+ TLV_TYPE_RAILGUN_CALLCONV = TLV_META_TYPE_STRING | (TLV_TYPE_EXTENSION_RAILGUN + TLV_EXTENSIONS + 15)
55
+ TLV_TYPE_RAILGUN_BACK_MSG = TLV_META_TYPE_STRING | (TLV_TYPE_EXTENSION_RAILGUN + TLV_EXTENSIONS + 16)
54
56
  end; end; end; end; end; end
@@ -10,64 +10,64 @@ module Railgun
10
10
  module Type
11
11
  module PointerUtil
12
12
 
13
- ARCH_POINTER_SIZE = {
14
- PlatformUtil::X86_64 => 8,
15
- PlatformUtil::X86_32 => 4
16
- }.freeze
13
+ ARCH_POINTER_SIZE = {
14
+ PlatformUtil::X86_64 => 8,
15
+ PlatformUtil::X86_32 => 4
16
+ }.freeze
17
17
 
18
- # Returns the pointer size for this architecture. Should accept client or platform or arch
19
- def self.pointer_size(platform)
20
- ARCH_POINTER_SIZE[platform]
21
- end
18
+ # Returns the pointer size for this architecture. Should accept client or platform or arch
19
+ def self.pointer_size(platform)
20
+ ARCH_POINTER_SIZE[platform]
21
+ end
22
22
 
23
- def self.pack_pointer(pointer, platform)
24
- if pointer.nil?
25
- return pack_pointer(0, platform)
26
- end
23
+ def self.pack_pointer(pointer, platform)
24
+ if pointer.nil?
25
+ return pack_pointer(0, platform)
26
+ end
27
27
 
28
- case platform
29
- when PlatformUtil::X86_64
30
- # XXX: Only works if attacker and victim are like-endianed
31
- [pointer].pack('Q')
32
- when PlatformUtil::X86_32
33
- [pointer].pack('V')
34
- else
35
- raise "platform symbol #{platform.to_s} not supported"
36
- end
37
- end
28
+ case platform
29
+ when PlatformUtil::X86_64
30
+ # XXX: Only works if attacker and victim are like-endianed
31
+ [pointer].pack('Q')
32
+ when PlatformUtil::X86_32
33
+ [pointer].pack('V')
34
+ else
35
+ raise "platform symbol #{platform.to_s} not supported"
36
+ end
37
+ end
38
38
 
39
- # Given a packed pointer, unpack it according to architecture
40
- def self.unpack_pointer(packed_pointer, platform)
41
- case platform
42
- when PlatformUtil::X86_64
43
- # XXX: Only works if attacker and victim are like-endianed
44
- packed_pointer.unpack('Q').first
45
- when PlatformUtil::X86_32
46
- packed_pointer.unpack('V').first
47
- else
48
- raise "platform symbol #{platform.to_s} not supported"
49
- end
50
- end
39
+ # Given a packed pointer, unpack it according to architecture
40
+ def self.unpack_pointer(packed_pointer, platform)
41
+ case platform
42
+ when PlatformUtil::X86_64
43
+ # XXX: Only works if attacker and victim are like-endianed
44
+ packed_pointer.unpack('Q').first
45
+ when PlatformUtil::X86_32
46
+ packed_pointer.unpack('V').first
47
+ else
48
+ raise "platform symbol #{platform.to_s} not supported"
49
+ end
50
+ end
51
51
 
52
- def self.null_pointer(pointer, platform)
53
- pack_pointer(0, platform)
54
- end
52
+ def self.null_pointer(pointer, platform)
53
+ pack_pointer(0, platform)
54
+ end
55
55
 
56
- ###
57
- # Summary: Returns true if pointer will be considered a 'null' pointer
58
- #
59
- # If given nil, returns true
60
- # If given 0, returns true
61
- # If given a string, if 0 after unpacking, returns true
62
- # false otherwise
63
- ##
64
- def self.is_null_pointer?(pointer, platform)
65
- if pointer.kind_of?(String)
66
- pointer = unpack_pointer(pointer, platform)
67
- end
56
+ ###
57
+ # Summary: Returns true if pointer will be considered a 'null' pointer
58
+ #
59
+ # If given nil, returns true
60
+ # If given 0, returns true
61
+ # If given a string, if 0 after unpacking, returns true
62
+ # false otherwise
63
+ ##
64
+ def self.is_null_pointer?(pointer, platform)
65
+ if pointer.kind_of?(String)
66
+ pointer = unpack_pointer(pointer, platform)
67
+ end
68
68
 
69
- return pointer.nil? || pointer == 0
70
- end
69
+ return pointer.nil? || pointer == 0
70
+ end
71
71
  #
72
72
  # def self.is_unpacked_pointer?(pointer, platform)
73
73
  # # TODO also check that the integer size is appropriate for the platform
@@ -83,18 +83,18 @@ module PointerUtil
83
83
  # return false
84
84
  # end
85
85
  #
86
- # Returns true if the data type is a pointer, false otherwise
87
- def self.is_pointer_type?(type)
88
- if type == :pointer
89
- return true
90
- end
86
+ # Returns true if the data type is a pointer, false otherwise
87
+ def self.is_pointer_type?(type)
88
+ if type == :pointer
89
+ return true
90
+ end
91
91
 
92
- if type.kind_of?(String) && type =~ /^L?P/
93
- return true
94
- end
92
+ if type.kind_of?(String) && type =~ /^L?P/
93
+ return true
94
+ end
95
95
 
96
- return false
97
- end
96
+ return false
97
+ end
98
98
 
99
99
  end # PointerUtil
100
100
  end # Type
@@ -13,641 +13,660 @@ module Railgun
13
13
  #
14
14
  class Util
15
15
 
16
- # Bring in some useful string manipulation utility functions
17
- include DLLHelper
18
-
19
- # Data type size info: http://msdn.microsoft.com/en-us/library/s3f49ktz(v=vs.80).aspx
20
- PRIMITIVE_TYPE_SIZES = {
21
- :int => 4,
22
- :__int8 => 1,
23
- :__int16 => 2,
24
- :__int32 => 4,
25
- :__int64 => 8,
26
- :bool => 1,
27
- :char => 1,
28
- :short => 2,
29
- :long => 4,
30
- :long_long => 8,
31
- :float => 4,
32
- :double => 8,
33
- :long_double => 8,
34
- :wchar_t => 2,
35
- }
36
-
37
- #
38
- # Maps a data type to its corresponding primitive or special type
39
- # +:pointer+. Note, primitive types are mapped to themselves.
40
- #
41
- # typedef info: http://msdn.microsoft.com/en-us/library/aa383751(v=vs.85).aspx
42
- TYPE_DEFINITIONS = {
43
- ##
44
- # Primitives
45
- ##
46
- :int => :int,
47
- :__int8 => :__int8,
48
- :__int16 => :__int16,
49
- :__int32 => :__int32,
50
- :__int64 => :__int64,
51
- :bool => :bool,
52
- :char => :char,
53
- :short => :short,
54
- :long => :long,
55
- :long_long => :long_long,
56
- :float => :float,
57
- :double => :double,
58
- :long_double => :long_double,
59
- :wchar_t => :wchar_t,
60
- ##
61
- # Non-pointers
62
- ##
63
- #typedef WORD ATOM;
64
- :ATOM => :short,
65
- #typedef int BOOL;
66
- :BOOL => :int,
67
- #typedef BYTE BOOLEAN;
68
- :BOOLEAN => :char,
69
- #typedef unsigned char BYTE;
70
- :BYTE => :char,
71
- #typedef char CHAR;
72
- :CHAR => :char,
73
- #typedef DWORD COLORREF;
74
- :COLORREF => :long,
75
- #typedef unsigned long DWORD;
76
- :DWORD => :long,
77
- #typedef unsigned int DWORD32;
78
- :DWORD32 => :int,
79
- #typedef unsigned __int64 DWORD64;
80
- :DWORD64 => :__int64,
81
- #typedef float FLOAT;
82
- :FLOAT => :float,
83
- #typedef int HFILE;
84
- :HFILE => :int,
85
- #typedef LONG HRESULT;
86
- :HRESULT => :long,
87
- #typedef int INT;
88
- :INT => :int,
89
- #typedef signed int INT32;
90
- :INT32 => :int,
91
- #typedef signed __int64 INT64;
92
- :INT64 => :__int64,
93
- #typedef WORD LANGID;
94
- :LANGID => :short,
95
- #typedef DWORD LCID;
96
- :LCID => :long,
97
- #typedef DWORD LCTYPE;
98
- :LCTYPE => :long,
99
- #typedef DWORD LGRPID;
100
- :LGRPID => :long,
101
- #typedef long LONG;
102
- :LONG => :long,
103
- #typedef signed int LONG32;
104
- :LONG32 => :int,
105
- #typedef __int64 LONG64;
106
- :LONG64 => :__int64,
107
- #typedef PDWORD PLCID;
108
- :PLCID => :pointer,
109
- #typedef LPVOID SC_LOCK;
110
- :SC_LOCK => :pointer,
111
- #typedef short SHORT;
112
- :SHORT => :short,
113
- #typedef unsigned char UCHAR;
114
- :UCHAR => :char,
115
- #typedef unsigned int UINT;
116
- :UINT => :int,
117
- #typedef unsigned int UINT32;
118
- :UINT32 => :int,
119
- #typedef unsigned long ULONG;
120
- :ULONG => :long,
121
- #typedef unsigned int ULONG32;
122
- :ULONG32 => :int,
123
- #typedef unsigned __int64 ULONG64;
124
- :ULONG64 => :__int64,
125
- #typedef unsigned short USHORT;
126
- :USHORT => :short,
127
- #typedef wchar_t WCHAR;
128
- :WCHAR => :wchar_t,
129
- #typedef unsigned short WORD;
130
- :WORD => :short,
131
- ##
132
- # Pointers declared with *
133
- ##
134
- #typedef DWORD* LPCOLORREF;
135
- :LPCOLORREF => :pointer,
136
- #typedef void* LPCVOID;
137
- :LPCVOID => :pointer,
138
- #typedef WCHAR* LPCWSTR;
139
- :LPCWSTR => :pointer,
140
- #typedef DWORD* LPDWORD;
141
- :LPDWORD => :pointer,
142
- #typedef HANDLE* LPHANDLE;
143
- :LPHANDLE => :pointer,
144
- #typedef int* LPINT;
145
- :LPINT => :pointer,
146
- #typedef long* LPLONG;
147
- :LPLONG => :pointer,
148
- #typedef CHAR* LPSTR;
149
- :LPSTR => :pointer,
150
- #typedef void* LPVOID;
151
- :LPVOID => :pointer,
152
- #typedef WORD* LPWORD;
153
- :LPWORD => :pointer,
154
- #typedef WCHAR* LPWSTR;
155
- :LPWSTR => :pointer,
156
- #typedef BOOL* PBOOL;
157
- :PBOOL => :pointer,
158
- #typedef BOOLEAN* PBOOLEAN;
159
- :PBOOLEAN => :pointer,
160
- #typedef BYTE* PBYTE;
161
- :PBYTE => :pointer,
162
- #typedef CHAR* PCHAR;
163
- :PCHAR => :pointer,
164
- #typedef CHAR* PCSTR;
165
- :PCSTR => :pointer,
166
- #typedef WCHAR* PCWSTR;
167
- :PCWSTR => :pointer,
168
- #typedef DWORD* PDWORD;
169
- :PDWORD => :pointer,
170
- #typedef DWORDLONG* PDWORDLONG;
171
- :PDWORDLONG => :pointer,
172
- #typedef DWORD_PTR* PDWORD_PTR;
173
- :PDWORD_PTR => :pointer,
174
- #typedef DWORD32* PDWORD32;
175
- :PDWORD32 => :pointer,
176
- #typedef DWORD64* PDWORD64;
177
- :PDWORD64 => :pointer,
178
- #typedef FLOAT* PFLOAT;
179
- :PFLOAT => :pointer,
180
- #typedef HANDLE* PHANDLE;
181
- :PHANDLE => :pointer,
182
- #typedef HKEY* PHKEY;
183
- :PHKEY => :pointer,
184
- #typedef int* PINT;
185
- :PINT => :pointer,
186
- #typedef INT_PTR* PINT_PTR;
187
- :PINT_PTR => :pointer,
188
- #typedef INT32* PINT32;
189
- :PINT32 => :pointer,
190
- #typedef INT64* PINT64;
191
- :PINT64 => :pointer,
192
- #typedef LONG* PLONG;
193
- :PLONG => :pointer,
194
- #typedef LONGLONG* PLONGLONG;
195
- :PLONGLONG => :pointer,
196
- #typedef LONG_PTR* PLONG_PTR;
197
- :PLONG_PTR => :pointer,
198
- #typedef LONG32* PLONG32;
199
- :PLONG32 => :pointer,
200
- #typedef LONG64* PLONG64;
201
- :PLONG64 => :pointer,
202
- #typedef SHORT* PSHORT;
203
- :PSHORT => :pointer,
204
- #typedef SIZE_T* PSIZE_T;
205
- :PSIZE_T => :pointer,
206
- #typedef SSIZE_T* PSSIZE_T;
207
- :PSSIZE_T => :pointer,
208
- #typedef CHAR* PSTR;
209
- :PSTR => :pointer,
210
- #typedef TBYTE* PTBYTE;
211
- :PTBYTE => :pointer,
212
- #typedef TCHAR* PTCHAR;
213
- :PTCHAR => :pointer,
214
- #typedef UCHAR* PUCHAR;
215
- :PUCHAR => :pointer,
216
- #typedef UINT* PUINT;
217
- :PUINT => :pointer,
218
- #typedef UINT_PTR* PUINT_PTR;
219
- :PUINT_PTR => :pointer,
220
- #typedef UINT32* PUINT32;
221
- :PUINT32 => :pointer,
222
- #typedef UINT64* PUINT64;
223
- :PUINT64 => :pointer,
224
- #typedef ULONG* PULONG;
225
- :PULONG => :pointer,
226
- #typedef ULONGLONG* PULONGLONG;
227
- :PULONGLONG => :pointer,
228
- #typedef ULONG_PTR* PULONG_PTR;
229
- :PULONG_PTR => :pointer,
230
- #typedef ULONG32* PULONG32;
231
- :PULONG32 => :pointer,
232
- #typedef ULONG64* PULONG64;
233
- :PULONG64 => :pointer,
234
- #typedef USHORT* PUSHORT;
235
- :PUSHORT => :pointer,
236
- #typedef void* PVOID;
237
- :PVOID => :pointer,
238
- #typedef WCHAR* PWCHAR;
239
- :PWCHAR => :pointer,
240
- #typedef WORD* PWORD;
241
- :PWORD => :pointer,
242
- #typedef WCHAR* PWSTR;
243
- :PWSTR => :pointer,
244
- #typedef HANDLE HACCEL;
245
- :HACCEL => :pointer,
246
- ##
247
- # Handles
248
- ##
249
- #typedef PVOID HANDLE;
250
- :HANDLE => :pointer,
251
- #typedef HANDLE HBITMAP;
252
- :HBITMAP => :pointer,
253
- #typedef HANDLE HBRUSH;
254
- :HBRUSH => :pointer,
255
- #typedef HANDLE HCOLORSPACE;
256
- :HCOLORSPACE => :pointer,
257
- #typedef HANDLE HCONV;
258
- :HCONV => :pointer,
259
- #typedef HANDLE HCONVLIST;
260
- :HCONVLIST => :pointer,
261
- #typedef HANDLE HDC;
262
- :HDC => :pointer,
263
- #typedef HANDLE HDDEDATA;
264
- :HDDEDATA => :pointer,
265
- #typedef HANDLE HDESK;
266
- :HDESK => :pointer,
267
- #typedef HANDLE HDROP;
268
- :HDROP => :pointer,
269
- #typedef HANDLE HDWP;
270
- :HDWP => :pointer,
271
- #typedef HANDLE HENHMETAFILE;
272
- :HENHMETAFILE => :pointer,
273
- #typedef HANDLE HFONT;
274
- :HFONT => :pointer,
275
- #typedef HANDLE HGDIOBJ;
276
- :HGDIOBJ => :pointer,
277
- #typedef HANDLE HGLOBAL;
278
- :HGLOBAL => :pointer,
279
- #typedef HANDLE HHOOK;
280
- :HHOOK => :pointer,
281
- #typedef HANDLE HICON;
282
- :HICON => :pointer,
283
- #typedef HANDLE HINSTANCE;
284
- :HINSTANCE => :pointer,
285
- #typedef HANDLE HKEY;
286
- :HKEY => :pointer,
287
- #typedef HANDLE HKL;
288
- :HKL => :pointer,
289
- #typedef HANDLE HLOCAL;
290
- :HLOCAL => :pointer,
291
- #typedef HANDLE HMENU;
292
- :HMENU => :pointer,
293
- #typedef HANDLE HMETAFILE;
294
- :HMETAFILE => :pointer,
295
- #typedef HANDLE HPALETTE;
296
- :HPALETTE => :pointer,
297
- #typedef HANDLE HPEN;
298
- :HPEN => :pointer,
299
- #typedef HANDLE HRGN;
300
- :HRGN => :pointer,
301
- #typedef HANDLE HRSRC;
302
- :HRSRC => :pointer,
303
- #typedef HANDLE HSZ;
304
- :HSZ => :pointer,
305
- #typedef HANDLE WINSTA;
306
- :WINSTA => :pointer,
307
- #typedef HANDLE HWND;
308
- :HWND => :pointer,
309
- #typedef HANDLE SC_HANDLE;
310
- :SC_HANDLE => :pointer,
311
- #typedef HANDLE SERVICE_STATUS_HANDLE;
312
- :SERVICE_STATUS_HANDLE => :pointer,
313
- }
314
-
315
- # param 'railgun' is a Railgun instance.
316
- # param 'platform' is a value like client.platform
317
- def initialize(railgun, platform)
318
- @railgun = railgun
319
- @is_64bit = is_64bit_platform?(platform)
320
- end
321
-
322
- #
323
- # Given a packed pointer, unpacks it according to architecture
324
- #
325
- def unpack_pointer(packed_pointer)
326
- if is_64bit
327
- # XXX: Only works if attacker and victim are like-endianed
328
- packed_pointer.unpack('Q')[0]
329
- else
330
- packed_pointer.unpack('V')[0]
331
- end
332
- end
333
-
334
- #
335
- # Returns true if +pointer+ will be considered a 'null' pointer.
336
- #
337
- # If +pointer+ is nil or 0, returns true
338
- # If +pointer+ is a String, if 0 after unpacking, returns true
339
- # false otherwise
340
- #
341
- # See #unpack_pointer
342
- #
343
- def is_null_pointer(pointer)
344
- if pointer.class == String
345
- pointer = unpack_pointer(pointer)
346
- end
347
-
348
- return pointer.nil? || pointer == 0
349
- end
350
-
351
- #
352
- # Reads null-terminated unicode strings from memory.
353
- #
354
- # Given a pointer to a null terminated array of WCHARs, return a ruby
355
- # String. If +pointer+ is NULL (see #is_null_pointer) returns an empty
356
- # string.
357
- #
358
- def read_wstring(pointer, length = nil)
359
- # Return an empty string for null pointers
360
- if is_null_pointer(pointer)
361
- return ''
362
- end
363
-
364
- # If length not provided, use lstrlenW
365
- if length.nil?
366
- length = railgun.kernel32.lstrlenW(pointer)['return']
367
- end
368
-
369
- # Retrieve the array of characters
370
- chars = read_array(:WCHAR, length, pointer)
371
-
372
- # Concatenate the characters and convert to a ruby string
373
- str = uniz_to_str(chars.join(''))
374
-
375
- return str
376
- end
377
-
378
- #
379
- # Read a given number of bytes from memory or from a provided buffer.
380
- #
381
- # If +buffer+ is not provided, read +size+ bytes from the client's memory.
382
- # If +buffer+ is provided, reads +size+ characters from the index of +address+.
383
- #
384
- def memread(address, size, buffer = nil)
385
- if buffer.nil?
386
- return railgun.memread(address, size)
387
- else
388
- return buffer[address .. (address + size - 1)]
389
- end
390
- end
391
-
392
- #
393
- # Read and unpack a pointer from the given buffer at a given offset
394
- #
395
- def read_pointer(buffer, offset = 0)
396
- unpack_pointer(buffer[offset, (offset + pointer_size)])
397
- end
398
-
399
- #
400
- # Reads data structures and several windows data types
401
- #
402
- def read_data(type, position, buffer = nil)
403
- if buffer.nil?
404
- buffer = memread(position, sizeof_type(type))
405
- position = 0
406
- end
407
-
408
- # If we're asked to read a data structure, deligate to read_struct
409
- if is_struct_type?(type)
410
- return read_struct(type, buffer, position)
411
- end
412
-
413
- # If the type is an array with a given size...
414
- # BYTE[3] for example or BYTE[ENCRYPTED_PWLEN] or even PDWORD[23]
415
- if is_array_type?(type)
416
- # Separate the element type from the size of the array
417
- element_type, length = split_array_type(type)
418
-
419
- # Have read_array take care of the rest
420
- return read_array(element_type, length, position, buffer)
421
- end
422
-
423
- size = sizeof_type(type)
424
- raw = memread(position, size, buffer)
425
-
426
- # read/unpack data for the types we have hard-coded support for
427
- case type
428
- when :LPWSTR
429
- # null-terminated string of 16-bit Unicode characters
430
- return read_wstring(read_pointer(raw))
431
- when :DWORD
432
- # Both on x86 and x64, DWORD is 32 bits
433
- return raw.unpack('V').first
434
- when :BOOL
435
- return raw.unpack('l').first == 1
436
- when :LONG
437
- return raw.unpack('l').first
438
- end
439
-
440
- #If nothing worked thus far, return it raw
441
- return raw
442
- end
443
-
444
- #
445
- # Read +length+ number of instances of +type+ from +bufptr+ .
446
- #
447
- # +bufptr+ is an index in +buffer+ or, if +buffer+ is nil, a memory address
448
- #
449
- def read_array(type, length, bufptr, buffer = nil)
450
- if length <= 0
451
- return []
452
- end
453
-
454
- size = sizeof_type(type)
455
- # Grab the bytes that the array consists of
456
- buffer = memread(bufptr, size * length, buffer)
457
-
458
- offset = 0
459
-
460
- 1.upto(length).map do |n|
461
- data = read_data(type, offset, buffer)
462
-
463
- offset = offset + size
464
-
465
- data
466
- end
467
- end
468
-
469
- #
470
- # Construct the data structure described in +definition+ from +buffer+
471
- # starting from the index +offset+
472
- #
473
- def read_struct(definition, buffer, offset = 0)
474
- data = {}
475
-
476
- offsets = struct_offsets(definition, offset)
477
-
478
- definition.each do |mapping|
479
- key, data_type = mapping
480
-
481
- data[key] = read_data(data_type, offsets.shift, buffer)
482
- end
483
-
484
- data
485
- end
486
-
487
-
488
- # Returns true if the data type is a pointer, false otherwise
489
- def is_pointer_type?(type)
490
- return TYPE_DEFINITIONS[type] == :pointer
491
- end
492
-
493
- # Returns whether the given type represents an array of another type
494
- # For example BYTE[3], BYTE[ENCRYPTED_PWLEN], or even PDWORD[23]
495
- def is_array_type?(type)
496
- return type =~ /^\w+\[\w+\]$/ ? true : false
497
- end
498
-
499
- # Returns true if the type passed describes a data structure, false otherwise
500
- def is_struct_type?(type)
501
- return type.class == Array
502
- end
503
-
504
-
505
- # Returns the pointer size for this architecture
506
- def pointer_size
507
- is_64bit ? 8 : 4
508
- end
509
-
510
- # Return the size, in bytes, of the given type
511
- def sizeof_type(type)
512
- if is_pointer_type?(type)
513
- return pointer_size
514
- end
515
-
516
- if is_array_type?(type)
517
- element_type, length = split_array_type(type)
518
-
519
- return length * sizeof_type(element_type)
520
- end
521
-
522
- if is_struct_type?(type)
523
- return sizeof_struct(type)
524
- end
525
-
526
- if TYPE_DEFINITIONS.has_key?(type)
527
- primitive = TYPE_DEFINITIONS[type]
528
-
529
- if primitive == :pointer
530
- return pointer_size
531
- end
532
-
533
- if PRIMITIVE_TYPE_SIZES.has_key?(primitive)
534
- return PRIMITIVE_TYPE_SIZES[primitive]
535
- else
536
- raise "Type #{type} was mapped to non-existent primitive #{primitive}"
537
- end
538
- end
539
-
540
- raise "Unable to determine size for type #{type}."
541
- end
542
-
543
- #
544
- # Calculates the size of +struct+ after alignment.
545
- #
546
- def sizeof_struct(struct)
547
- offsets = struct_offsets(struct, 0)
548
- last_data_size = sizeof_type(struct.last[1])
549
- size_no_padding = offsets.last + last_data_size
550
-
551
- return size_no_padding + calc_padding(size_no_padding)
552
- end
553
-
554
- #
555
- # Given a description of a data structure, returns an Array containing
556
- # the offset from the beginning for each subsequent element, taking into
557
- # consideration alignment and padding.
558
- #
559
- def struct_offsets(definition, offset)
560
- padding = 0
561
- offsets = []
562
-
563
- definition.each do |mapping|
564
- key, data_type = mapping
565
-
566
- if sizeof_type(data_type) > padding
567
- offset = offset + padding
568
- end
569
-
570
- offsets.push(offset)
571
-
572
- offset = offset + sizeof_type(data_type)
573
-
574
- padding = calc_padding(offset)
575
- end
576
-
577
- offsets
578
- end
579
-
580
- # http://en.wikipedia.org/wiki/Data_structure_alignment
581
- def required_alignment
582
- is_64bit ? 8 : 4
583
- end
584
-
585
- #
586
- # Number of bytes that needed to be added to be aligned.
587
- #
588
- def calc_padding(offset)
589
- align = required_alignment
590
-
591
- # If offset is not aligned...
592
- if (offset % align) != 0
593
- # Calculate padding needed to be aligned
594
- align - (offset & (align - 1))
595
- else
596
- 0
597
- end
598
- end
599
-
600
- #
601
- # Given an explicit array definition (e.g. BYTE[23]) return size (e.g. 23) and
602
- # and +type+ (e.g. BYTE). If a constant is given, attempt to resolve it
603
- # that constant.
604
- #
605
- def split_array_type(type)
606
- if type =~ /^(\w+)\[(\w+)\]$/
607
- element_type = $1
608
- length = $2
609
-
610
- unless length =~ /^\d+$/
611
- length = railgun.const(length)
612
- end
613
-
614
- return element_type, length
615
- else
616
- raise "Can not split non-array type #{type}"
617
- end
618
- end
619
-
620
- # Returns true if given platform has 64bit architecture
621
- # expects client.platform
622
- def is_64bit_platform?(platform)
623
- platform =~ /win64/
624
- end
625
-
626
- #
627
- # Evaluates a bit field, returning a hash representing the meaning and
628
- # state of each bit.
629
- #
630
- # Parameters:
631
- # +value+:: a bit field represented by a Fixnum
632
- # +mappings+:: { 'WINAPI_CONSTANT_NAME' => :descriptive_symbol, ... }
633
- #
634
- # Returns:
635
- # { :descriptive_symbol => true/false, ... }
636
- #
637
- def judge_bit_field(value, mappings)
638
- flags = {}
639
- rg = railgun
640
-
641
- mappings.each do |constant_name, key|
642
- flags[key] = (value & rg.const(constant_name)) != 0
643
- end
644
-
645
- flags
646
- end
647
-
648
- protected
649
-
650
- attr_accessor :railgun, :is_64bit
16
+ # Bring in some useful string manipulation utility functions
17
+ include DLLHelper
18
+
19
+ # Data type size info: http://msdn.microsoft.com/en-us/library/s3f49ktz(v=vs.80).aspx
20
+ PRIMITIVE_TYPE_SIZES = {
21
+ :int => 4,
22
+ :__int8 => 1,
23
+ :__int16 => 2,
24
+ :__int32 => 4,
25
+ :__int64 => 8,
26
+ :bool => 1,
27
+ :char => 1,
28
+ :short => 2,
29
+ :long => 4,
30
+ :long_long => 8,
31
+ :float => 4,
32
+ :double => 8,
33
+ :long_double => 8,
34
+ :wchar_t => 2,
35
+ }
36
+
37
+ #
38
+ # Maps a data type to its corresponding primitive or special type
39
+ # +:pointer+. Note, primitive types are mapped to themselves.
40
+ #
41
+ # typedef info: http://msdn.microsoft.com/en-us/library/aa383751(v=vs.85).aspx
42
+ TYPE_DEFINITIONS = {
43
+ ##
44
+ # Primitives
45
+ ##
46
+ :int => :int,
47
+ :__int8 => :__int8,
48
+ :__int16 => :__int16,
49
+ :__int32 => :__int32,
50
+ :__int64 => :__int64,
51
+ :bool => :bool,
52
+ :char => :char,
53
+ :short => :short,
54
+ :long => :long,
55
+ :long_long => :long_long,
56
+ :float => :float,
57
+ :double => :double,
58
+ :long_double => :long_double,
59
+ :wchar_t => :wchar_t,
60
+ ##
61
+ # Non-pointers
62
+ ##
63
+ #typedef WORD ATOM;
64
+ :ATOM => :short,
65
+ #typedef int BOOL;
66
+ :BOOL => :int,
67
+ #typedef BYTE BOOLEAN;
68
+ :BOOLEAN => :char,
69
+ #typedef unsigned char BYTE;
70
+ :BYTE => :char,
71
+ #typedef char CHAR;
72
+ :CHAR => :char,
73
+ #typedef DWORD COLORREF;
74
+ :COLORREF => :long,
75
+ #typedef unsigned long DWORD;
76
+ :DWORD => :long,
77
+ #typedef unsigned int DWORD32;
78
+ :DWORD32 => :int,
79
+ #typedef unsigned __int64 DWORD64;
80
+ :DWORD64 => :__int64,
81
+ #typedef float FLOAT;
82
+ :FLOAT => :float,
83
+ #typedef int HFILE;
84
+ :HFILE => :int,
85
+ #typedef LONG HRESULT;
86
+ :HRESULT => :long,
87
+ #typedef int INT;
88
+ :INT => :int,
89
+ #typedef signed int INT32;
90
+ :INT32 => :int,
91
+ #typedef signed __int64 INT64;
92
+ :INT64 => :__int64,
93
+ #typedef WORD LANGID;
94
+ :LANGID => :short,
95
+ #typedef DWORD LCID;
96
+ :LCID => :long,
97
+ #typedef DWORD LCTYPE;
98
+ :LCTYPE => :long,
99
+ #typedef DWORD LGRPID;
100
+ :LGRPID => :long,
101
+ #typedef long LONG;
102
+ :LONG => :long,
103
+ #typedef signed int LONG32;
104
+ :LONG32 => :int,
105
+ #typedef __int64 LONG64;
106
+ :LONG64 => :__int64,
107
+ #typedef PDWORD PLCID;
108
+ :PLCID => :pointer,
109
+ #typedef LPVOID SC_LOCK;
110
+ :SC_LOCK => :pointer,
111
+ #typedef short SHORT;
112
+ :SHORT => :short,
113
+ #typedef unsigned char UCHAR;
114
+ :UCHAR => :char,
115
+ #typedef unsigned int UINT;
116
+ :UINT => :int,
117
+ #typedef unsigned int UINT32;
118
+ :UINT32 => :int,
119
+ #typedef unsigned long ULONG;
120
+ :ULONG => :long,
121
+ #typedef unsigned int ULONG32;
122
+ :ULONG32 => :int,
123
+ #typedef unsigned __int64 ULONG64;
124
+ :ULONG64 => :__int64,
125
+ #typedef unsigned short USHORT;
126
+ :USHORT => :short,
127
+ #typedef wchar_t WCHAR;
128
+ :WCHAR => :wchar_t,
129
+ #typedef unsigned short WORD;
130
+ :WORD => :short,
131
+ ##
132
+ # Pointers declared with *
133
+ ##
134
+ #typedef DWORD* LPCOLORREF;
135
+ :LPCOLORREF => :pointer,
136
+ #typedef void* LPCVOID;
137
+ :LPCVOID => :pointer,
138
+ #typedef WCHAR* LPCWSTR;
139
+ :LPCWSTR => :pointer,
140
+ #typedef DWORD* LPDWORD;
141
+ :LPDWORD => :pointer,
142
+ #typedef HANDLE* LPHANDLE;
143
+ :LPHANDLE => :pointer,
144
+ #typedef int* LPINT;
145
+ :LPINT => :pointer,
146
+ #typedef long* LPLONG;
147
+ :LPLONG => :pointer,
148
+ #typedef CHAR* LPSTR;
149
+ :LPSTR => :pointer,
150
+ #typedef void* LPVOID;
151
+ :LPVOID => :pointer,
152
+ #typedef WORD* LPWORD;
153
+ :LPWORD => :pointer,
154
+ #typedef WCHAR* LPWSTR;
155
+ :LPWSTR => :pointer,
156
+ #typedef BOOL* PBOOL;
157
+ :PBOOL => :pointer,
158
+ #typedef BOOLEAN* PBOOLEAN;
159
+ :PBOOLEAN => :pointer,
160
+ #typedef BYTE* PBYTE;
161
+ :PBYTE => :pointer,
162
+ #typedef CHAR* PCHAR;
163
+ :PCHAR => :pointer,
164
+ #typedef CHAR* PCSTR;
165
+ :PCSTR => :pointer,
166
+ #typedef WCHAR* PCWSTR;
167
+ :PCWSTR => :pointer,
168
+ #typedef DWORD* PDWORD;
169
+ :PDWORD => :pointer,
170
+ #typedef DWORDLONG* PDWORDLONG;
171
+ :PDWORDLONG => :pointer,
172
+ #typedef DWORD_PTR* PDWORD_PTR;
173
+ :PDWORD_PTR => :pointer,
174
+ #typedef DWORD32* PDWORD32;
175
+ :PDWORD32 => :pointer,
176
+ #typedef DWORD64* PDWORD64;
177
+ :PDWORD64 => :pointer,
178
+ #typedef FLOAT* PFLOAT;
179
+ :PFLOAT => :pointer,
180
+ #typedef HANDLE* PHANDLE;
181
+ :PHANDLE => :pointer,
182
+ #typedef HKEY* PHKEY;
183
+ :PHKEY => :pointer,
184
+ #typedef int* PINT;
185
+ :PINT => :pointer,
186
+ #typedef INT_PTR* PINT_PTR;
187
+ :PINT_PTR => :pointer,
188
+ #typedef INT32* PINT32;
189
+ :PINT32 => :pointer,
190
+ #typedef INT64* PINT64;
191
+ :PINT64 => :pointer,
192
+ #typedef LONG* PLONG;
193
+ :PLONG => :pointer,
194
+ #typedef LONGLONG* PLONGLONG;
195
+ :PLONGLONG => :pointer,
196
+ #typedef LONG_PTR* PLONG_PTR;
197
+ :PLONG_PTR => :pointer,
198
+ #typedef LONG32* PLONG32;
199
+ :PLONG32 => :pointer,
200
+ #typedef LONG64* PLONG64;
201
+ :PLONG64 => :pointer,
202
+ #typedef SHORT* PSHORT;
203
+ :PSHORT => :pointer,
204
+ #typedef SIZE_T* PSIZE_T;
205
+ :PSIZE_T => :pointer,
206
+ #typedef SSIZE_T* PSSIZE_T;
207
+ :PSSIZE_T => :pointer,
208
+ #typedef CHAR* PSTR;
209
+ :PSTR => :pointer,
210
+ #typedef TBYTE* PTBYTE;
211
+ :PTBYTE => :pointer,
212
+ #typedef TCHAR* PTCHAR;
213
+ :PTCHAR => :pointer,
214
+ #typedef UCHAR* PUCHAR;
215
+ :PUCHAR => :pointer,
216
+ #typedef UINT* PUINT;
217
+ :PUINT => :pointer,
218
+ #typedef UINT_PTR* PUINT_PTR;
219
+ :PUINT_PTR => :pointer,
220
+ #typedef UINT32* PUINT32;
221
+ :PUINT32 => :pointer,
222
+ #typedef UINT64* PUINT64;
223
+ :PUINT64 => :pointer,
224
+ #typedef ULONG* PULONG;
225
+ :PULONG => :pointer,
226
+ #typedef ULONGLONG* PULONGLONG;
227
+ :PULONGLONG => :pointer,
228
+ #typedef ULONG_PTR* PULONG_PTR;
229
+ :PULONG_PTR => :pointer,
230
+ #typedef ULONG32* PULONG32;
231
+ :PULONG32 => :pointer,
232
+ #typedef ULONG64* PULONG64;
233
+ :PULONG64 => :pointer,
234
+ #typedef USHORT* PUSHORT;
235
+ :PUSHORT => :pointer,
236
+ #typedef void* PVOID;
237
+ :PVOID => :pointer,
238
+ #typedef WCHAR* PWCHAR;
239
+ :PWCHAR => :pointer,
240
+ #typedef WORD* PWORD;
241
+ :PWORD => :pointer,
242
+ #typedef WCHAR* PWSTR;
243
+ :PWSTR => :pointer,
244
+ #typedef HANDLE HACCEL;
245
+ :HACCEL => :pointer,
246
+ ##
247
+ # Handles
248
+ ##
249
+ #typedef PVOID HANDLE;
250
+ :HANDLE => :pointer,
251
+ #typedef HANDLE HBITMAP;
252
+ :HBITMAP => :pointer,
253
+ #typedef HANDLE HBRUSH;
254
+ :HBRUSH => :pointer,
255
+ #typedef HANDLE HCOLORSPACE;
256
+ :HCOLORSPACE => :pointer,
257
+ #typedef HANDLE HCONV;
258
+ :HCONV => :pointer,
259
+ #typedef HANDLE HCONVLIST;
260
+ :HCONVLIST => :pointer,
261
+ #typedef HANDLE HDC;
262
+ :HDC => :pointer,
263
+ #typedef HANDLE HDDEDATA;
264
+ :HDDEDATA => :pointer,
265
+ #typedef HANDLE HDESK;
266
+ :HDESK => :pointer,
267
+ #typedef HANDLE HDROP;
268
+ :HDROP => :pointer,
269
+ #typedef HANDLE HDWP;
270
+ :HDWP => :pointer,
271
+ #typedef HANDLE HENHMETAFILE;
272
+ :HENHMETAFILE => :pointer,
273
+ #typedef HANDLE HFONT;
274
+ :HFONT => :pointer,
275
+ #typedef HANDLE HGDIOBJ;
276
+ :HGDIOBJ => :pointer,
277
+ #typedef HANDLE HGLOBAL;
278
+ :HGLOBAL => :pointer,
279
+ #typedef HANDLE HHOOK;
280
+ :HHOOK => :pointer,
281
+ #typedef HANDLE HICON;
282
+ :HICON => :pointer,
283
+ #typedef HANDLE HINSTANCE;
284
+ :HINSTANCE => :pointer,
285
+ #typedef HANDLE HKEY;
286
+ :HKEY => :pointer,
287
+ #typedef HANDLE HKL;
288
+ :HKL => :pointer,
289
+ #typedef HANDLE HLOCAL;
290
+ :HLOCAL => :pointer,
291
+ #typedef HANDLE HMENU;
292
+ :HMENU => :pointer,
293
+ #typedef HANDLE HMETAFILE;
294
+ :HMETAFILE => :pointer,
295
+ #typedef HANDLE HPALETTE;
296
+ :HPALETTE => :pointer,
297
+ #typedef HANDLE HPEN;
298
+ :HPEN => :pointer,
299
+ #typedef HANDLE HRGN;
300
+ :HRGN => :pointer,
301
+ #typedef HANDLE HRSRC;
302
+ :HRSRC => :pointer,
303
+ #typedef HANDLE HSZ;
304
+ :HSZ => :pointer,
305
+ #typedef HANDLE WINSTA;
306
+ :WINSTA => :pointer,
307
+ #typedef HANDLE HWND;
308
+ :HWND => :pointer,
309
+ #typedef HANDLE SC_HANDLE;
310
+ :SC_HANDLE => :pointer,
311
+ #typedef HANDLE SERVICE_STATUS_HANDLE;
312
+ :SERVICE_STATUS_HANDLE => :pointer,
313
+ }
314
+
315
+ # param 'railgun' is a Railgun instance.
316
+ # param 'platform' is a value like client.platform
317
+ def initialize(railgun, platform)
318
+ @railgun = railgun
319
+ @is_64bit = is_64bit_platform?(platform)
320
+ end
321
+
322
+ #
323
+ # Given a packed pointer, unpacks it according to architecture
324
+ #
325
+ def unpack_pointer(packed_pointer)
326
+ if is_64bit
327
+ # XXX: Only works if attacker and victim are like-endianed
328
+ packed_pointer.unpack('Q')[0]
329
+ else
330
+ packed_pointer.unpack('V')[0]
331
+ end
332
+ end
333
+
334
+ #
335
+ # Returns true if +pointer+ will be considered a 'null' pointer.
336
+ #
337
+ # If +pointer+ is nil or 0, returns true
338
+ # If +pointer+ is a String, if 0 after unpacking, returns true
339
+ # false otherwise
340
+ #
341
+ # See #unpack_pointer
342
+ #
343
+ def is_null_pointer(pointer)
344
+ if pointer.kind_of? String
345
+ pointer = unpack_pointer(pointer)
346
+ end
347
+
348
+ return pointer.nil? || pointer == 0
349
+ end
350
+
351
+ #
352
+ # Reads null-terminated unicode strings from memory.
353
+ #
354
+ # Given a pointer to a null terminated array of WCHARs, return a ruby
355
+ # String. If +pointer+ is NULL (see #is_null_pointer) returns an empty
356
+ # string.
357
+ #
358
+ def read_wstring(pointer, length = nil)
359
+ # Return an empty string for null pointers
360
+ if is_null_pointer(pointer)
361
+ return ''
362
+ end
363
+
364
+ # If length not provided, use lstrlenW
365
+ if length.nil?
366
+ length = railgun.kernel32.lstrlenW(pointer)['return']
367
+ end
368
+
369
+ # Retrieve the array of characters
370
+ chars = read_array(:WCHAR, length, pointer)
371
+
372
+ # Concatenate the characters and convert to a ruby string
373
+ str = uniz_to_str(chars.join(''))
374
+
375
+ return str
376
+ end
377
+
378
+ #
379
+ # Reads null-terminated ASCII strings from memory.
380
+ #
381
+ # Given a pointer to a null terminated array of CHARs, return a ruby
382
+ # String. If +pointer+ is NULL (see #is_null_pointer) returns an empty
383
+ # string.
384
+ #
385
+ def read_string(pointer, length=nil)
386
+ if is_null_pointer(pointer)
387
+ return ''
388
+ end
389
+
390
+ unless length
391
+ length = railgun.kernel32.lstrlenA(pointer)['return']
392
+ end
393
+
394
+ chars = read_array(:CHAR, length, pointer)
395
+ return chars.join('')
396
+ end
397
+
398
+ #
399
+ # Read a given number of bytes from memory or from a provided buffer.
400
+ #
401
+ # If +buffer+ is not provided, read +size+ bytes from the client's memory.
402
+ # If +buffer+ is provided, reads +size+ characters from the index of +address+.
403
+ #
404
+ def memread(address, size, buffer = nil)
405
+ if buffer.nil?
406
+ return railgun.memread(address, size)
407
+ else
408
+ return buffer[address .. (address + size - 1)]
409
+ end
410
+ end
411
+
412
+ #
413
+ # Read and unpack a pointer from the given buffer at a given offset
414
+ #
415
+ def read_pointer(buffer, offset = 0)
416
+ unpack_pointer(buffer[offset, (offset + pointer_size)])
417
+ end
418
+
419
+ #
420
+ # Reads data structures and several windows data types
421
+ #
422
+ def read_data(type, position, buffer = nil)
423
+ if buffer.nil?
424
+ buffer = memread(position, sizeof_type(type))
425
+ position = 0
426
+ end
427
+
428
+ # If we're asked to read a data structure, deligate to read_struct
429
+ if is_struct_type?(type)
430
+ return read_struct(type, buffer, position)
431
+ end
432
+
433
+ # If the type is an array with a given size...
434
+ # BYTE[3] for example or BYTE[ENCRYPTED_PWLEN] or even PDWORD[23]
435
+ if is_array_type?(type)
436
+ # Separate the element type from the size of the array
437
+ element_type, length = split_array_type(type)
438
+
439
+ # Have read_array take care of the rest
440
+ return read_array(element_type, length, position, buffer)
441
+ end
442
+
443
+ size = sizeof_type(type)
444
+ raw = memread(position, size, buffer)
445
+
446
+ # read/unpack data for the types we have hard-coded support for
447
+ case type
448
+ when :LPWSTR
449
+ # null-terminated string of 16-bit Unicode characters
450
+ return read_wstring(read_pointer(raw))
451
+ when :DWORD
452
+ # Both on x86 and x64, DWORD is 32 bits
453
+ return raw.unpack('V').first
454
+ when :BOOL
455
+ return raw.unpack('l').first == 1
456
+ when :LONG
457
+ return raw.unpack('l').first
458
+ end
459
+
460
+ #If nothing worked thus far, return it raw
461
+ return raw
462
+ end
463
+
464
+ #
465
+ # Read +length+ number of instances of +type+ from +bufptr+ .
466
+ #
467
+ # +bufptr+ is an index in +buffer+ or, if +buffer+ is nil, a memory address
468
+ #
469
+ def read_array(type, length, bufptr, buffer = nil)
470
+ if length <= 0
471
+ return []
472
+ end
473
+
474
+ size = sizeof_type(type)
475
+ # Grab the bytes that the array consists of
476
+ buffer = memread(bufptr, size * length, buffer)
477
+
478
+ offset = 0
479
+
480
+ 1.upto(length).map do |n|
481
+ data = read_data(type, offset, buffer)
482
+
483
+ offset = offset + size
484
+
485
+ data
486
+ end
487
+ end
488
+
489
+ #
490
+ # Construct the data structure described in +definition+ from +buffer+
491
+ # starting from the index +offset+
492
+ #
493
+ def read_struct(definition, buffer, offset = 0)
494
+ data = {}
495
+
496
+ offsets = struct_offsets(definition, offset)
497
+
498
+ definition.each do |mapping|
499
+ key, data_type = mapping
500
+
501
+ data[key] = read_data(data_type, offsets.shift, buffer)
502
+ end
503
+
504
+ data
505
+ end
506
+
507
+
508
+ # Returns true if the data type is a pointer, false otherwise
509
+ def is_pointer_type?(type)
510
+ return TYPE_DEFINITIONS[type] == :pointer
511
+ end
512
+
513
+ # Returns whether the given type represents an array of another type
514
+ # For example BYTE[3], BYTE[ENCRYPTED_PWLEN], or even PDWORD[23]
515
+ def is_array_type?(type)
516
+ return type =~ /^\w+\[\w+\]$/ ? true : false
517
+ end
518
+
519
+ # Returns true if the type passed describes a data structure, false otherwise
520
+ def is_struct_type?(type)
521
+ return type.kind_of? Array
522
+ end
523
+
524
+
525
+ # Returns the pointer size for this architecture
526
+ def pointer_size
527
+ is_64bit ? 8 : 4
528
+ end
529
+
530
+ # Return the size, in bytes, of the given type
531
+ def sizeof_type(type)
532
+ if is_pointer_type?(type)
533
+ return pointer_size
534
+ end
535
+
536
+ if type.kind_of? String
537
+ if is_array_type?(type)
538
+ element_type, length = split_array_type(type)
539
+ return length * sizeof_type(element_type)
540
+ else
541
+ return sizeof_type(type.to_sym)
542
+ end
543
+ end
544
+
545
+ if is_struct_type?(type)
546
+ return sizeof_struct(type)
547
+ end
548
+
549
+ if TYPE_DEFINITIONS.has_key?(type)
550
+ primitive = TYPE_DEFINITIONS[type]
551
+
552
+ if primitive == :pointer
553
+ return pointer_size
554
+ end
555
+
556
+ if PRIMITIVE_TYPE_SIZES.has_key?(primitive)
557
+ return PRIMITIVE_TYPE_SIZES[primitive]
558
+ else
559
+ raise "Type #{type} was mapped to non-existent primitive #{primitive}"
560
+ end
561
+ end
562
+
563
+ raise "Unable to determine size for type #{type}."
564
+ end
565
+
566
+ #
567
+ # Calculates the size of +struct+ after alignment.
568
+ #
569
+ def sizeof_struct(struct)
570
+ offsets = struct_offsets(struct, 0)
571
+ last_data_size = sizeof_type(struct.last[1])
572
+ size_no_padding = offsets.last + last_data_size
573
+
574
+ return size_no_padding + calc_padding(size_no_padding)
575
+ end
576
+
577
+ #
578
+ # Given a description of a data structure, returns an Array containing
579
+ # the offset from the beginning for each subsequent element, taking into
580
+ # consideration alignment and padding.
581
+ #
582
+ def struct_offsets(definition, offset)
583
+ padding = 0
584
+ offsets = []
585
+ definition.each do |mapping|
586
+ key, data_type = mapping
587
+ if sizeof_type(data_type) > padding
588
+ offset = offset + padding
589
+ end
590
+
591
+ offsets.push(offset)
592
+
593
+ offset = offset + sizeof_type(data_type)
594
+ padding = calc_padding(offset)
595
+ end
596
+
597
+ offsets
598
+ end
599
+
600
+ # http://en.wikipedia.org/wiki/Data_structure_alignment
601
+ def required_alignment
602
+ is_64bit ? 8 : 4
603
+ end
604
+
605
+ #
606
+ # Number of bytes that needed to be added to be aligned.
607
+ #
608
+ def calc_padding(offset)
609
+ align = required_alignment
610
+
611
+ # If offset is not aligned...
612
+ if (offset % align) != 0
613
+ # Calculate padding needed to be aligned
614
+ align - (offset & (align - 1))
615
+ else
616
+ 0
617
+ end
618
+ end
619
+
620
+ #
621
+ # Given an explicit array definition (e.g. BYTE[23]) return size (e.g. 23) and
622
+ # and +type+ (e.g. BYTE). If a constant is given, attempt to resolve it
623
+ # that constant.
624
+ #
625
+ def split_array_type(type)
626
+ if type =~ /^(\w+)\[(\w+)\]$/
627
+ element_type = $1
628
+ length = $2
629
+ unless length =~ /^\d+$/
630
+ length = railgun.const(length)
631
+ end
632
+
633
+ return element_type.to_sym, length.to_i
634
+ else
635
+ raise "Can not split non-array type #{type}"
636
+ end
637
+ end
638
+
639
+ # Returns true if given platform has 64bit architecture
640
+ # expects client.platform
641
+ def is_64bit_platform?(platform)
642
+ platform =~ /win64/
643
+ end
644
+
645
+ #
646
+ # Evaluates a bit field, returning a hash representing the meaning and
647
+ # state of each bit.
648
+ #
649
+ # Parameters:
650
+ # +value+:: a bit field represented by a Fixnum
651
+ # +mappings+:: { 'WINAPI_CONSTANT_NAME' => :descriptive_symbol, ... }
652
+ #
653
+ # Returns:
654
+ # { :descriptive_symbol => true/false, ... }
655
+ #
656
+ def judge_bit_field(value, mappings)
657
+ flags = {}
658
+ rg = railgun
659
+
660
+ mappings.each do |constant_name, key|
661
+ flags[key] = (value & rg.const(constant_name)) != 0
662
+ end
663
+
664
+ flags
665
+ end
666
+
667
+ protected
668
+
669
+ attr_accessor :railgun, :is_64bit
651
670
  end # Util
652
671
  end # Railgun
653
672
  end # Stdapi