librex 0.0.4 → 0.0.5

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 (389) hide show
  1. data/README.md +12 -0
  2. data/lib/rex.rb +0 -0
  3. data/lib/rex.rb.ts.rb +0 -0
  4. data/lib/rex/LICENSE +0 -0
  5. data/lib/rex/arch.rb +0 -0
  6. data/lib/rex/arch/sparc.rb +0 -0
  7. data/lib/rex/arch/sparc.rb.ut.rb +0 -0
  8. data/lib/rex/arch/x86.rb +0 -0
  9. data/lib/rex/arch/x86.rb.ut.rb +0 -0
  10. data/lib/rex/assembly/nasm.rb +0 -0
  11. data/lib/rex/assembly/nasm.rb.ut.rb +0 -0
  12. data/lib/rex/codepage.map +0 -0
  13. data/lib/rex/compat.rb +0 -0
  14. data/lib/rex/constants.rb +0 -0
  15. data/lib/rex/elfparsey.rb +0 -0
  16. data/lib/rex/elfparsey/elf.rb +0 -0
  17. data/lib/rex/elfparsey/elfbase.rb +2 -4
  18. data/lib/rex/elfparsey/exceptions.rb +0 -0
  19. data/lib/rex/elfscan.rb +0 -0
  20. data/lib/rex/elfscan/scanner.rb +0 -0
  21. data/lib/rex/elfscan/search.rb +10 -10
  22. data/lib/rex/encoder/alpha2.rb +0 -0
  23. data/lib/rex/encoder/alpha2/alpha_mixed.rb +0 -0
  24. data/lib/rex/encoder/alpha2/alpha_upper.rb +0 -0
  25. data/lib/rex/encoder/alpha2/generic.rb +0 -0
  26. data/lib/rex/encoder/alpha2/unicode_mixed.rb +0 -0
  27. data/lib/rex/encoder/alpha2/unicode_upper.rb +0 -0
  28. data/lib/rex/encoder/ndr.rb +0 -0
  29. data/lib/rex/encoder/ndr.rb.ut.rb +0 -0
  30. data/lib/rex/encoder/nonalpha.rb +0 -0
  31. data/lib/rex/encoder/nonupper.rb +0 -0
  32. data/lib/rex/encoder/xdr.rb +0 -0
  33. data/lib/rex/encoder/xdr.rb.ut.rb +0 -0
  34. data/lib/rex/encoder/xor.rb +0 -0
  35. data/lib/rex/encoder/xor/dword.rb +0 -0
  36. data/lib/rex/encoder/xor/dword_additive.rb +0 -0
  37. data/lib/rex/encoders/xor_dword.rb +0 -0
  38. data/lib/rex/encoders/xor_dword_additive.rb +0 -0
  39. data/lib/rex/encoders/xor_dword_additive.rb.ut.rb +0 -0
  40. data/lib/rex/encoding/xor.rb +0 -0
  41. data/lib/rex/encoding/xor.rb.ts.rb +0 -0
  42. data/lib/rex/encoding/xor/byte.rb +0 -0
  43. data/lib/rex/encoding/xor/byte.rb.ut.rb +0 -0
  44. data/lib/rex/encoding/xor/dword.rb +0 -0
  45. data/lib/rex/encoding/xor/dword.rb.ut.rb +0 -0
  46. data/lib/rex/encoding/xor/dword_additive.rb +0 -0
  47. data/lib/rex/encoding/xor/dword_additive.rb.ut.rb +0 -0
  48. data/lib/rex/encoding/xor/exceptions.rb +0 -0
  49. data/lib/rex/encoding/xor/generic.rb +0 -0
  50. data/lib/rex/encoding/xor/generic.rb.ut.rb +0 -0
  51. data/lib/rex/encoding/xor/qword.rb +0 -0
  52. data/lib/rex/encoding/xor/word.rb +0 -0
  53. data/lib/rex/encoding/xor/word.rb.ut.rb +0 -0
  54. data/lib/rex/exceptions.rb +0 -0
  55. data/lib/rex/exceptions.rb.ut.rb +0 -0
  56. data/lib/rex/exploitation/cmdstager.rb +0 -0
  57. data/lib/rex/exploitation/cmdstager/base.rb +6 -1
  58. data/lib/rex/exploitation/cmdstager/debug_asm.rb +0 -0
  59. data/lib/rex/exploitation/cmdstager/debug_write.rb +0 -0
  60. data/lib/rex/exploitation/cmdstager/tftp.rb +8 -8
  61. data/lib/rex/exploitation/cmdstager/vbs.rb +0 -0
  62. data/lib/rex/exploitation/egghunter.rb +143 -36
  63. data/lib/rex/exploitation/egghunter.rb.ut.rb +0 -0
  64. data/lib/rex/exploitation/encryptjs.rb +0 -0
  65. data/lib/rex/exploitation/heaplib.js.b64 +0 -0
  66. data/lib/rex/exploitation/heaplib.rb +0 -0
  67. data/lib/rex/exploitation/javascriptosdetect.rb +114 -15
  68. data/lib/rex/exploitation/obfuscatejs.rb +0 -0
  69. data/lib/rex/exploitation/omelet.rb +320 -0
  70. data/lib/rex/exploitation/omelet.rb.ut.rb +13 -0
  71. data/lib/rex/exploitation/opcodedb.rb +0 -0
  72. data/lib/rex/exploitation/opcodedb.rb.ut.rb +0 -0
  73. data/lib/rex/exploitation/seh.rb +0 -0
  74. data/lib/rex/exploitation/seh.rb.ut.rb +0 -0
  75. data/lib/rex/file.rb +1 -1
  76. data/lib/rex/file.rb.ut.rb +0 -0
  77. data/lib/rex/image_source.rb +0 -0
  78. data/lib/rex/image_source/disk.rb +0 -0
  79. data/lib/rex/image_source/image_source.rb +0 -0
  80. data/lib/rex/image_source/memory.rb +0 -0
  81. data/lib/rex/io/bidirectional_pipe.rb +0 -0
  82. data/lib/rex/io/datagram_abstraction.rb +0 -0
  83. data/lib/rex/io/stream.rb +1 -1
  84. data/lib/rex/io/stream_abstraction.rb +0 -0
  85. data/lib/rex/io/stream_server.rb +0 -0
  86. data/lib/rex/job_container.rb +0 -1
  87. data/lib/rex/logging.rb +0 -0
  88. data/lib/rex/logging/log_dispatcher.rb +0 -0
  89. data/lib/rex/logging/log_sink.rb +0 -0
  90. data/lib/rex/logging/sinks/flatfile.rb +0 -0
  91. data/lib/rex/logging/sinks/stderr.rb +0 -0
  92. data/lib/rex/machparsey.rb +0 -0
  93. data/lib/rex/machparsey/exceptions.rb +0 -0
  94. data/lib/rex/machparsey/machbase.rb +0 -0
  95. data/lib/rex/machscan.rb +0 -0
  96. data/lib/rex/machscan/scanner.rb +0 -0
  97. data/lib/rex/mime.rb +0 -0
  98. data/lib/rex/mime/header.rb +0 -0
  99. data/lib/rex/mime/message.rb +0 -0
  100. data/lib/rex/mime/part.rb +0 -0
  101. data/lib/rex/nop/opty2.rb +0 -0
  102. data/lib/rex/nop/opty2.rb.ut.rb +0 -0
  103. data/lib/rex/nop/opty2_tables.rb +0 -0
  104. data/lib/rex/ole.rb +0 -0
  105. data/lib/rex/ole/clsid.rb +0 -0
  106. data/lib/rex/ole/difat.rb +0 -0
  107. data/lib/rex/ole/directory.rb +0 -0
  108. data/lib/rex/ole/direntry.rb +0 -0
  109. data/lib/rex/ole/docs/dependencies.txt +8 -0
  110. data/lib/rex/ole/docs/references.txt +1 -0
  111. data/lib/rex/ole/fat.rb +0 -0
  112. data/lib/rex/ole/header.rb +3 -3
  113. data/lib/rex/ole/minifat.rb +0 -0
  114. data/lib/rex/ole/storage.rb +4 -4
  115. data/lib/rex/ole/stream.rb +0 -0
  116. data/lib/rex/ole/substorage.rb +0 -0
  117. data/lib/rex/ole/util.rb +0 -0
  118. data/lib/rex/parser/arguments.rb +0 -0
  119. data/lib/rex/parser/arguments.rb.ut.rb +0 -0
  120. data/lib/rex/parser/ini.rb +0 -0
  121. data/lib/rex/parser/ini.rb.ut.rb +0 -0
  122. data/lib/rex/parser/nexpose_xml.rb +0 -0
  123. data/lib/rex/parser/nmap_xml.rb +0 -0
  124. data/lib/rex/payloads.rb +0 -0
  125. data/lib/rex/payloads/win32.rb +0 -0
  126. data/lib/rex/payloads/win32/common.rb +0 -0
  127. data/lib/rex/payloads/win32/kernel.rb +0 -0
  128. data/lib/rex/payloads/win32/kernel/common.rb +0 -0
  129. data/lib/rex/payloads/win32/kernel/migration.rb +0 -0
  130. data/lib/rex/payloads/win32/kernel/recovery.rb +0 -0
  131. data/lib/rex/peparsey.rb +0 -0
  132. data/lib/rex/peparsey/exceptions.rb +0 -0
  133. data/lib/rex/peparsey/pe.rb +7 -1
  134. data/lib/rex/peparsey/pe_memdump.rb +0 -0
  135. data/lib/rex/peparsey/pebase.rb +27 -2
  136. data/lib/rex/peparsey/section.rb +0 -0
  137. data/lib/rex/pescan.rb +0 -0
  138. data/lib/rex/pescan/analyze.rb +0 -0
  139. data/lib/rex/pescan/scanner.rb +0 -0
  140. data/lib/rex/pescan/search.rb +0 -0
  141. data/lib/rex/platforms.rb +0 -0
  142. data/lib/rex/platforms/windows.rb +0 -0
  143. data/lib/rex/poly.rb +0 -0
  144. data/lib/rex/poly/block.rb +0 -0
  145. data/lib/rex/poly/register.rb +0 -0
  146. data/lib/rex/poly/register/x86.rb +0 -0
  147. data/lib/rex/post.rb +0 -0
  148. data/lib/rex/post/dir.rb +0 -0
  149. data/lib/rex/post/file.rb +0 -0
  150. data/lib/rex/post/file_stat.rb +0 -0
  151. data/lib/rex/post/gen.pl +0 -0
  152. data/lib/rex/post/io.rb +0 -0
  153. data/lib/rex/post/meterpreter.rb +0 -0
  154. data/lib/rex/post/meterpreter/channel.rb +0 -0
  155. data/lib/rex/post/meterpreter/channel_container.rb +0 -0
  156. data/lib/rex/post/meterpreter/channels/pool.rb +0 -0
  157. data/lib/rex/post/meterpreter/channels/pools/file.rb +0 -0
  158. data/lib/rex/post/meterpreter/channels/pools/stream_pool.rb +0 -0
  159. data/lib/rex/post/meterpreter/channels/stream.rb +0 -0
  160. data/lib/rex/post/meterpreter/client.rb +3 -0
  161. data/lib/rex/post/meterpreter/client_core.rb +0 -0
  162. data/lib/rex/post/meterpreter/dependencies.rb +0 -0
  163. data/lib/rex/post/meterpreter/extension.rb +0 -0
  164. data/lib/rex/post/meterpreter/extensions/espia/espia.rb +0 -0
  165. data/lib/rex/post/meterpreter/extensions/espia/tlv.rb +0 -0
  166. data/lib/rex/post/meterpreter/extensions/incognito/incognito.rb +0 -0
  167. data/lib/rex/post/meterpreter/extensions/incognito/tlv.rb +0 -0
  168. data/lib/rex/post/meterpreter/extensions/networkpug/networkpug.rb +57 -0
  169. data/lib/rex/post/meterpreter/extensions/networkpug/tlv.rb +15 -0
  170. data/lib/rex/post/meterpreter/extensions/priv/fs.rb +0 -0
  171. data/lib/rex/post/meterpreter/extensions/priv/passwd.rb +0 -0
  172. data/lib/rex/post/meterpreter/extensions/priv/priv.rb +0 -0
  173. data/lib/rex/post/meterpreter/extensions/priv/tlv.rb +0 -0
  174. data/lib/rex/post/meterpreter/extensions/sniffer/sniffer.rb +2 -1
  175. data/lib/rex/post/meterpreter/extensions/sniffer/tlv.rb +12 -10
  176. data/lib/rex/post/meterpreter/extensions/stdapi/constants.rb +0 -0
  177. data/lib/rex/post/meterpreter/extensions/stdapi/fs/dir.rb +0 -0
  178. data/lib/rex/post/meterpreter/extensions/stdapi/fs/file.rb +31 -0
  179. data/lib/rex/post/meterpreter/extensions/stdapi/fs/file_stat.rb +0 -0
  180. data/lib/rex/post/meterpreter/extensions/stdapi/fs/io.rb +0 -0
  181. data/lib/rex/post/meterpreter/extensions/stdapi/net/config.rb +0 -0
  182. data/lib/rex/post/meterpreter/extensions/stdapi/net/interface.rb +0 -0
  183. data/lib/rex/post/meterpreter/extensions/stdapi/net/route.rb +0 -0
  184. data/lib/rex/post/meterpreter/extensions/stdapi/net/socket_subsystem/tcp_server_channel.rb +0 -0
  185. data/lib/rex/post/meterpreter/extensions/{railgun → stdapi/railgun}/api_constants.rb +38106 -38105
  186. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_advapi32.rb +1804 -0
  187. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_iphlpapi.rb +96 -0
  188. data/lib/rex/post/meterpreter/extensions/{railgun → stdapi/railgun/def}/def_kernel32.rb +3848 -3678
  189. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_ntdll.rb +153 -0
  190. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_shell32.rb +21 -0
  191. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_user32.rb +3169 -0
  192. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_ws2_32.rb +599 -0
  193. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/model.rb +540 -0
  194. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/multicall.rb +308 -0
  195. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/railgun.rb +196 -0
  196. data/lib/rex/post/meterpreter/extensions/{railgun → stdapi/railgun}/tlv.rb +6 -9
  197. data/lib/rex/post/meterpreter/extensions/stdapi/stdapi.rb +5 -0
  198. data/lib/rex/post/meterpreter/extensions/stdapi/sys/config.rb +0 -0
  199. data/lib/rex/post/meterpreter/extensions/stdapi/sys/event_log.rb +0 -0
  200. data/lib/rex/post/meterpreter/extensions/stdapi/sys/event_log_subsystem/event_record.rb +0 -0
  201. data/lib/rex/post/meterpreter/extensions/stdapi/sys/power.rb +0 -0
  202. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process.rb +0 -0
  203. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/image.rb +0 -0
  204. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/io.rb +0 -0
  205. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/memory.rb +0 -0
  206. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/thread.rb +0 -0
  207. data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry.rb +0 -0
  208. data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry_subsystem/registry_key.rb +0 -0
  209. data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry_subsystem/registry_value.rb +0 -0
  210. data/lib/rex/post/meterpreter/extensions/stdapi/sys/thread.rb +0 -0
  211. data/lib/rex/post/meterpreter/extensions/stdapi/tlv.rb +6 -0
  212. data/lib/rex/post/meterpreter/extensions/stdapi/ui.rb +0 -0
  213. data/lib/rex/post/meterpreter/inbound_packet_handler.rb +0 -0
  214. data/lib/rex/post/meterpreter/object_aliases.rb +0 -0
  215. data/lib/rex/post/meterpreter/packet.rb +23 -1
  216. data/lib/rex/post/meterpreter/packet_dispatcher.rb +13 -2
  217. data/lib/rex/post/meterpreter/packet_parser.rb +0 -0
  218. data/lib/rex/post/meterpreter/packet_response_waiter.rb +17 -10
  219. data/lib/rex/post/meterpreter/ui/console.rb +0 -0
  220. data/lib/rex/post/meterpreter/ui/console/command_dispatcher.rb +0 -0
  221. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/core.rb +12 -7
  222. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/espia.rb +0 -0
  223. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/incognito.rb +0 -0
  224. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/networkpug.rb +221 -0
  225. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv.rb +0 -0
  226. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv/elevate.rb +0 -0
  227. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv/passwd.rb +0 -0
  228. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv/timestomp.rb +0 -0
  229. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/sniffer.rb +4 -3
  230. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi.rb +0 -0
  231. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/fs.rb +56 -1
  232. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/net.rb +22 -0
  233. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/sys.rb +0 -0
  234. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/ui.rb +0 -0
  235. data/lib/rex/post/meterpreter/ui/console/interactive_channel.rb +0 -0
  236. data/lib/rex/post/permission.rb +0 -0
  237. data/lib/rex/post/process.rb +0 -0
  238. data/lib/rex/post/thread.rb +0 -0
  239. data/lib/rex/post/ui.rb +0 -0
  240. data/lib/rex/proto.rb +0 -0
  241. data/lib/rex/proto.rb.ts.rb +0 -0
  242. data/lib/rex/proto/dcerpc.rb +0 -0
  243. data/lib/rex/proto/dcerpc.rb.ts.rb +0 -0
  244. data/lib/rex/proto/dcerpc/client.rb +3 -1
  245. data/lib/rex/proto/dcerpc/exceptions.rb +0 -0
  246. data/lib/rex/proto/dcerpc/handle.rb +0 -0
  247. data/lib/rex/proto/dcerpc/handle.rb.ut.rb +0 -0
  248. data/lib/rex/proto/dcerpc/ndr.rb +0 -0
  249. data/lib/rex/proto/dcerpc/ndr.rb.ut.rb +0 -0
  250. data/lib/rex/proto/dcerpc/packet.rb +0 -0
  251. data/lib/rex/proto/dcerpc/packet.rb.ut.rb +0 -0
  252. data/lib/rex/proto/dcerpc/response.rb.ut.rb +0 -0
  253. data/lib/rex/proto/dcerpc/uuid.rb +0 -0
  254. data/lib/rex/proto/dcerpc/uuid.rb.ut.rb +0 -0
  255. data/lib/rex/proto/dhcp.rb +7 -0
  256. data/lib/rex/proto/dhcp/constants.rb +33 -0
  257. data/lib/rex/proto/dhcp/server.rb +285 -0
  258. data/lib/rex/proto/drda.rb +0 -0
  259. data/lib/rex/proto/drda.rb.ts.rb +0 -0
  260. data/lib/rex/proto/drda/constants.rb +0 -0
  261. data/lib/rex/proto/drda/constants.rb.ut.rb +0 -0
  262. data/lib/rex/proto/drda/packet.rb +0 -0
  263. data/lib/rex/proto/drda/packet.rb.ut.rb +0 -0
  264. data/lib/rex/proto/drda/utils.rb +0 -0
  265. data/lib/rex/proto/drda/utils.rb.ut.rb +0 -0
  266. data/lib/rex/proto/http.rb +0 -0
  267. data/lib/rex/proto/http.rb.ts.rb +0 -0
  268. data/lib/rex/proto/http/client.rb +27 -2
  269. data/lib/rex/proto/http/client.rb.ut.rb +4 -2
  270. data/lib/rex/proto/http/handler.rb +0 -0
  271. data/lib/rex/proto/http/handler/erb.rb +0 -0
  272. data/lib/rex/proto/http/handler/erb.rb.ut.rb +0 -0
  273. data/lib/rex/proto/http/handler/erb.rb.ut.rb.rhtml +0 -0
  274. data/lib/rex/proto/http/handler/proc.rb +6 -0
  275. data/lib/rex/proto/http/handler/proc.rb.ut.rb +0 -0
  276. data/lib/rex/proto/http/header.rb +0 -0
  277. data/lib/rex/proto/http/header.rb.ut.rb +0 -0
  278. data/lib/rex/proto/http/packet.rb +20 -19
  279. data/lib/rex/proto/http/packet.rb.ut.rb +0 -0
  280. data/lib/rex/proto/http/request.rb +0 -0
  281. data/lib/rex/proto/http/request.rb.ut.rb +0 -0
  282. data/lib/rex/proto/http/response.rb +0 -0
  283. data/lib/rex/proto/http/response.rb.ut.rb +0 -0
  284. data/lib/rex/proto/http/server.rb +5 -3
  285. data/lib/rex/proto/http/server.rb.ut.rb +0 -0
  286. data/lib/rex/proto/proxy/socks4a.rb +440 -0
  287. data/lib/rex/proto/smb.rb +0 -0
  288. data/lib/rex/proto/smb.rb.ts.rb +0 -0
  289. data/lib/rex/proto/smb/client.rb +110 -61
  290. data/lib/rex/proto/smb/client.rb.ut.rb +0 -0
  291. data/lib/rex/proto/smb/constants.rb +5 -3
  292. data/lib/rex/proto/smb/constants.rb.ut.rb +0 -0
  293. data/lib/rex/proto/smb/crypt.rb +0 -0
  294. data/lib/rex/proto/smb/crypt.rb.ut.rb +0 -0
  295. data/lib/rex/proto/smb/exceptions.rb +0 -0
  296. data/lib/rex/proto/smb/simpleclient.rb +0 -0
  297. data/lib/rex/proto/smb/simpleclient.rb.ut.rb +0 -0
  298. data/lib/rex/proto/smb/utils.rb +2 -0
  299. data/lib/rex/proto/smb/utils.rb.ut.rb +0 -0
  300. data/lib/rex/proto/sunrpc.rb +0 -0
  301. data/lib/rex/proto/sunrpc/client.rb +0 -0
  302. data/lib/rex/proto/tftp.rb +10 -1
  303. data/lib/rex/proto/tftp/constants.rb +5 -3
  304. data/lib/rex/proto/tftp/server.rb +79 -9
  305. data/lib/rex/script.rb +0 -0
  306. data/lib/rex/script/base.rb +0 -0
  307. data/lib/rex/script/meterpreter.rb +0 -0
  308. data/lib/rex/script/shell.rb +0 -0
  309. data/lib/rex/service.rb +0 -0
  310. data/lib/rex/service_manager.rb +0 -0
  311. data/lib/rex/service_manager.rb.ut.rb +0 -0
  312. data/lib/rex/services/local_relay.rb +0 -0
  313. data/lib/rex/socket.rb +6 -4
  314. data/lib/rex/socket.rb.ut.rb +0 -0
  315. data/lib/rex/socket/comm.rb +0 -0
  316. data/lib/rex/socket/comm/local.rb +0 -0
  317. data/lib/rex/socket/comm/local.rb.ut.rb +0 -0
  318. data/lib/rex/socket/ip.rb +0 -0
  319. data/lib/rex/socket/parameters.rb +0 -0
  320. data/lib/rex/socket/parameters.rb.ut.rb +0 -0
  321. data/lib/rex/socket/range_walker.rb +0 -0
  322. data/lib/rex/socket/range_walker.rb.ut.rb +0 -0
  323. data/lib/rex/socket/ssl_tcp.rb +1 -1
  324. data/lib/rex/socket/ssl_tcp.rb.ut.rb +0 -0
  325. data/lib/rex/socket/ssl_tcp_server.rb +0 -0
  326. data/lib/rex/socket/ssl_tcp_server.rb.ut.rb +0 -0
  327. data/lib/rex/socket/subnet_walker.rb +0 -0
  328. data/lib/rex/socket/subnet_walker.rb.ut.rb +0 -0
  329. data/lib/rex/socket/switch_board.rb.ut.rb +0 -0
  330. data/lib/rex/socket/tcp.rb +0 -0
  331. data/lib/rex/socket/tcp.rb.ut.rb +0 -0
  332. data/lib/rex/socket/tcp_server.rb +0 -0
  333. data/lib/rex/socket/tcp_server.rb.ut.rb +0 -0
  334. data/lib/rex/socket/udp.rb +0 -0
  335. data/lib/rex/socket/udp.rb.ut.rb +0 -0
  336. data/lib/rex/struct2.rb +0 -0
  337. data/lib/rex/struct2/c_struct.rb +0 -0
  338. data/lib/rex/struct2/c_struct_template.rb +0 -0
  339. data/lib/rex/struct2/constant.rb +0 -0
  340. data/lib/rex/struct2/element.rb +0 -0
  341. data/lib/rex/struct2/generic.rb +0 -0
  342. data/lib/rex/struct2/restraint.rb +0 -0
  343. data/lib/rex/struct2/s_string.rb +0 -0
  344. data/lib/rex/struct2/s_struct.rb +0 -0
  345. data/lib/rex/sync.rb +0 -0
  346. data/lib/rex/sync/event.rb +0 -0
  347. data/lib/rex/sync/read_write_lock.rb +0 -0
  348. data/lib/rex/sync/ref.rb +0 -0
  349. data/lib/rex/sync/thread_safe.rb +0 -0
  350. data/lib/rex/test.rb +0 -0
  351. data/lib/rex/text.rb +13 -3
  352. data/lib/rex/text.rb.ut.rb +9 -4
  353. data/lib/rex/time.rb +0 -0
  354. data/lib/rex/transformer.rb +0 -0
  355. data/lib/rex/transformer.rb.ut.rb +0 -0
  356. data/lib/rex/ui.rb +0 -0
  357. data/lib/rex/ui/interactive.rb +0 -0
  358. data/lib/rex/ui/output.rb +0 -0
  359. data/lib/rex/ui/output/none.rb +0 -0
  360. data/lib/rex/ui/progress_tracker.rb +0 -0
  361. data/lib/rex/ui/subscriber.rb +0 -0
  362. data/lib/rex/ui/text/color.rb +0 -0
  363. data/lib/rex/ui/text/color.rb.ut.rb +0 -0
  364. data/lib/rex/ui/text/dispatcher_shell.rb +0 -0
  365. data/lib/rex/ui/text/input.rb +0 -0
  366. data/lib/rex/ui/text/input/buffer.rb +0 -0
  367. data/lib/rex/ui/text/input/readline.rb +0 -0
  368. data/lib/rex/ui/text/input/socket.rb +0 -0
  369. data/lib/rex/ui/text/input/stdio.rb +0 -0
  370. data/lib/rex/ui/text/irb_shell.rb +0 -0
  371. data/lib/rex/ui/text/output.rb +0 -0
  372. data/lib/rex/ui/text/output/buffer.rb +0 -0
  373. data/lib/rex/ui/text/output/file.rb +0 -0
  374. data/lib/rex/ui/text/output/socket.rb +0 -0
  375. data/lib/rex/ui/text/output/stdio.rb +0 -0
  376. data/lib/rex/ui/text/progress_tracker.rb +0 -0
  377. data/lib/rex/ui/text/progress_tracker.rb.ut.rb +0 -0
  378. data/lib/rex/ui/text/shell.rb +9 -6
  379. data/lib/rex/ui/text/table.rb +5 -0
  380. data/lib/rex/ui/text/table.rb.ut.rb +0 -0
  381. data/lib/rex/zip.rb +0 -0
  382. data/lib/rex/zip/archive.rb +29 -1
  383. data/lib/rex/zip/blocks.rb +0 -0
  384. data/lib/rex/zip/entry.rb +5 -1
  385. metadata +369 -413
  386. data/README +0 -8
  387. data/lib/rex/post/meterpreter/extensions/railgun/api.rb +0 -9303
  388. data/lib/rex/post/meterpreter/extensions/railgun/railgun.rb +0 -815
  389. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/railgun.rb +0 -57
