librex 0.0.1
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.
- data/README +4 -0
- data/lib/rex.rb +101 -0
- data/lib/rex.rb.ts.rb +70 -0
- data/lib/rex/LICENSE +29 -0
- data/lib/rex/arch.rb +103 -0
- data/lib/rex/arch/sparc.rb +75 -0
- data/lib/rex/arch/sparc.rb.ut.rb +18 -0
- data/lib/rex/arch/x86.rb +513 -0
- data/lib/rex/arch/x86.rb.ut.rb +93 -0
- data/lib/rex/assembly/nasm.rb +100 -0
- data/lib/rex/assembly/nasm.rb.ut.rb +22 -0
- data/lib/rex/codepage.map +104 -0
- data/lib/rex/compat.rb +281 -0
- data/lib/rex/constants.rb +113 -0
- data/lib/rex/elfparsey.rb +11 -0
- data/lib/rex/elfparsey/elf.rb +123 -0
- data/lib/rex/elfparsey/elfbase.rb +260 -0
- data/lib/rex/elfparsey/exceptions.rb +27 -0
- data/lib/rex/elfscan.rb +12 -0
- data/lib/rex/elfscan/scanner.rb +207 -0
- data/lib/rex/elfscan/search.rb +46 -0
- data/lib/rex/encoder/alpha2.rb +31 -0
- data/lib/rex/encoder/alpha2/alpha_mixed.rb +68 -0
- data/lib/rex/encoder/alpha2/alpha_upper.rb +79 -0
- data/lib/rex/encoder/alpha2/generic.rb +113 -0
- data/lib/rex/encoder/alpha2/unicode_mixed.rb +117 -0
- data/lib/rex/encoder/alpha2/unicode_upper.rb +129 -0
- data/lib/rex/encoder/ndr.rb +89 -0
- data/lib/rex/encoder/ndr.rb.ut.rb +44 -0
- data/lib/rex/encoder/nonalpha.rb +61 -0
- data/lib/rex/encoder/nonupper.rb +64 -0
- data/lib/rex/encoder/xdr.rb +106 -0
- data/lib/rex/encoder/xdr.rb.ut.rb +29 -0
- data/lib/rex/encoder/xor.rb +69 -0
- data/lib/rex/encoder/xor/dword.rb +13 -0
- data/lib/rex/encoder/xor/dword_additive.rb +13 -0
- data/lib/rex/encoders/xor_dword.rb +35 -0
- data/lib/rex/encoders/xor_dword_additive.rb +53 -0
- data/lib/rex/encoders/xor_dword_additive.rb.ut.rb +12 -0
- data/lib/rex/encoding/xor.rb +20 -0
- data/lib/rex/encoding/xor.rb.ts.rb +14 -0
- data/lib/rex/encoding/xor/byte.rb +15 -0
- data/lib/rex/encoding/xor/byte.rb.ut.rb +21 -0
- data/lib/rex/encoding/xor/dword.rb +21 -0
- data/lib/rex/encoding/xor/dword.rb.ut.rb +15 -0
- data/lib/rex/encoding/xor/dword_additive.rb +92 -0
- data/lib/rex/encoding/xor/dword_additive.rb.ut.rb +15 -0
- data/lib/rex/encoding/xor/exceptions.rb +17 -0
- data/lib/rex/encoding/xor/generic.rb +146 -0
- data/lib/rex/encoding/xor/generic.rb.ut.rb +120 -0
- data/lib/rex/encoding/xor/qword.rb +15 -0
- data/lib/rex/encoding/xor/word.rb +21 -0
- data/lib/rex/encoding/xor/word.rb.ut.rb +13 -0
- data/lib/rex/exceptions.rb +275 -0
- data/lib/rex/exceptions.rb.ut.rb +44 -0
- data/lib/rex/exploitation/cmdstager.rb +133 -0
- data/lib/rex/exploitation/egghunter.rb +143 -0
- data/lib/rex/exploitation/egghunter.rb.ut.rb +25 -0
- data/lib/rex/exploitation/encryptjs.rb +77 -0
- data/lib/rex/exploitation/heaplib.js.b64 +331 -0
- data/lib/rex/exploitation/heaplib.rb +94 -0
- data/lib/rex/exploitation/javascriptosdetect.rb +735 -0
- data/lib/rex/exploitation/obfuscatejs.rb +335 -0
- data/lib/rex/exploitation/opcodedb.rb +818 -0
- data/lib/rex/exploitation/opcodedb.rb.ut.rb +279 -0
- data/lib/rex/exploitation/seh.rb +92 -0
- data/lib/rex/exploitation/seh.rb.ut.rb +19 -0
- data/lib/rex/file.rb +84 -0
- data/lib/rex/file.rb.ut.rb +16 -0
- data/lib/rex/image_source.rb +12 -0
- data/lib/rex/image_source/disk.rb +60 -0
- data/lib/rex/image_source/image_source.rb +46 -0
- data/lib/rex/image_source/memory.rb +37 -0
- data/lib/rex/io/bidirectional_pipe.rb +157 -0
- data/lib/rex/io/datagram_abstraction.rb +35 -0
- data/lib/rex/io/stream.rb +313 -0
- data/lib/rex/io/stream_abstraction.rb +186 -0
- data/lib/rex/io/stream_server.rb +211 -0
- data/lib/rex/job_container.rb +202 -0
- data/lib/rex/logging.rb +4 -0
- data/lib/rex/logging/log_dispatcher.rb +179 -0
- data/lib/rex/logging/log_sink.rb +42 -0
- data/lib/rex/logging/sinks/flatfile.rb +55 -0
- data/lib/rex/logging/sinks/stderr.rb +43 -0
- data/lib/rex/machparsey.rb +9 -0
- data/lib/rex/machparsey/exceptions.rb +34 -0
- data/lib/rex/machparsey/mach.rb +209 -0
- data/lib/rex/machparsey/machbase.rb +408 -0
- data/lib/rex/machscan.rb +9 -0
- data/lib/rex/machscan/scanner.rb +217 -0
- data/lib/rex/mime.rb +9 -0
- data/lib/rex/mime/header.rb +75 -0
- data/lib/rex/mime/message.rb +112 -0
- data/lib/rex/mime/part.rb +20 -0
- data/lib/rex/nop/opty2.rb +108 -0
- data/lib/rex/nop/opty2.rb.ut.rb +23 -0
- data/lib/rex/nop/opty2_tables.rb +300 -0
- data/lib/rex/ole.rb +128 -0
- data/lib/rex/ole/clsid.rb +47 -0
- data/lib/rex/ole/difat.rb +141 -0
- data/lib/rex/ole/directory.rb +230 -0
- data/lib/rex/ole/direntry.rb +240 -0
- data/lib/rex/ole/fat.rb +99 -0
- data/lib/rex/ole/header.rb +204 -0
- data/lib/rex/ole/minifat.rb +77 -0
- data/lib/rex/ole/samples/create_ole.rb +27 -0
- data/lib/rex/ole/samples/dir.rb +35 -0
- data/lib/rex/ole/samples/dump_stream.rb +34 -0
- data/lib/rex/ole/samples/ole_info.rb +23 -0
- data/lib/rex/ole/storage.rb +395 -0
- data/lib/rex/ole/stream.rb +53 -0
- data/lib/rex/ole/substorage.rb +49 -0
- data/lib/rex/ole/util.rb +157 -0
- data/lib/rex/parser/arguments.rb +97 -0
- data/lib/rex/parser/arguments.rb.ut.rb +67 -0
- data/lib/rex/parser/ini.rb +185 -0
- data/lib/rex/parser/ini.rb.ut.rb +29 -0
- data/lib/rex/parser/nmap_xml.rb +111 -0
- data/lib/rex/payloads.rb +1 -0
- data/lib/rex/payloads/win32.rb +2 -0
- data/lib/rex/payloads/win32/common.rb +26 -0
- data/lib/rex/payloads/win32/kernel.rb +53 -0
- data/lib/rex/payloads/win32/kernel/common.rb +54 -0
- data/lib/rex/payloads/win32/kernel/migration.rb +12 -0
- data/lib/rex/payloads/win32/kernel/recovery.rb +50 -0
- data/lib/rex/payloads/win32/kernel/stager.rb +171 -0
- data/lib/rex/peparsey.rb +12 -0
- data/lib/rex/peparsey/exceptions.rb +32 -0
- data/lib/rex/peparsey/pe.rb +188 -0
- data/lib/rex/peparsey/pe_memdump.rb +63 -0
- data/lib/rex/peparsey/pebase.rb +1655 -0
- data/lib/rex/peparsey/section.rb +136 -0
- data/lib/rex/pescan.rb +13 -0
- data/lib/rex/pescan/analyze.rb +309 -0
- data/lib/rex/pescan/scanner.rb +206 -0
- data/lib/rex/pescan/search.rb +56 -0
- data/lib/rex/platforms.rb +1 -0
- data/lib/rex/platforms/windows.rb +51 -0
- data/lib/rex/poly.rb +132 -0
- data/lib/rex/poly/block.rb +468 -0
- data/lib/rex/poly/register.rb +100 -0
- data/lib/rex/poly/register/x86.rb +40 -0
- data/lib/rex/post.rb +8 -0
- data/lib/rex/post/dir.rb +51 -0
- data/lib/rex/post/file.rb +172 -0
- data/lib/rex/post/file_stat.rb +220 -0
- data/lib/rex/post/gen.pl +13 -0
- data/lib/rex/post/io.rb +182 -0
- data/lib/rex/post/meterpreter.rb +4 -0
- data/lib/rex/post/meterpreter/channel.rb +438 -0
- data/lib/rex/post/meterpreter/channel_container.rb +54 -0
- data/lib/rex/post/meterpreter/channels/pool.rb +160 -0
- data/lib/rex/post/meterpreter/channels/pools/file.rb +62 -0
- data/lib/rex/post/meterpreter/channels/pools/stream_pool.rb +103 -0
- data/lib/rex/post/meterpreter/channels/stream.rb +87 -0
- data/lib/rex/post/meterpreter/client.rb +335 -0
- data/lib/rex/post/meterpreter/client_core.rb +274 -0
- data/lib/rex/post/meterpreter/dependencies.rb +3 -0
- data/lib/rex/post/meterpreter/extension.rb +32 -0
- data/lib/rex/post/meterpreter/extensions/espia/espia.rb +58 -0
- data/lib/rex/post/meterpreter/extensions/espia/tlv.rb +16 -0
- data/lib/rex/post/meterpreter/extensions/incognito/incognito.rb +94 -0
- data/lib/rex/post/meterpreter/extensions/incognito/tlv.rb +21 -0
- data/lib/rex/post/meterpreter/extensions/priv/fs.rb +118 -0
- data/lib/rex/post/meterpreter/extensions/priv/passwd.rb +61 -0
- data/lib/rex/post/meterpreter/extensions/priv/priv.rb +104 -0
- data/lib/rex/post/meterpreter/extensions/priv/tlv.rb +28 -0
- data/lib/rex/post/meterpreter/extensions/sniffer/sniffer.rb +100 -0
- data/lib/rex/post/meterpreter/extensions/sniffer/tlv.rb +24 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/constants.rb +333 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/fs/dir.rb +273 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/fs/file.rb +235 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/fs/file_stat.rb +103 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/fs/io.rb +48 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/net/config.rb +144 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/net/interface.rb +73 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/net/route.rb +56 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/net/socket.rb +137 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/net/socket_subsystem/tcp_client_channel.rb +167 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/net/socket_subsystem/tcp_server_channel.rb +167 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/net/socket_subsystem/udp_channel.rb +192 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/stdapi.rb +139 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/sys/config.rb +97 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/sys/event_log.rb +184 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/sys/event_log_subsystem/event_record.rb +41 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/sys/power.rb +61 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/sys/process.rb +361 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/image.rb +129 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/io.rb +55 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/memory.rb +336 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/thread.rb +141 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry.rb +279 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry_subsystem/registry_key.rb +182 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry_subsystem/registry_value.rb +102 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/sys/thread.rb +174 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/tlv.rb +185 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/ui.rb +227 -0
- data/lib/rex/post/meterpreter/inbound_packet_handler.rb +30 -0
- data/lib/rex/post/meterpreter/object_aliases.rb +83 -0
- data/lib/rex/post/meterpreter/packet.rb +596 -0
- data/lib/rex/post/meterpreter/packet_dispatcher.rb +409 -0
- data/lib/rex/post/meterpreter/packet_parser.rb +94 -0
- data/lib/rex/post/meterpreter/packet_response_waiter.rb +83 -0
- data/lib/rex/post/meterpreter/ui/console.rb +135 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher.rb +62 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/core.rb +595 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/espia.rb +108 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/incognito.rb +241 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv.rb +61 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv/elevate.rb +98 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv/passwd.rb +51 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv/timestomp.rb +132 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/sniffer.rb +187 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi.rb +63 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/fs.rb +376 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/net.rb +270 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/sys.rb +484 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/ui.rb +315 -0
- data/lib/rex/post/meterpreter/ui/console/interactive_channel.rb +95 -0
- data/lib/rex/post/permission.rb +26 -0
- data/lib/rex/post/process.rb +57 -0
- data/lib/rex/post/thread.rb +57 -0
- data/lib/rex/post/ui.rb +52 -0
- data/lib/rex/proto.rb +12 -0
- data/lib/rex/proto.rb.ts.rb +8 -0
- data/lib/rex/proto/dcerpc.rb +6 -0
- data/lib/rex/proto/dcerpc.rb.ts.rb +9 -0
- data/lib/rex/proto/dcerpc/client.rb +358 -0
- data/lib/rex/proto/dcerpc/client.rb.ut.rb +491 -0
- data/lib/rex/proto/dcerpc/exceptions.rb +150 -0
- data/lib/rex/proto/dcerpc/handle.rb +47 -0
- data/lib/rex/proto/dcerpc/handle.rb.ut.rb +85 -0
- data/lib/rex/proto/dcerpc/ndr.rb +72 -0
- data/lib/rex/proto/dcerpc/ndr.rb.ut.rb +41 -0
- data/lib/rex/proto/dcerpc/packet.rb +253 -0
- data/lib/rex/proto/dcerpc/packet.rb.ut.rb +56 -0
- data/lib/rex/proto/dcerpc/response.rb +186 -0
- data/lib/rex/proto/dcerpc/response.rb.ut.rb +15 -0
- data/lib/rex/proto/dcerpc/uuid.rb +84 -0
- data/lib/rex/proto/dcerpc/uuid.rb.ut.rb +46 -0
- data/lib/rex/proto/drda.rb +5 -0
- data/lib/rex/proto/drda.rb.ts.rb +17 -0
- data/lib/rex/proto/drda/constants.rb +49 -0
- data/lib/rex/proto/drda/constants.rb.ut.rb +23 -0
- data/lib/rex/proto/drda/packet.rb +252 -0
- data/lib/rex/proto/drda/packet.rb.ut.rb +109 -0
- data/lib/rex/proto/drda/utils.rb +123 -0
- data/lib/rex/proto/drda/utils.rb.ut.rb +84 -0
- data/lib/rex/proto/http.rb +5 -0
- data/lib/rex/proto/http.rb.ts.rb +12 -0
- data/lib/rex/proto/http/client.rb +817 -0
- data/lib/rex/proto/http/client.rb.ut.rb +93 -0
- data/lib/rex/proto/http/handler.rb +46 -0
- data/lib/rex/proto/http/handler/erb.rb +128 -0
- data/lib/rex/proto/http/handler/erb.rb.ut.rb +21 -0
- data/lib/rex/proto/http/handler/erb.rb.ut.rb.rhtml +1 -0
- data/lib/rex/proto/http/handler/proc.rb +54 -0
- data/lib/rex/proto/http/handler/proc.rb.ut.rb +24 -0
- data/lib/rex/proto/http/header.rb +161 -0
- data/lib/rex/proto/http/header.rb.ut.rb +46 -0
- data/lib/rex/proto/http/packet.rb +394 -0
- data/lib/rex/proto/http/packet.rb.ut.rb +165 -0
- data/lib/rex/proto/http/request.rb +356 -0
- data/lib/rex/proto/http/request.rb.ut.rb +214 -0
- data/lib/rex/proto/http/response.rb +85 -0
- data/lib/rex/proto/http/response.rb.ut.rb +149 -0
- data/lib/rex/proto/http/server.rb +367 -0
- data/lib/rex/proto/http/server.rb.ut.rb +79 -0
- data/lib/rex/proto/smb.rb +7 -0
- data/lib/rex/proto/smb.rb.ts.rb +8 -0
- data/lib/rex/proto/smb/client.rb +1733 -0
- data/lib/rex/proto/smb/client.rb.ut.rb +223 -0
- data/lib/rex/proto/smb/constants.rb +1062 -0
- data/lib/rex/proto/smb/constants.rb.ut.rb +18 -0
- data/lib/rex/proto/smb/crypt.rb +95 -0
- data/lib/rex/proto/smb/crypt.rb.ut.rb +20 -0
- data/lib/rex/proto/smb/evasions.rb +65 -0
- data/lib/rex/proto/smb/exceptions.rb +846 -0
- data/lib/rex/proto/smb/simpleclient.rb +292 -0
- data/lib/rex/proto/smb/simpleclient.rb.ut.rb +128 -0
- data/lib/rex/proto/smb/utils.rb +514 -0
- data/lib/rex/proto/smb/utils.rb.ut.rb +20 -0
- data/lib/rex/proto/sunrpc.rb +1 -0
- data/lib/rex/proto/sunrpc/client.rb +195 -0
- data/lib/rex/script.rb +42 -0
- data/lib/rex/script/base.rb +59 -0
- data/lib/rex/script/meterpreter.rb +9 -0
- data/lib/rex/script/shell.rb +9 -0
- data/lib/rex/service.rb +48 -0
- data/lib/rex/service_manager.rb +141 -0
- data/lib/rex/service_manager.rb.ut.rb +32 -0
- data/lib/rex/services/local_relay.rb +423 -0
- data/lib/rex/socket.rb +586 -0
- data/lib/rex/socket.rb.ut.rb +86 -0
- data/lib/rex/socket/comm.rb +119 -0
- data/lib/rex/socket/comm/local.rb +409 -0
- data/lib/rex/socket/comm/local.rb.ut.rb +75 -0
- data/lib/rex/socket/ip.rb +129 -0
- data/lib/rex/socket/parameters.rb +345 -0
- data/lib/rex/socket/parameters.rb.ut.rb +51 -0
- data/lib/rex/socket/range_walker.rb +295 -0
- data/lib/rex/socket/range_walker.rb.ut.rb +55 -0
- data/lib/rex/socket/ssl_tcp.rb +184 -0
- data/lib/rex/socket/ssl_tcp.rb.ut.rb +39 -0
- data/lib/rex/socket/ssl_tcp_server.rb +122 -0
- data/lib/rex/socket/ssl_tcp_server.rb.ut.rb +51 -0
- data/lib/rex/socket/subnet_walker.rb +75 -0
- data/lib/rex/socket/subnet_walker.rb.ut.rb +28 -0
- data/lib/rex/socket/switch_board.rb +272 -0
- data/lib/rex/socket/switch_board.rb.ut.rb +52 -0
- data/lib/rex/socket/tcp.rb +76 -0
- data/lib/rex/socket/tcp.rb.ut.rb +64 -0
- data/lib/rex/socket/tcp_server.rb +67 -0
- data/lib/rex/socket/tcp_server.rb.ut.rb +44 -0
- data/lib/rex/socket/udp.rb +157 -0
- data/lib/rex/socket/udp.rb.ut.rb +44 -0
- data/lib/rex/struct2.rb +5 -0
- data/lib/rex/struct2/c_struct.rb +181 -0
- data/lib/rex/struct2/c_struct_template.rb +39 -0
- data/lib/rex/struct2/constant.rb +26 -0
- data/lib/rex/struct2/element.rb +44 -0
- data/lib/rex/struct2/generic.rb +73 -0
- data/lib/rex/struct2/restraint.rb +54 -0
- data/lib/rex/struct2/s_string.rb +72 -0
- data/lib/rex/struct2/s_struct.rb +111 -0
- data/lib/rex/sync.rb +6 -0
- data/lib/rex/sync/event.rb +94 -0
- data/lib/rex/sync/read_write_lock.rb +176 -0
- data/lib/rex/sync/ref.rb +57 -0
- data/lib/rex/sync/thread_safe.rb +82 -0
- data/lib/rex/test.rb +35 -0
- data/lib/rex/text.rb +1029 -0
- data/lib/rex/text.rb.ut.rb +168 -0
- data/lib/rex/time.rb +65 -0
- data/lib/rex/transformer.rb +115 -0
- data/lib/rex/transformer.rb.ut.rb +38 -0
- data/lib/rex/ui.rb +21 -0
- data/lib/rex/ui/interactive.rb +252 -0
- data/lib/rex/ui/output.rb +80 -0
- data/lib/rex/ui/output/none.rb +18 -0
- data/lib/rex/ui/progress_tracker.rb +96 -0
- data/lib/rex/ui/subscriber.rb +149 -0
- data/lib/rex/ui/text/color.rb +97 -0
- data/lib/rex/ui/text/color.rb.ut.rb +18 -0
- data/lib/rex/ui/text/dispatcher_shell.rb +382 -0
- data/lib/rex/ui/text/input.rb +117 -0
- data/lib/rex/ui/text/input/buffer.rb +75 -0
- data/lib/rex/ui/text/input/readline.rb +129 -0
- data/lib/rex/ui/text/input/socket.rb +95 -0
- data/lib/rex/ui/text/input/stdio.rb +45 -0
- data/lib/rex/ui/text/irb_shell.rb +55 -0
- data/lib/rex/ui/text/output.rb +80 -0
- data/lib/rex/ui/text/output/buffer.rb +65 -0
- data/lib/rex/ui/text/output/file.rb +37 -0
- data/lib/rex/ui/text/output/socket.rb +43 -0
- data/lib/rex/ui/text/output/stdio.rb +40 -0
- data/lib/rex/ui/text/progress_tracker.rb +56 -0
- data/lib/rex/ui/text/progress_tracker.rb.ut.rb +34 -0
- data/lib/rex/ui/text/shell.rb +321 -0
- data/lib/rex/ui/text/table.rb +254 -0
- data/lib/rex/ui/text/table.rb.ut.rb +55 -0
- data/lib/rex/zip.rb +93 -0
- data/lib/rex/zip/archive.rb +91 -0
- data/lib/rex/zip/blocks.rb +182 -0
- data/lib/rex/zip/entry.rb +95 -0
- data/lib/rex/zip/samples/comment.rb +32 -0
- data/lib/rex/zip/samples/mkwar.rb +138 -0
- data/lib/rex/zip/samples/mkzip.rb +19 -0
- data/lib/rex/zip/samples/recursive.rb +58 -0
- metadata +435 -0
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
|
|
3
|
+
require 'rex/post/meterpreter/client'
|
|
4
|
+
require 'rex/post/meterpreter/extensions/stdapi/constants'
|
|
5
|
+
|
|
6
|
+
module Rex
|
|
7
|
+
module Post
|
|
8
|
+
module Meterpreter
|
|
9
|
+
module Extensions
|
|
10
|
+
module Stdapi
|
|
11
|
+
module Sys
|
|
12
|
+
module ProcessSubsystem
|
|
13
|
+
|
|
14
|
+
###
|
|
15
|
+
#
|
|
16
|
+
# This class provides an input/output interface to an executed
|
|
17
|
+
# process' standard input and output.
|
|
18
|
+
#
|
|
19
|
+
###
|
|
20
|
+
class IO
|
|
21
|
+
|
|
22
|
+
##
|
|
23
|
+
#
|
|
24
|
+
# Constructor
|
|
25
|
+
#
|
|
26
|
+
##
|
|
27
|
+
|
|
28
|
+
#
|
|
29
|
+
# Initializes the IO instance.
|
|
30
|
+
#
|
|
31
|
+
def initialize(process)
|
|
32
|
+
self.process = process
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
#
|
|
36
|
+
# Writes the supplied buffer to the standard input handle of the
|
|
37
|
+
# executed process.
|
|
38
|
+
#
|
|
39
|
+
def write(buf)
|
|
40
|
+
return process.channel.write(buf)
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
#
|
|
44
|
+
# Reads data from the standard output handle of the executed process.
|
|
45
|
+
#
|
|
46
|
+
def read(length = nil)
|
|
47
|
+
return process.channel.read(length)
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
protected
|
|
51
|
+
attr_accessor :process # :nodoc:
|
|
52
|
+
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
end; end; end; end; end; end; end
|
|
@@ -0,0 +1,336 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
|
|
3
|
+
require 'rex/post/meterpreter/client'
|
|
4
|
+
require 'rex/post/meterpreter/extensions/stdapi/constants'
|
|
5
|
+
|
|
6
|
+
module Rex
|
|
7
|
+
module Post
|
|
8
|
+
module Meterpreter
|
|
9
|
+
module Extensions
|
|
10
|
+
module Stdapi
|
|
11
|
+
module Sys
|
|
12
|
+
module ProcessSubsystem
|
|
13
|
+
|
|
14
|
+
###
|
|
15
|
+
#
|
|
16
|
+
# Provides an interface to allocate, free, read, write, query,
|
|
17
|
+
# protect, lock, and unlock memory in the context of a given
|
|
18
|
+
# process.
|
|
19
|
+
#
|
|
20
|
+
###
|
|
21
|
+
class Memory
|
|
22
|
+
|
|
23
|
+
# Page protection translation hash
|
|
24
|
+
@@page_protection_map =
|
|
25
|
+
{
|
|
26
|
+
PROT_NONE => PAGE_NOACCESS,
|
|
27
|
+
PROT_EXEC => PAGE_EXECUTE,
|
|
28
|
+
PROT_EXEC | PROT_READ => PAGE_EXECUTE_READ,
|
|
29
|
+
PROT_EXEC | PROT_READ |
|
|
30
|
+
PROT_WRITE => PAGE_EXECUTE_READWRITE,
|
|
31
|
+
PROT_EXEC | PROT_READ |
|
|
32
|
+
PROT_WRITE | PROT_COW => PAGE_EXECUTE_WRITECOPY,
|
|
33
|
+
PROT_READ => PAGE_READONLY,
|
|
34
|
+
PROT_READ | PROT_WRITE => PAGE_READWRITE,
|
|
35
|
+
PROT_READ | PROT_WRITE |
|
|
36
|
+
PROT_COW => PAGE_WRITECOPY,
|
|
37
|
+
PROT_WRITE => PAGE_READWRITE
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
##
|
|
41
|
+
#
|
|
42
|
+
# Constructor
|
|
43
|
+
#
|
|
44
|
+
##
|
|
45
|
+
|
|
46
|
+
#
|
|
47
|
+
# Initializes a memory modification instance with the supplied process
|
|
48
|
+
# instance.
|
|
49
|
+
#
|
|
50
|
+
def initialize(process)
|
|
51
|
+
self.process = process
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
#
|
|
55
|
+
# Allocate storage of the supplied length and returns the
|
|
56
|
+
# address at which the memory was allocated.
|
|
57
|
+
#
|
|
58
|
+
def allocate(length, protection = nil, base = nil)
|
|
59
|
+
allocation_type = MEM_COMMIT
|
|
60
|
+
|
|
61
|
+
# If no protection was supplied, default to the most flexible
|
|
62
|
+
if (protection == nil)
|
|
63
|
+
protection = PAGE_EXECUTE_READWRITE
|
|
64
|
+
else
|
|
65
|
+
protection = gen_prot_to_specific(protection)
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
# If the preferred base is non-nil, set the reserve flag
|
|
69
|
+
if (base != nil)
|
|
70
|
+
allocation_type |= MEM_RESERVE
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
return _allocate(base, length, allocation_type, protection)
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
#
|
|
77
|
+
# Low-level memory allocation.
|
|
78
|
+
#
|
|
79
|
+
def _allocate(base, length, allocation_type, protection)
|
|
80
|
+
request = Packet.create_request('stdapi_sys_process_memory_allocate')
|
|
81
|
+
|
|
82
|
+
# Populate the request
|
|
83
|
+
if (base != nil)
|
|
84
|
+
request.add_tlv(TLV_TYPE_BASE_ADDRESS, base)
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
request.add_tlv(TLV_TYPE_HANDLE, process.handle)
|
|
88
|
+
request.add_tlv(TLV_TYPE_LENGTH, length)
|
|
89
|
+
request.add_tlv(TLV_TYPE_ALLOCATION_TYPE, allocation_type)
|
|
90
|
+
request.add_tlv(TLV_TYPE_PROTECTION, protection)
|
|
91
|
+
|
|
92
|
+
# Transmit the request
|
|
93
|
+
response = process.client.send_request(request);
|
|
94
|
+
|
|
95
|
+
return response.get_tlv_value(TLV_TYPE_BASE_ADDRESS)
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
#
|
|
99
|
+
# Deallocate a region of memory in the context of a process.
|
|
100
|
+
#
|
|
101
|
+
def free(base, length = 0)
|
|
102
|
+
return _free(base, length)
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
#
|
|
106
|
+
# Low-level memory deallocation.
|
|
107
|
+
#
|
|
108
|
+
def _free(base, length)
|
|
109
|
+
request = Packet.create_request('stdapi_sys_process_memory_free')
|
|
110
|
+
|
|
111
|
+
request.add_tlv(TLV_TYPE_HANDLE, process.handle)
|
|
112
|
+
request.add_tlv(TLV_TYPE_BASE_ADDRESS, base)
|
|
113
|
+
request.add_tlv(TLV_TYPE_LENGTH, length)
|
|
114
|
+
|
|
115
|
+
response = process.client.send_request(request)
|
|
116
|
+
|
|
117
|
+
return true
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
#
|
|
121
|
+
# Read memory from the context of a process and return the buffer.
|
|
122
|
+
#
|
|
123
|
+
def read(base, length)
|
|
124
|
+
request = Packet.create_request('stdapi_sys_process_memory_read')
|
|
125
|
+
|
|
126
|
+
request.add_tlv(TLV_TYPE_HANDLE, process.handle)
|
|
127
|
+
request.add_tlv(TLV_TYPE_BASE_ADDRESS, base)
|
|
128
|
+
request.add_tlv(TLV_TYPE_LENGTH, length)
|
|
129
|
+
|
|
130
|
+
response = process.client.send_request(request)
|
|
131
|
+
|
|
132
|
+
return response.get_tlv_value(TLV_TYPE_PROCESS_MEMORY)
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
#
|
|
136
|
+
# Write memory to the context of a process and return the number of bytes
|
|
137
|
+
# actually written.
|
|
138
|
+
#
|
|
139
|
+
def write(base, data)
|
|
140
|
+
request = Packet.create_request('stdapi_sys_process_memory_write')
|
|
141
|
+
|
|
142
|
+
request.add_tlv(TLV_TYPE_HANDLE, process.handle)
|
|
143
|
+
request.add_tlv(TLV_TYPE_BASE_ADDRESS, base)
|
|
144
|
+
request.add_tlv(TLV_TYPE_PROCESS_MEMORY, data)
|
|
145
|
+
|
|
146
|
+
response = process.client.send_request(request)
|
|
147
|
+
|
|
148
|
+
return response.get_tlv_value(TLV_TYPE_LENGTH)
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
#
|
|
152
|
+
# Queries an address for information about its state.
|
|
153
|
+
#
|
|
154
|
+
def query(base)
|
|
155
|
+
request = Packet.create_request('stdapi_sys_process_memory_query')
|
|
156
|
+
|
|
157
|
+
request.add_tlv(TLV_TYPE_HANDLE, process.handle)
|
|
158
|
+
request.add_tlv(TLV_TYPE_BASE_ADDRESS, base)
|
|
159
|
+
|
|
160
|
+
response = process.client.send_request(request)
|
|
161
|
+
|
|
162
|
+
# Build out the hash from the response information
|
|
163
|
+
info = {}
|
|
164
|
+
|
|
165
|
+
info['BaseAddress'] = response.get_tlv_value(TLV_TYPE_BASE_ADDRESS)
|
|
166
|
+
info['AllocationBase'] = response.get_tlv_value(TLV_TYPE_ALLOC_BASE_ADDRESS)
|
|
167
|
+
info['AllocationProtect'] = specific_prot_to_gen(response.get_tlv_value(TLV_TYPE_ALLOC_PROTECTION))
|
|
168
|
+
info['RegionSize'] = response.get_tlv_value(TLV_TYPE_LENGTH)
|
|
169
|
+
|
|
170
|
+
# Translate the memory state
|
|
171
|
+
state = response.get_tlv_value(TLV_TYPE_MEMORY_STATE)
|
|
172
|
+
|
|
173
|
+
if (state == MEM_FREE)
|
|
174
|
+
info['Available'] = true
|
|
175
|
+
elsif (state == MEM_COMMIT)
|
|
176
|
+
info['Available'] = false
|
|
177
|
+
elsif (state == MEM_RESERVE)
|
|
178
|
+
info['Reserved'] = true
|
|
179
|
+
end
|
|
180
|
+
|
|
181
|
+
# Translate the region protections
|
|
182
|
+
info['Protect'] = specific_prot_to_gen(response.get_tlv_value(TLV_TYPE_PROTECTION))
|
|
183
|
+
|
|
184
|
+
# Translate the memory type
|
|
185
|
+
type = response.get_tlv_value(TLV_TYPE_MEMORY_TYPE)
|
|
186
|
+
|
|
187
|
+
if (type == MEM_IMAGE)
|
|
188
|
+
info['ImageMapping'] = true
|
|
189
|
+
elsif (type == MEM_MAPPED)
|
|
190
|
+
info['MemoryMapping'] = true
|
|
191
|
+
elsif (type == MEM_PRIVATE)
|
|
192
|
+
info['PrivateMapping'] = true
|
|
193
|
+
end
|
|
194
|
+
|
|
195
|
+
return info
|
|
196
|
+
end
|
|
197
|
+
|
|
198
|
+
#
|
|
199
|
+
# Change the protection masks on the region supplied in base.
|
|
200
|
+
#
|
|
201
|
+
def protect(base, length = nil, protection = nil)
|
|
202
|
+
request = Packet.create_request('stdapi_sys_process_memory_protect')
|
|
203
|
+
|
|
204
|
+
if (length == nil)
|
|
205
|
+
length = 4096
|
|
206
|
+
end
|
|
207
|
+
|
|
208
|
+
# If no protection was supplied, default to the most flexible
|
|
209
|
+
if (protection == nil)
|
|
210
|
+
protection = PAGE_EXECUTE_READWRITE
|
|
211
|
+
else
|
|
212
|
+
protection = gen_prot_to_specific(protection)
|
|
213
|
+
end
|
|
214
|
+
|
|
215
|
+
request.add_tlv(TLV_TYPE_HANDLE, process.handle)
|
|
216
|
+
request.add_tlv(TLV_TYPE_BASE_ADDRESS, base)
|
|
217
|
+
request.add_tlv(TLV_TYPE_LENGTH, length)
|
|
218
|
+
request.add_tlv(TLV_TYPE_PROTECTION, protection)
|
|
219
|
+
|
|
220
|
+
# Send the request
|
|
221
|
+
response = process.client.send_request(request)
|
|
222
|
+
|
|
223
|
+
# Return the old protection to the caller
|
|
224
|
+
return specific_prot_to_gen(response.get_tlv_value(TLV_TYPE_PROTECTION))
|
|
225
|
+
end
|
|
226
|
+
|
|
227
|
+
#
|
|
228
|
+
# Lock a region of memory into physical memory so that it can't be
|
|
229
|
+
# swapped to disk. This can only be done in the context of the
|
|
230
|
+
# process that is running the meterpreter server. The instance's
|
|
231
|
+
# handle is ignored.
|
|
232
|
+
#
|
|
233
|
+
def lock(base, length)
|
|
234
|
+
request = Packet.create_request('stdapi_sys_process_memory_lock')
|
|
235
|
+
|
|
236
|
+
request.add_tlv(TLV_TYPE_BASE_ADDRESS, base)
|
|
237
|
+
request.add_tlv(TLV_TYPE_LENGTH, length)
|
|
238
|
+
|
|
239
|
+
response = process.client.send_request(request)
|
|
240
|
+
|
|
241
|
+
return true
|
|
242
|
+
end
|
|
243
|
+
|
|
244
|
+
#
|
|
245
|
+
# Unloock a region of memory into physical memory so that it can be
|
|
246
|
+
# swapped to disk. This can only be done in the context of the
|
|
247
|
+
# process that is running the meterpreter server. The instance's
|
|
248
|
+
# handle is ignored.
|
|
249
|
+
#
|
|
250
|
+
def unlock(base, length)
|
|
251
|
+
request = Packet.create_request('stdapi_sys_process_memory_unlock')
|
|
252
|
+
|
|
253
|
+
request.add_tlv(TLV_TYPE_BASE_ADDRESS, base)
|
|
254
|
+
request.add_tlv(TLV_TYPE_LENGTH, length)
|
|
255
|
+
|
|
256
|
+
response = process.client.send_request(request)
|
|
257
|
+
|
|
258
|
+
return true
|
|
259
|
+
end
|
|
260
|
+
|
|
261
|
+
|
|
262
|
+
##
|
|
263
|
+
#
|
|
264
|
+
# Conditionals
|
|
265
|
+
#
|
|
266
|
+
##
|
|
267
|
+
|
|
268
|
+
#
|
|
269
|
+
# Check to see if an address is readable.
|
|
270
|
+
#
|
|
271
|
+
def readable?(base)
|
|
272
|
+
info = nil
|
|
273
|
+
|
|
274
|
+
begin
|
|
275
|
+
info = query(base)
|
|
276
|
+
rescue
|
|
277
|
+
end
|
|
278
|
+
|
|
279
|
+
if ((info != nil) &&
|
|
280
|
+
(info['Available'] == false) &&
|
|
281
|
+
(info['Protect'] & PROT_READ == PROT_READ))
|
|
282
|
+
return true
|
|
283
|
+
end
|
|
284
|
+
|
|
285
|
+
return false
|
|
286
|
+
end
|
|
287
|
+
|
|
288
|
+
#
|
|
289
|
+
# Check to see if an address is writable.
|
|
290
|
+
#
|
|
291
|
+
def writable?(base)
|
|
292
|
+
info = nil
|
|
293
|
+
|
|
294
|
+
begin
|
|
295
|
+
info = query(base)
|
|
296
|
+
rescue
|
|
297
|
+
end
|
|
298
|
+
|
|
299
|
+
if ((info != nil) &&
|
|
300
|
+
(info['Available'] == false) &&
|
|
301
|
+
(info['Protect'] & PROT_WRITE == PROT_WRITE))
|
|
302
|
+
return true
|
|
303
|
+
end
|
|
304
|
+
|
|
305
|
+
return false
|
|
306
|
+
end
|
|
307
|
+
|
|
308
|
+
protected
|
|
309
|
+
|
|
310
|
+
#
|
|
311
|
+
# Translates general protection flags to specific protection flags.
|
|
312
|
+
#
|
|
313
|
+
def gen_prot_to_specific(prot)
|
|
314
|
+
if (prot == nil)
|
|
315
|
+
return PAGE_READ
|
|
316
|
+
end
|
|
317
|
+
|
|
318
|
+
return @@page_protection_map[prot]
|
|
319
|
+
end
|
|
320
|
+
|
|
321
|
+
#
|
|
322
|
+
# Translates specific protection flags to general protection flags.
|
|
323
|
+
#
|
|
324
|
+
def specific_prot_to_gen(prot)
|
|
325
|
+
|
|
326
|
+
if (prot == nil)
|
|
327
|
+
return PAGE_READONLY
|
|
328
|
+
end
|
|
329
|
+
|
|
330
|
+
return @@page_protection_map.invert[prot]
|
|
331
|
+
end
|
|
332
|
+
|
|
333
|
+
attr_accessor :process # :nodoc:
|
|
334
|
+
end
|
|
335
|
+
|
|
336
|
+
end; end; end; end; end; end; end
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
|
|
3
|
+
require 'rex/post/meterpreter/client'
|
|
4
|
+
require 'rex/post/meterpreter/extensions/stdapi/constants'
|
|
5
|
+
require 'rex/post/meterpreter/extensions/stdapi/sys/thread'
|
|
6
|
+
|
|
7
|
+
module Rex
|
|
8
|
+
module Post
|
|
9
|
+
module Meterpreter
|
|
10
|
+
module Extensions
|
|
11
|
+
module Stdapi
|
|
12
|
+
module Sys
|
|
13
|
+
module ProcessSubsystem
|
|
14
|
+
|
|
15
|
+
###
|
|
16
|
+
#
|
|
17
|
+
# Interfaces with a process' executing threads by enumerating,
|
|
18
|
+
# opening, and creating threads.
|
|
19
|
+
#
|
|
20
|
+
###
|
|
21
|
+
class Thread
|
|
22
|
+
|
|
23
|
+
##
|
|
24
|
+
#
|
|
25
|
+
# Constructor
|
|
26
|
+
#
|
|
27
|
+
##
|
|
28
|
+
|
|
29
|
+
#
|
|
30
|
+
# Initializes a thread instance that operates in the context of the
|
|
31
|
+
# supplied process instance.
|
|
32
|
+
#
|
|
33
|
+
def initialize(process)
|
|
34
|
+
self.process = process
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
##
|
|
38
|
+
#
|
|
39
|
+
# Process thread interaction
|
|
40
|
+
#
|
|
41
|
+
##
|
|
42
|
+
|
|
43
|
+
#
|
|
44
|
+
# Opens an existing thread that is running within the context
|
|
45
|
+
# of the process and returns a Sys::Thread instance.
|
|
46
|
+
#
|
|
47
|
+
def open(tid, access = THREAD_ALL)
|
|
48
|
+
request = Packet.create_request('stdapi_sys_process_thread_open')
|
|
49
|
+
real = 0
|
|
50
|
+
|
|
51
|
+
# Translate access
|
|
52
|
+
if (access & THREAD_READ)
|
|
53
|
+
real |= THREAD_GET_CONTEXT | THREAD_QUERY_INFORMATION | SYNCHRONIZE
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
if (access & THREAD_WRITE)
|
|
57
|
+
real |= THREAD_SET_CONTEXT | THREAD_SET_INFORMATION | THREAD_SET_THREAD_TOKEN | THREAD_IMPERSONATE | THREAD_DIRECT_IMPERSONATION
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
if (access & THREAD_EXECUTE)
|
|
61
|
+
real |= THREAD_TERMINATE | THREAD_SUSPEND_RESUME | SYNCHRONIZE
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
# Add the thread identifier and permissions
|
|
65
|
+
request.add_tlv(TLV_TYPE_THREAD_ID, tid)
|
|
66
|
+
request.add_tlv(TLV_TYPE_THREAD_PERMS, real)
|
|
67
|
+
|
|
68
|
+
# Transmit the request
|
|
69
|
+
response = process.client.send_request(request)
|
|
70
|
+
|
|
71
|
+
# Create a thread class instance
|
|
72
|
+
return Rex::Post::Meterpreter::Extensions::Stdapi::Sys::Thread.new(
|
|
73
|
+
process, response.get_tlv_value(TLV_TYPE_THREAD_HANDLE), tid)
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
#
|
|
77
|
+
# Creates a new thread in the context of the process and
|
|
78
|
+
# returns a Sys::Thread instance.
|
|
79
|
+
#
|
|
80
|
+
def create(entry, parameter = nil, suspended = false)
|
|
81
|
+
request = Packet.create_request('stdapi_sys_process_thread_create')
|
|
82
|
+
creation_flags = 0
|
|
83
|
+
|
|
84
|
+
request.add_tlv(TLV_TYPE_PROCESS_HANDLE, process.handle)
|
|
85
|
+
request.add_tlv(TLV_TYPE_ENTRY_POINT, entry)
|
|
86
|
+
|
|
87
|
+
# Are we passing a parameter to the entry point of the thread?
|
|
88
|
+
if (parameter != nil)
|
|
89
|
+
request.add_tlv(TLV_TYPE_ENTRY_PARAMETER, parameter)
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
# Should we create the thread suspended?
|
|
93
|
+
if (suspended)
|
|
94
|
+
creation_flags |= CREATE_SUSPENDED
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
request.add_tlv(TLV_TYPE_CREATION_FLAGS, creation_flags)
|
|
98
|
+
|
|
99
|
+
# Transmit the request
|
|
100
|
+
response = process.client.send_request(request)
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
thread_id = response.get_tlv_value(TLV_TYPE_THREAD_ID)
|
|
104
|
+
thread_handle = response.get_tlv_value(TLV_TYPE_THREAD_HANDLE)
|
|
105
|
+
|
|
106
|
+
# Create a thread class instance
|
|
107
|
+
return Rex::Post::Meterpreter::Extensions::Stdapi::Sys::Thread.new(
|
|
108
|
+
process, thread_handle, thread_id)
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
#
|
|
112
|
+
# Enumerate through each thread identifier.
|
|
113
|
+
#
|
|
114
|
+
def each_thread(&block)
|
|
115
|
+
get_threads.each(&block)
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
#
|
|
119
|
+
# Returns an array of thread identifiers.
|
|
120
|
+
#
|
|
121
|
+
def get_threads
|
|
122
|
+
request = Packet.create_request('stdapi_sys_process_thread_get_threads')
|
|
123
|
+
threads = []
|
|
124
|
+
|
|
125
|
+
request.add_tlv(TLV_TYPE_PID, process.pid)
|
|
126
|
+
|
|
127
|
+
response = process.client.send_request(request)
|
|
128
|
+
|
|
129
|
+
response.each(TLV_TYPE_THREAD_ID) { |thr|
|
|
130
|
+
threads << thr.value
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
return threads
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
protected
|
|
137
|
+
attr_accessor :process # :nodoc:
|
|
138
|
+
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
end; end; end; end; end; end; end
|