@@ -0,0 +1,308 @@
1
+ # Copyright (c) 2010, patrickHVE@googlemail.com
2
+ # All rights reserved.
3
+ #
4
+ # Redistribution and use in source and binary forms, with or without
5
+ # modification, are permitted provided that the following conditions are met:
6
+ # * Redistributions of source code must retain the above copyright
7
+ # notice, this list of conditions and the following disclaimer.
8
+ # * Redistributions in binary form must reproduce the above copyright
9
+ # notice, this list of conditions and the following disclaimer in the
10
+ # documentation and/or other materials provided with the distribution.
11
+ # * The names of the author may not be used to endorse or promote products
12
+ # derived from this software without specific prior written permission.
13
+ #
14
+ # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
15
+ # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
16
+ # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
17
+ # DISCLAIMED. IN NO EVENT SHALL patrickHVE@googlemail.com BE LIABLE FOR ANY
18
+ # DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
19
+ # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
20
+ # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
21
+ # ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22
+ # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
23
+ # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24
+
25
+ require 'pp'
26
+ require 'enumerator'
27
+ require 'rex/post/meterpreter/extensions/stdapi/railgun/api_constants'
28
+ require 'rex/post/meterpreter/extensions/stdapi/railgun/tlv'
29
+ require 'rex/post/meterpreter/extensions/stdapi/railgun/model'
30
+
31
+ module Rex
32
+ module Post
33
+ module Meterpreter
34
+ module Extensions
35
+ module Stdapi
36
+ module Railgun
37
+
38
+ # A easier way to call multiple functions in a single request
39
+ class MultiCaller
40
+
41
+ include DLLHelper
42
+
43
+ def initialize( client, parent, win_consts )
44
+ @parent = parent
45
+ @client = client
46
+ @win_consts = win_consts
47
+ if( @client.platform =~ /x64/i )
48
+ @native = 'Q'
49
+ else
50
+ @native = 'V'
51
+ end
52
+ end
53
+
54
+ def call(functions)
55
+
56
+ request = Packet.create_request('stdapi_railgun_api_multi')
57
+ function_results = []
58
+ layouts = []
59
+ functions.each do |f|
60
+ dll_name,funcname,args = f
61
+ dll_host = @parent.get_dll( dll_name )
62
+
63
+ if not dll_host
64
+ raise "DLL #{dll_name} has not been loaded"
65
+ end
66
+
67
+ function = dll_host.functions[funcname]
68
+ if not function
69
+ raise "DLL #{dll_name} function #{funcname} has not been defined"
70
+ end
71
+
72
+ raise "#{function.params.length} arguments expected. #{args.length} arguments provided." unless args.length == function.params.length
73
+ #puts "process_function_call(function.windows_name,#{PP.pp(args, "")})"
74
+
75
+ # We transmit the immediate stack and three heap-buffers:
76
+ # in, inout and out. The reason behind the separation is bandwidth.
77
+ # We don't want to transmit uninitialized data in or no-longer-needed data out.
78
+
79
+ # out-only-buffers that are ONLY transmitted on the way BACK
80
+ out_only_layout = {} # paramName => BufferItem
81
+ out_only_size_bytes = 0
82
+ #puts " assembling out-only buffer"
83
+ function.params.each_with_index do |param_desc, param_idx|
84
+ #puts " processing #{param_desc[1]}"
85
+
86
+ # Special case:
87
+ # The user can choose to supply a Null pointer instead of a buffer
88
+ # in this case we don't need space in any heap buffer
89
+ if param_desc[0][0,1] == 'P' # type is a pointer
90
+ if args[param_idx] == nil
91
+ next
92
+ end
93
+ end
94
+
95
+ # we care only about out-only buffers
96
+ if param_desc[2] == "out"
97
+ raise "error in param #{param_desc[1]}: Out-only buffers must be described by a number indicating their size in bytes " unless args[param_idx].class == Fixnum
98
+ buffer_size = args[param_idx]
99
+ # bump up the size for an x64 pointer
100
+ if( @native == 'Q' and buffer_size == 4 )
101
+ args[param_idx] = 8
102
+ buffer_size = args[param_idx]
103
+ end
104
+
105
+ if( @native == 'Q' )
106
+ raise "Please pass 8 for 'out' PDWORDS, since they require a buffer of size 8" unless buffer_size == 8
107
+ elsif( @native == 'V' )
108
+ raise "Please pass 4 for 'out' PDWORDS, since they require a buffer of size 4" unless buffer_size == 4
109
+ end
110
+
111
+ out_only_layout[param_desc[1]] = BufferItem.new(param_idx, out_only_size_bytes, buffer_size, param_desc[0])
112
+ out_only_size_bytes += buffer_size
113
+ end
114
+ end
115
+
116
+ tmp = assemble_buffer("in", function, args)
117
+ in_only_layout = tmp[0]
118
+ in_only_buffer = tmp[1]
119
+
120
+ tmp = assemble_buffer("inout", function, args)
121
+ inout_layout = tmp[0]
122
+ inout_buffer = tmp[1]
123
+
124
+
125
+ # now we build the stack
126
+ # every stack dword will be described by two dwords:
127
+ # first dword describes second dword:
128
+ # 0 - literal,
129
+ # 1 = relative to in-only buffer
130
+ # 2 = relative to out-only buffer
131
+ # 3 = relative to inout buffer
132
+
133
+ # (literal numbers and pointers to buffers we have created)
134
+ literal_pairs_blob = ""
135
+ #puts " assembling literal stack"
136
+ function.params.each_with_index do |param_desc, param_idx|
137
+ #puts " processing (#{param_desc[0]}, #{param_desc[1]}, #{param_desc[2]})"
138
+ buffer = nil
139
+ # is it a pointer to a buffer on our stack
140
+ if ["PDWORD", "PWCHAR", "PCHAR", "PBLOB"].include? param_desc[0]
141
+ #puts " pointer"
142
+ if args[param_idx] == nil # null pointer?
143
+ buffer = [0].pack(@native) # type: DWORD (so the dll does not rebase it)
144
+ buffer += [0].pack(@native) # value: 0
145
+ elsif param_desc[2] == "in"
146
+ buffer = [1].pack(@native)
147
+ buffer += [in_only_layout[param_desc[1]].addr].pack(@native)
148
+ elsif param_desc[2] == "out"
149
+ buffer = [2].pack(@native)
150
+ buffer += [out_only_layout[param_desc[1]].addr].pack(@native)
151
+ elsif param_desc[2] == "inout"
152
+ buffer = [3].pack(@native)
153
+ buffer += [inout_layout[param_desc[1]].addr].pack(@native)
154
+ else
155
+ raise "unexpected direction"
156
+ end
157
+ else
158
+ #puts " not a pointer"
159
+ # it's not a pointer
160
+ buffer = [0].pack(@native)
161
+ case param_desc[0]
162
+ when "LPVOID", "HANDLE"
163
+ num = param_to_number(args[param_idx])
164
+ buffer += [num].pack(@native)
165
+ when "DWORD"
166
+ num = param_to_number(args[param_idx])
167
+ buffer += [num % 4294967296].pack(@native)
168
+ when "WORD"
169
+ num = param_to_number(args[param_idx])
170
+ buffer += [num % 65536].pack(@native)
171
+ when "BYTE"
172
+ num = param_to_number(args[param_idx])
173
+ buffer += [num % 256].pack(@native)
174
+ when "BOOL"
175
+ case args[param_idx]
176
+ when true
177
+ buffer += [1].pack('V')
178
+ when false
179
+ buffer += [0].pack('V')
180
+ else
181
+ raise "param #{param_desc[1]}: true or false expected"
182
+ end
183
+ else
184
+ raise "unexpected type for param #{param_desc[1]}"
185
+ end
186
+ end
187
+
188
+ #puts " adding pair to blob"
189
+ literal_pairs_blob += buffer
190
+ #puts " buffer size %X" % buffer.length
191
+ #puts " blob size so far: %X" % literal_pairs_blob.length
192
+ end
193
+
194
+ #puts "\n\nsending Stuff to meterpreter"
195
+
196
+ group = Rex::Post::Meterpreter::GroupTlv.new(TLV_TYPE_RAILGUN_MULTI_GROUP)
197
+ group.add_tlv(TLV_TYPE_RAILGUN_SIZE_OUT, out_only_size_bytes)
198
+ group.add_tlv(TLV_TYPE_RAILGUN_STACKBLOB, literal_pairs_blob)
199
+ group.add_tlv(TLV_TYPE_RAILGUN_BUFFERBLOB_IN, in_only_buffer)
200
+ group.add_tlv(TLV_TYPE_RAILGUN_BUFFERBLOB_INOUT, inout_buffer)
201
+ group.add_tlv(TLV_TYPE_RAILGUN_DLLNAME, dll_name )
202
+ group.add_tlv(TLV_TYPE_RAILGUN_FUNCNAME, function.windows_name)
203
+ request.tlvs << group
204
+
205
+ layouts << [inout_layout, out_only_layout]
206
+ end
207
+
208
+ call_results = []
209
+ res = @client.send_request(request)
210
+ res.each(TLV_TYPE_RAILGUN_MULTI_GROUP) do |val|
211
+ call_results << val
212
+ end
213
+
214
+ functions.each do |f|
215
+ dll_name,funcname,args = f
216
+ dll_host = @parent.get_dll( dll_name )
217
+ function = dll_host.functions[funcname]
218
+ response = call_results.shift
219
+ inout_layout, out_only_layout = layouts.shift
220
+
221
+ rec_inout_buffers = response.get_tlv_value(TLV_TYPE_RAILGUN_BACK_BUFFERBLOB_INOUT)
222
+ rec_out_only_buffers = response.get_tlv_value(TLV_TYPE_RAILGUN_BACK_BUFFERBLOB_OUT)
223
+ rec_return_value = response.get_tlv_value(TLV_TYPE_RAILGUN_BACK_RET)
224
+ rec_last_error = response.get_tlv_value(TLV_TYPE_RAILGUN_BACK_ERR)
225
+
226
+ # The hash the function returns
227
+ return_hash={"GetLastError" => rec_last_error}
228
+
229
+ #process return value
230
+ case function.return_type
231
+ when "LPVOID", "HANDLE"
232
+ if( @native == 'Q' )
233
+ return_hash["return"] = rec_return_value
234
+ else
235
+ return_hash["return"] = rec_return_value % 4294967296
236
+ end
237
+ when "DWORD"
238
+ return_hash["return"] = rec_return_value % 4294967296
239
+ when "WORD"
240
+ return_hash["return"] = rec_return_value % 65536
241
+ when "BYTE"
242
+ return_hash["return"] = rec_return_value % 256
243
+ when "BOOL"
244
+ return_hash["return"] = (rec_return_value != 0)
245
+ when "VOID"
246
+ return_hash["return"] = nil
247
+ else
248
+ raise "unexpected return type: #{function.return_type}"
249
+ end
250
+ #puts return_hash
251
+ #puts "out_only_layout:"
252
+ #puts out_only_layout
253
+
254
+
255
+ # process out-only buffers
256
+ #puts "processing out-only buffers:"
257
+ out_only_layout.each_pair do |param_name, buffer_item|
258
+ #puts " #{param_name}"
259
+ buffer = rec_out_only_buffers[buffer_item.addr, buffer_item.length_in_bytes]
260
+ case buffer_item.datatype
261
+ when "PDWORD"
262
+ return_hash[param_name] = buffer.unpack('V')[0]
263
+ when "PCHAR"
264
+ return_hash[param_name] = asciiz_to_str(buffer)
265
+ when "PWCHAR"
266
+ return_hash[param_name] = uniz_to_str(buffer)
267
+ when "PBLOB"
268
+ return_hash[param_name] = buffer
269
+ else
270
+ raise "unexpected type in out-only buffer of #{param_name}: #{buffer_item.datatype}"
271
+ end
272
+ end
273
+ #puts return_hash
274
+
275
+ # process in-out buffers
276
+ #puts "processing in-out buffers:"
277
+ inout_layout.each_pair do |param_name, buffer_item|
278
+ #puts " #{param_name}"
279
+ buffer = rec_inout_buffers[buffer_item.addr, buffer_item.length_in_bytes]
280
+ case buffer_item.datatype
281
+ when "PDWORD"
282
+ return_hash[param_name] = buffer.unpack('V')[0]
283
+ when "PCHAR"
284
+ return_hash[param_name] = asciiz_to_str(buffer)
285
+ when "PWCHAR"
286
+ return_hash[param_name] = uniz_to_str(buffer)
287
+ when "PBLOB"
288
+ return_hash[param_name] = buffer
289
+ else
290
+ raise "unexpected type in in-out-buffer of #{param_name}: #{buffer_item.datatype}"
291
+ end
292
+ end
293
+ #puts return_hash
294
+ #puts "finished"
295
+
296
+ function_results << return_hash
297
+ end
298
+ function_results
299
+ end
300
+ # process_multi_function_call
301
+
302
+ protected
303
+
304
+ attr_accessor :win_consts
305
+
306
+ end # MultiCall
307
+
308
+ end; end; end; end; end; end
@@ -0,0 +1,196 @@
1
+ # Copyright (c) 2010, patrickHVE@googlemail.com
2
+ # All rights reserved.
3
+ #
4
+ # Redistribution and use in source and binary forms, with or without
5
+ # modification, are permitted provided that the following conditions are met:
6
+ # * Redistributions of source code must retain the above copyright
7
+ # notice, this list of conditions and the following disclaimer.
8
+ # * Redistributions in binary form must reproduce the above copyright
9
+ # notice, this list of conditions and the following disclaimer in the
10
+ # documentation and/or other materials provided with the distribution.
11
+ # * The names of the author may not be used to endorse or promote products
12
+ # derived from this software without specific prior written permission.
13
+ #
14
+ # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
15
+ # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
16
+ # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
17
+ # DISCLAIMED. IN NO EVENT SHALL patrickHVE@googlemail.com BE LIABLE FOR ANY
18
+ # DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
19
+ # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
20
+ # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
21
+ # ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22
+ # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
23
+ # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24
+
25
+ #
26
+ # sf - Sept 2010 - Modified for x64 support and merged into the stdapi extension.
27
+ #
28
+
29
+ require 'pp'
30
+ require 'enumerator'
31
+ require 'rex/post/meterpreter/extensions/stdapi/railgun/api_constants'
32
+ require 'rex/post/meterpreter/extensions/stdapi/railgun/tlv'
33
+ require 'rex/post/meterpreter/extensions/stdapi/railgun/model'
34
+ require 'rex/post/meterpreter/extensions/stdapi/railgun/multicall'
35
+
36
+ module Rex
37
+ module Post
38
+ module Meterpreter
39
+ module Extensions
40
+ module Stdapi
41
+ module Railgun
42
+
43
+ #
44
+ # The Railgun class to dynamically expose the Windows API.
45
+ #
46
+ class Railgun
47
+
48
+ def initialize( client )
49
+
50
+ @client = client
51
+ @dll = ::Hash.new
52
+
53
+ @win_consts = WinConstManager.new()
54
+
55
+ @constants_loaded = false
56
+
57
+ # Load the multi-caller
58
+ @multicaller = MultiCaller.new( @client, self, @win_consts )
59
+ end
60
+
61
+ # read data from a memory address on the host (useful for working with LPVOID parameters)
62
+ def memread( address, length )
63
+
64
+ raise "Invalid parameters." if( not address or not length )
65
+
66
+ request = Packet.create_request( 'stdapi_railgun_memread' )
67
+
68
+ request.add_tlv( TLV_TYPE_RAILGUN_MEM_ADDRESS, address )
69
+ request.add_tlv( TLV_TYPE_RAILGUN_MEM_LENGTH, length )
70
+
71
+ response = client.send_request( request )
72
+ if( response.result == 0 )
73
+ return response.get_tlv_value( TLV_TYPE_RAILGUN_MEM_DATA )
74
+ end
75
+
76
+ return nil
77
+ end
78
+
79
+ # write data to a memory address on the host (useful for working with LPVOID parameters)
80
+ def memwrite( address, data, length )
81
+
82
+ raise "Invalid parameters." if( not address or not data or not length )
83
+
84
+ request = Packet.create_request( 'stdapi_railgun_memwrite' )
85
+
86
+ request.add_tlv( TLV_TYPE_RAILGUN_MEM_ADDRESS, address )
87
+ request.add_tlv( TLV_TYPE_RAILGUN_MEM_DATA, data )
88
+ request.add_tlv( TLV_TYPE_RAILGUN_MEM_LENGTH, length )
89
+
90
+ response = client.send_request( request )
91
+ if( response.result == 0 )
92
+ return true
93
+ end
94
+
95
+ return false
96
+ end
97
+
98
+ # adds a function to an existing DLL-definition
99
+ def add_function(dll_name, function_name, return_type, params, windows_name=nil)
100
+ raise "DLL #{dll_name} not found. Known DLLs: #{PP.pp(@dll.keys, "")}" unless @dll.has_key? dll_name
101
+ @dll[dll_name].add_function(function_name, return_type, params, windows_name)
102
+ end
103
+
104
+ # adds a function to an existing DLL-definition
105
+ # you can override the dll name if you want to include a path or the DLL name contains
106
+ # non-ruby-approved characters
107
+ def add_dll(dll_name, windows_name=nil)
108
+ raise "DLL #{dll_name} already exists. Existing DLLs: #{PP.pp(@dll.keys, "")}" unless not @dll.has_key? dll_name
109
+ if( windows_name == nil )
110
+ windows_name = dll_name
111
+ end
112
+ @dll[dll_name] = DLL.new(windows_name, @client, @win_consts)
113
+ end
114
+
115
+ def get_dll( dll_name )
116
+ # sf: we now lazy load the module definitions as needed to avoid the performance hit
117
+ # to stdapi if we do it upon initilization (the user may never use railgun or else
118
+ # require only a portion of the modules exposed by railgun so no need to pre load them)
119
+ if( not @dll.has_key?( dll_name ) )
120
+
121
+ # the constants are also lazy loaded the first time we call const() or any API function...
122
+ if( not @constants_loaded )
123
+ ApiConstants.add_constants( @win_consts )
124
+ @constants_loaded = true
125
+ end
126
+
127
+ case dll_name
128
+ when 'kernel32'
129
+ require 'rex/post/meterpreter/extensions/stdapi/railgun/def/def_kernel32'
130
+ Def::Def_kernel32.add_imports(self)
131
+ when 'ntdll'
132
+ require 'rex/post/meterpreter/extensions/stdapi/railgun/def/def_ntdll'
133
+ Def::Def_ntdll.add_imports(self)
134
+ when 'user32'
135
+ require 'rex/post/meterpreter/extensions/stdapi/railgun/def/def_user32'
136
+ Def::Def_user32.add_imports(self)
137
+ when 'ws2_32'
138
+ require 'rex/post/meterpreter/extensions/stdapi/railgun/def/def_ws2_32'
139
+ Def::Def_ws2_32.add_imports(self)
140
+ when 'iphlpapi'
141
+ require 'rex/post/meterpreter/extensions/stdapi/railgun/def/def_iphlpapi'
142
+ Def::Def_iphlpapi.add_imports(self)
143
+ when 'advapi32'
144
+ require 'rex/post/meterpreter/extensions/stdapi/railgun/def/def_advapi32'
145
+ Def::Def_advapi32.add_imports(self)
146
+ when 'shell32'
147
+ require 'rex/post/meterpreter/extensions/stdapi/railgun/def/def_shell32'
148
+ Def::Def_shell32.add_imports(self)
149
+ end
150
+
151
+ if( @dll.has_key?( dll_name ) )
152
+ return @dll[dll_name]
153
+ end
154
+
155
+ else
156
+ return @dll[dll_name]
157
+ end
158
+
159
+ return nil
160
+ end
161
+
162
+ # we fake having members like user32 and kernel32.
163
+ # reason is that
164
+ # ...user32.MessageBoxW()
165
+ # is prettier than
166
+ # ...dlls["user32"].functions["MessageBoxW"]()
167
+ def method_missing(dll_symbol, *args)
168
+ dll_name = dll_symbol.to_s
169
+
170
+ self.get_dll( dll_name )
171
+
172
+ raise "DLL #{dll_name} not found. Known DLLs: #{PP.pp(@dll.keys, "")}" unless @dll.has_key? dll_name
173
+
174
+ return @dll[dll_name]
175
+ end
176
+
177
+ # Give the programmer access to constants
178
+ def const(str)
179
+ # the constants are also lazy loaded the first time we call const() or any API function...
180
+ if( not @constants_loaded )
181
+ ApiConstants.add_constants( @win_consts )
182
+ @constants_loaded = true
183
+ end
184
+ return @win_consts.parse(str)
185
+ end
186
+
187
+ # The multi-call shorthand ( ["kernel32", "ExitProcess", [0]] )
188
+ def multi(functions)
189
+ @multicaller.call(functions)
190
+ end
191
+
192
+ attr_accessor :client, :dll, :multicaller, :win_consts
193
+
194
+ end
195
+
196
+ end; end; end; end; end; end