dstruct 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.
- checksums.yaml +15 -0
- data/README.markdown +23 -0
- data/examples/smb_example.rb +35 -0
- data/lib/rex.rb +108 -0
- data/lib/rex/LICENSE +29 -0
- data/lib/rex/arch.rb +104 -0
- data/lib/rex/arch/sparc.rb +75 -0
- data/lib/rex/arch/x86.rb +524 -0
- data/lib/rex/assembly/nasm.rb +104 -0
- data/lib/rex/codepage.map +104 -0
- data/lib/rex/compat.rb +389 -0
- data/lib/rex/constants.rb +124 -0
- data/lib/rex/elfparsey.rb +9 -0
- data/lib/rex/elfparsey/elf.rb +121 -0
- data/lib/rex/elfparsey/elfbase.rb +256 -0
- data/lib/rex/elfparsey/exceptions.rb +25 -0
- data/lib/rex/elfscan.rb +10 -0
- data/lib/rex/elfscan/scanner.rb +226 -0
- data/lib/rex/elfscan/search.rb +44 -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 +90 -0
- data/lib/rex/encoder/alpha2/unicode_mixed.rb +116 -0
- data/lib/rex/encoder/alpha2/unicode_upper.rb +123 -0
- data/lib/rex/encoder/bloxor/bloxor.rb +327 -0
- data/lib/rex/encoder/ndr.rb +90 -0
- data/lib/rex/encoder/nonalpha.rb +61 -0
- data/lib/rex/encoder/nonupper.rb +64 -0
- data/lib/rex/encoder/xdr.rb +107 -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/encoding/xor.rb +20 -0
- data/lib/rex/encoding/xor/byte.rb +15 -0
- data/lib/rex/encoding/xor/dword.rb +21 -0
- data/lib/rex/encoding/xor/dword_additive.rb +92 -0
- data/lib/rex/encoding/xor/exceptions.rb +17 -0
- data/lib/rex/encoding/xor/generic.rb +146 -0
- data/lib/rex/encoding/xor/qword.rb +15 -0
- data/lib/rex/encoding/xor/word.rb +21 -0
- data/lib/rex/exceptions.rb +275 -0
- data/lib/rex/exploitation/cmdstager.rb +10 -0
- data/lib/rex/exploitation/cmdstager/base.rb +190 -0
- data/lib/rex/exploitation/cmdstager/bourne.rb +105 -0
- data/lib/rex/exploitation/cmdstager/debug_asm.rb +140 -0
- data/lib/rex/exploitation/cmdstager/debug_write.rb +134 -0
- data/lib/rex/exploitation/cmdstager/echo.rb +164 -0
- data/lib/rex/exploitation/cmdstager/printf.rb +122 -0
- data/lib/rex/exploitation/cmdstager/tftp.rb +71 -0
- data/lib/rex/exploitation/cmdstager/vbs.rb +126 -0
- data/lib/rex/exploitation/egghunter.rb +425 -0
- data/lib/rex/exploitation/encryptjs.rb +78 -0
- data/lib/rex/exploitation/heaplib.js.b64 +331 -0
- data/lib/rex/exploitation/heaplib.rb +107 -0
- data/lib/rex/exploitation/js.rb +6 -0
- data/lib/rex/exploitation/js/detect.rb +69 -0
- data/lib/rex/exploitation/js/memory.rb +81 -0
- data/lib/rex/exploitation/js/network.rb +84 -0
- data/lib/rex/exploitation/js/utils.rb +33 -0
- data/lib/rex/exploitation/jsobfu.rb +513 -0
- data/lib/rex/exploitation/obfuscatejs.rb +336 -0
- data/lib/rex/exploitation/omelet.rb +321 -0
- data/lib/rex/exploitation/opcodedb.rb +819 -0
- data/lib/rex/exploitation/powershell.rb +62 -0
- data/lib/rex/exploitation/powershell/function.rb +63 -0
- data/lib/rex/exploitation/powershell/obfu.rb +98 -0
- data/lib/rex/exploitation/powershell/output.rb +151 -0
- data/lib/rex/exploitation/powershell/param.rb +23 -0
- data/lib/rex/exploitation/powershell/parser.rb +183 -0
- data/lib/rex/exploitation/powershell/psh_methods.rb +70 -0
- data/lib/rex/exploitation/powershell/script.rb +99 -0
- data/lib/rex/exploitation/ropdb.rb +190 -0
- data/lib/rex/exploitation/seh.rb +93 -0
- data/lib/rex/file.rb +160 -0
- data/lib/rex/image_source.rb +10 -0
- data/lib/rex/image_source/disk.rb +58 -0
- data/lib/rex/image_source/image_source.rb +44 -0
- data/lib/rex/image_source/memory.rb +35 -0
- data/lib/rex/io/bidirectional_pipe.rb +161 -0
- data/lib/rex/io/datagram_abstraction.rb +35 -0
- data/lib/rex/io/ring_buffer.rb +369 -0
- data/lib/rex/io/stream.rb +312 -0
- data/lib/rex/io/stream_abstraction.rb +209 -0
- data/lib/rex/io/stream_server.rb +221 -0
- data/lib/rex/job_container.rb +200 -0
- data/lib/rex/logging.rb +4 -0
- data/lib/rex/logging/log_dispatcher.rb +180 -0
- data/lib/rex/logging/log_sink.rb +43 -0
- data/lib/rex/logging/sinks/flatfile.rb +56 -0
- data/lib/rex/logging/sinks/stderr.rb +44 -0
- data/lib/rex/mac_oui.rb +16581 -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 +10 -0
- data/lib/rex/mime/encoding.rb +17 -0
- data/lib/rex/mime/header.rb +78 -0
- data/lib/rex/mime/message.rb +150 -0
- data/lib/rex/mime/part.rb +50 -0
- data/lib/rex/nop/opty2.rb +109 -0
- data/lib/rex/nop/opty2_tables.rb +301 -0
- data/lib/rex/ole.rb +202 -0
- data/lib/rex/ole/clsid.rb +44 -0
- data/lib/rex/ole/difat.rb +138 -0
- data/lib/rex/ole/directory.rb +228 -0
- data/lib/rex/ole/direntry.rb +237 -0
- data/lib/rex/ole/docs/dependencies.txt +8 -0
- data/lib/rex/ole/docs/references.txt +1 -0
- data/lib/rex/ole/fat.rb +96 -0
- data/lib/rex/ole/header.rb +201 -0
- data/lib/rex/ole/minifat.rb +74 -0
- data/lib/rex/ole/propset.rb +141 -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 +392 -0
- data/lib/rex/ole/stream.rb +50 -0
- data/lib/rex/ole/substorage.rb +46 -0
- data/lib/rex/ole/util.rb +154 -0
- data/lib/rex/parser/acunetix_nokogiri.rb +406 -0
- data/lib/rex/parser/apple_backup_manifestdb.rb +132 -0
- data/lib/rex/parser/appscan_nokogiri.rb +367 -0
- data/lib/rex/parser/arguments.rb +108 -0
- data/lib/rex/parser/burp_session_nokogiri.rb +291 -0
- data/lib/rex/parser/ci_nokogiri.rb +193 -0
- data/lib/rex/parser/foundstone_nokogiri.rb +342 -0
- data/lib/rex/parser/fusionvm_nokogiri.rb +109 -0
- data/lib/rex/parser/group_policy_preferences.rb +185 -0
- data/lib/rex/parser/ini.rb +186 -0
- data/lib/rex/parser/ip360_aspl_xml.rb +103 -0
- data/lib/rex/parser/ip360_xml.rb +98 -0
- data/lib/rex/parser/mbsa_nokogiri.rb +256 -0
- data/lib/rex/parser/nessus_xml.rb +121 -0
- data/lib/rex/parser/netsparker_xml.rb +109 -0
- data/lib/rex/parser/nexpose_raw_nokogiri.rb +686 -0
- data/lib/rex/parser/nexpose_simple_nokogiri.rb +330 -0
- data/lib/rex/parser/nexpose_xml.rb +172 -0
- data/lib/rex/parser/nmap_nokogiri.rb +394 -0
- data/lib/rex/parser/nmap_xml.rb +166 -0
- data/lib/rex/parser/nokogiri_doc_mixin.rb +233 -0
- data/lib/rex/parser/openvas_nokogiri.rb +172 -0
- data/lib/rex/parser/outpost24_nokogiri.rb +240 -0
- data/lib/rex/parser/retina_xml.rb +110 -0
- data/lib/rex/parser/unattend.rb +171 -0
- data/lib/rex/parser/wapiti_nokogiri.rb +105 -0
- data/lib/rex/payloads.rb +2 -0
- data/lib/rex/payloads/win32.rb +3 -0
- data/lib/rex/payloads/win32/common.rb +27 -0
- data/lib/rex/payloads/win32/kernel.rb +54 -0
- data/lib/rex/payloads/win32/kernel/common.rb +55 -0
- data/lib/rex/payloads/win32/kernel/migration.rb +13 -0
- data/lib/rex/payloads/win32/kernel/recovery.rb +51 -0
- data/lib/rex/payloads/win32/kernel/stager.rb +195 -0
- data/lib/rex/peparsey.rb +10 -0
- data/lib/rex/peparsey/exceptions.rb +30 -0
- data/lib/rex/peparsey/pe.rb +210 -0
- data/lib/rex/peparsey/pe_memdump.rb +61 -0
- data/lib/rex/peparsey/pebase.rb +1662 -0
- data/lib/rex/peparsey/section.rb +128 -0
- data/lib/rex/pescan.rb +11 -0
- data/lib/rex/pescan/analyze.rb +366 -0
- data/lib/rex/pescan/scanner.rb +230 -0
- data/lib/rex/pescan/search.rb +68 -0
- data/lib/rex/platforms.rb +2 -0
- data/lib/rex/platforms/windows.rb +52 -0
- data/lib/rex/poly.rb +134 -0
- data/lib/rex/poly/block.rb +480 -0
- data/lib/rex/poly/machine.rb +13 -0
- data/lib/rex/poly/machine/machine.rb +830 -0
- data/lib/rex/poly/machine/x86.rb +509 -0
- data/lib/rex/poly/register.rb +101 -0
- data/lib/rex/poly/register/x86.rb +41 -0
- data/lib/rex/post.rb +7 -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 +5 -0
- data/lib/rex/post/meterpreter/channel.rb +446 -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 +483 -0
- data/lib/rex/post/meterpreter/client_core.rb +352 -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/android/android.rb +128 -0
- data/lib/rex/post/meterpreter/extensions/android/tlv.rb +40 -0
- data/lib/rex/post/meterpreter/extensions/espia/espia.rb +58 -0
- data/lib/rex/post/meterpreter/extensions/espia/tlv.rb +17 -0
- data/lib/rex/post/meterpreter/extensions/extapi/adsi/adsi.rb +71 -0
- data/lib/rex/post/meterpreter/extensions/extapi/clipboard/clipboard.rb +169 -0
- data/lib/rex/post/meterpreter/extensions/extapi/extapi.rb +45 -0
- data/lib/rex/post/meterpreter/extensions/extapi/service/service.rb +104 -0
- data/lib/rex/post/meterpreter/extensions/extapi/tlv.rb +77 -0
- data/lib/rex/post/meterpreter/extensions/extapi/window/window.rb +56 -0
- data/lib/rex/post/meterpreter/extensions/extapi/wmi/wmi.rb +75 -0
- data/lib/rex/post/meterpreter/extensions/incognito/incognito.rb +94 -0
- data/lib/rex/post/meterpreter/extensions/incognito/tlv.rb +22 -0
- data/lib/rex/post/meterpreter/extensions/kiwi/kiwi.rb +361 -0
- data/lib/rex/post/meterpreter/extensions/kiwi/tlv.rb +76 -0
- data/lib/rex/post/meterpreter/extensions/lanattacks/dhcp/dhcp.rb +78 -0
- data/lib/rex/post/meterpreter/extensions/lanattacks/lanattacks.rb +43 -0
- data/lib/rex/post/meterpreter/extensions/lanattacks/tftp/tftp.rb +49 -0
- data/lib/rex/post/meterpreter/extensions/lanattacks/tlv.rb +17 -0
- data/lib/rex/post/meterpreter/extensions/mimikatz/mimikatz.rb +128 -0
- data/lib/rex/post/meterpreter/extensions/mimikatz/tlv.rb +16 -0
- data/lib/rex/post/meterpreter/extensions/networkpug/networkpug.rb +57 -0
- data/lib/rex/post/meterpreter/extensions/networkpug/tlv.rb +16 -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 +109 -0
- data/lib/rex/post/meterpreter/extensions/priv/tlv.rb +29 -0
- data/lib/rex/post/meterpreter/extensions/sniffer/sniffer.rb +117 -0
- data/lib/rex/post/meterpreter/extensions/sniffer/tlv.rb +27 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/constants.rb +396 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/fs/dir.rb +284 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/fs/file.rb +399 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/fs/file_stat.rb +104 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/fs/io.rb +48 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/net/arp.rb +59 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/net/config.rb +256 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/net/interface.rb +129 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/net/netstat.rb +97 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/net/resolve.rb +106 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/net/route.rb +67 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/net/socket.rb +139 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/net/socket_subsystem/tcp_client_channel.rb +180 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/net/socket_subsystem/tcp_server_channel.rb +168 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/net/socket_subsystem/udp_channel.rb +209 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/api_constants.rb +38146 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/buffer_item.rb +48 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_advapi32.rb +2102 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_crypt32.rb +32 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_iphlpapi.rb +97 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_kernel32.rb +3852 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_netapi32.rb +100 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_ntdll.rb +168 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_psapi.rb +32 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_shell32.rb +32 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_user32.rb +3170 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_version.rb +41 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_wlanapi.rb +87 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_wldap32.rb +128 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_ws2_32.rb +613 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll.rb +388 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_function.rb +111 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_helper.rb +149 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_wrapper.rb +27 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/mock_magic.rb +515 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/multicall.rb +319 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/platform_util.rb +23 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/railgun.rb +301 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/tlv.rb +56 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/type/pointer_util.rb +106 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/util.rb +676 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/win_const_manager.rb +96 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/stdapi.rb +151 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/sys/config.rb +128 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/sys/event_log.rb +192 -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 +60 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/sys/process.rb +408 -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 +328 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry_subsystem/registry_key.rb +193 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry_subsystem/registry_value.rb +102 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry_subsystem/remote_registry_key.rb +188 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/sys/thread.rb +180 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/tlv.rb +236 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/ui.rb +259 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/webcam/webcam.rb +201 -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 +709 -0
- data/lib/rex/post/meterpreter/packet_dispatcher.rb +543 -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 +142 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher.rb +86 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/android.rb +383 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/core.rb +939 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/espia.rb +109 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi.rb +65 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi/adsi.rb +198 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi/clipboard.rb +444 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi/service.rb +199 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi/window.rb +118 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi/wmi.rb +108 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/incognito.rb +242 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/kiwi.rb +509 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/lanattacks.rb +60 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/lanattacks/dhcp.rb +254 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/lanattacks/tftp.rb +159 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/mimikatz.rb +182 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/networkpug.rb +232 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv.rb +62 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv/elevate.rb +97 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv/passwd.rb +52 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv/timestomp.rb +133 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/sniffer.rb +204 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi.rb +66 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/fs.rb +527 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/net.rb +448 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/sys.rb +906 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/ui.rb +318 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/webcam.rb +343 -0
- data/lib/rex/post/meterpreter/ui/console/interactive_channel.rb +99 -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 +15 -0
- data/lib/rex/proto/addp.rb +218 -0
- data/lib/rex/proto/dcerpc.rb +7 -0
- data/lib/rex/proto/dcerpc/client.rb +362 -0
- data/lib/rex/proto/dcerpc/exceptions.rb +151 -0
- data/lib/rex/proto/dcerpc/handle.rb +48 -0
- data/lib/rex/proto/dcerpc/ndr.rb +73 -0
- data/lib/rex/proto/dcerpc/packet.rb +264 -0
- data/lib/rex/proto/dcerpc/response.rb +188 -0
- data/lib/rex/proto/dcerpc/uuid.rb +85 -0
- data/lib/rex/proto/dcerpc/wdscp.rb +3 -0
- data/lib/rex/proto/dcerpc/wdscp/constants.rb +89 -0
- data/lib/rex/proto/dcerpc/wdscp/packet.rb +94 -0
- data/lib/rex/proto/dhcp.rb +7 -0
- data/lib/rex/proto/dhcp/constants.rb +34 -0
- data/lib/rex/proto/dhcp/server.rb +334 -0
- data/lib/rex/proto/drda.rb +6 -0
- data/lib/rex/proto/drda/constants.rb +50 -0
- data/lib/rex/proto/drda/packet.rb +253 -0
- data/lib/rex/proto/drda/utils.rb +124 -0
- data/lib/rex/proto/http.rb +7 -0
- data/lib/rex/proto/http/client.rb +722 -0
- data/lib/rex/proto/http/client_request.rb +472 -0
- data/lib/rex/proto/http/handler.rb +47 -0
- data/lib/rex/proto/http/handler/erb.rb +129 -0
- data/lib/rex/proto/http/handler/proc.rb +61 -0
- data/lib/rex/proto/http/header.rb +173 -0
- data/lib/rex/proto/http/packet.rb +414 -0
- data/lib/rex/proto/http/request.rb +354 -0
- data/lib/rex/proto/http/response.rb +151 -0
- data/lib/rex/proto/http/server.rb +385 -0
- data/lib/rex/proto/iax2.rb +2 -0
- data/lib/rex/proto/iax2/call.rb +326 -0
- data/lib/rex/proto/iax2/client.rb +218 -0
- data/lib/rex/proto/iax2/codecs.rb +5 -0
- data/lib/rex/proto/iax2/codecs/alaw.rb +16 -0
- data/lib/rex/proto/iax2/codecs/g711.rb +2176 -0
- data/lib/rex/proto/iax2/codecs/mulaw.rb +17 -0
- data/lib/rex/proto/iax2/constants.rb +262 -0
- data/lib/rex/proto/ipmi.rb +57 -0
- data/lib/rex/proto/ipmi/channel_auth_reply.rb +89 -0
- data/lib/rex/proto/ipmi/open_session_reply.rb +36 -0
- data/lib/rex/proto/ipmi/rakp2.rb +36 -0
- data/lib/rex/proto/ipmi/utils.rb +125 -0
- data/lib/rex/proto/natpmp.rb +7 -0
- data/lib/rex/proto/natpmp/constants.rb +19 -0
- data/lib/rex/proto/natpmp/packet.rb +45 -0
- data/lib/rex/proto/ntlm.rb +8 -0
- data/lib/rex/proto/ntlm/base.rb +327 -0
- data/lib/rex/proto/ntlm/constants.rb +75 -0
- data/lib/rex/proto/ntlm/crypt.rb +412 -0
- data/lib/rex/proto/ntlm/exceptions.rb +17 -0
- data/lib/rex/proto/ntlm/message.rb +534 -0
- data/lib/rex/proto/ntlm/utils.rb +765 -0
- data/lib/rex/proto/ntp.rb +3 -0
- data/lib/rex/proto/ntp/constants.rb +12 -0
- data/lib/rex/proto/ntp/modes.rb +130 -0
- data/lib/rex/proto/pjl.rb +31 -0
- data/lib/rex/proto/pjl/client.rb +163 -0
- data/lib/rex/proto/proxy/socks4a.rb +441 -0
- data/lib/rex/proto/rfb.rb +13 -0
- data/lib/rex/proto/rfb/cipher.rb +82 -0
- data/lib/rex/proto/rfb/client.rb +205 -0
- data/lib/rex/proto/rfb/constants.rb +50 -0
- data/lib/rex/proto/sip.rb +4 -0
- data/lib/rex/proto/sip/response.rb +61 -0
- data/lib/rex/proto/smb.rb +8 -0
- data/lib/rex/proto/smb/client.rb +2064 -0
- data/lib/rex/proto/smb/constants.rb +1064 -0
- data/lib/rex/proto/smb/crypt.rb +37 -0
- data/lib/rex/proto/smb/evasions.rb +67 -0
- data/lib/rex/proto/smb/exceptions.rb +867 -0
- data/lib/rex/proto/smb/simpleclient.rb +173 -0
- data/lib/rex/proto/smb/simpleclient/open_file.rb +106 -0
- data/lib/rex/proto/smb/simpleclient/open_pipe.rb +57 -0
- data/lib/rex/proto/smb/utils.rb +104 -0
- data/lib/rex/proto/sunrpc.rb +2 -0
- data/lib/rex/proto/sunrpc/client.rb +196 -0
- data/lib/rex/proto/tftp.rb +13 -0
- data/lib/rex/proto/tftp/client.rb +344 -0
- data/lib/rex/proto/tftp/constants.rb +39 -0
- data/lib/rex/proto/tftp/server.rb +497 -0
- data/lib/rex/random_identifier_generator.rb +177 -0
- data/lib/rex/registry.rb +14 -0
- data/lib/rex/registry/hive.rb +132 -0
- data/lib/rex/registry/lfkey.rb +51 -0
- data/lib/rex/registry/nodekey.rb +54 -0
- data/lib/rex/registry/regf.rb +25 -0
- data/lib/rex/registry/valuekey.rb +67 -0
- data/lib/rex/registry/valuelist.rb +29 -0
- data/lib/rex/ropbuilder.rb +8 -0
- data/lib/rex/ropbuilder/rop.rb +271 -0
- data/lib/rex/script.rb +42 -0
- data/lib/rex/script/base.rb +61 -0
- data/lib/rex/script/meterpreter.rb +16 -0
- data/lib/rex/script/shell.rb +10 -0
- data/lib/rex/service.rb +49 -0
- data/lib/rex/service_manager.rb +154 -0
- data/lib/rex/services/local_relay.rb +424 -0
- data/lib/rex/socket.rb +788 -0
- data/lib/rex/socket/comm.rb +120 -0
- data/lib/rex/socket/comm/local.rb +526 -0
- data/lib/rex/socket/ip.rb +132 -0
- data/lib/rex/socket/parameters.rb +363 -0
- data/lib/rex/socket/range_walker.rb +470 -0
- data/lib/rex/socket/ssl_tcp.rb +345 -0
- data/lib/rex/socket/ssl_tcp_server.rb +188 -0
- data/lib/rex/socket/subnet_walker.rb +76 -0
- data/lib/rex/socket/switch_board.rb +289 -0
- data/lib/rex/socket/tcp.rb +79 -0
- data/lib/rex/socket/tcp_server.rb +67 -0
- data/lib/rex/socket/udp.rb +165 -0
- data/lib/rex/sslscan/result.rb +201 -0
- data/lib/rex/sslscan/scanner.rb +206 -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 +85 -0
- data/lib/rex/sync/read_write_lock.rb +177 -0
- data/lib/rex/sync/ref.rb +58 -0
- data/lib/rex/sync/thread_safe.rb +83 -0
- data/lib/rex/text.rb +1813 -0
- data/lib/rex/thread_factory.rb +43 -0
- data/lib/rex/time.rb +66 -0
- data/lib/rex/transformer.rb +116 -0
- data/lib/rex/ui.rb +22 -0
- data/lib/rex/ui/interactive.rb +304 -0
- data/lib/rex/ui/output.rb +85 -0
- data/lib/rex/ui/output/none.rb +19 -0
- data/lib/rex/ui/progress_tracker.rb +97 -0
- data/lib/rex/ui/subscriber.rb +160 -0
- data/lib/rex/ui/text/color.rb +98 -0
- data/lib/rex/ui/text/dispatcher_shell.rb +538 -0
- data/lib/rex/ui/text/input.rb +119 -0
- data/lib/rex/ui/text/input/buffer.rb +79 -0
- data/lib/rex/ui/text/input/readline.rb +129 -0
- data/lib/rex/ui/text/input/socket.rb +96 -0
- data/lib/rex/ui/text/input/stdio.rb +46 -0
- data/lib/rex/ui/text/irb_shell.rb +62 -0
- data/lib/rex/ui/text/output.rb +86 -0
- data/lib/rex/ui/text/output/buffer.rb +62 -0
- data/lib/rex/ui/text/output/buffer/stdout.rb +26 -0
- data/lib/rex/ui/text/output/file.rb +44 -0
- data/lib/rex/ui/text/output/socket.rb +44 -0
- data/lib/rex/ui/text/output/stdio.rb +53 -0
- data/lib/rex/ui/text/output/tee.rb +56 -0
- data/lib/rex/ui/text/progress_tracker.rb +57 -0
- data/lib/rex/ui/text/shell.rb +403 -0
- data/lib/rex/ui/text/table.rb +346 -0
- data/lib/rex/zip.rb +96 -0
- data/lib/rex/zip/archive.rb +130 -0
- data/lib/rex/zip/blocks.rb +184 -0
- data/lib/rex/zip/entry.rb +122 -0
- data/lib/rex/zip/jar.rb +283 -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 +536 -0
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
# -*- coding: binary -*-
|
|
2
|
+
# Copyright (c) 2010, patrickHVE@googlemail.com
|
|
3
|
+
# All rights reserved.
|
|
4
|
+
#
|
|
5
|
+
# Redistribution and use in source and binary forms, with or without
|
|
6
|
+
# modification, are permitted provided that the following conditions are met:
|
|
7
|
+
# * Redistributions of source code must retain the above copyright
|
|
8
|
+
# notice, this list of conditions and the following disclaimer.
|
|
9
|
+
# * Redistributions in binary form must reproduce the above copyright
|
|
10
|
+
# notice, this list of conditions and the following disclaimer in the
|
|
11
|
+
# documentation and/or other materials provided with the distribution.
|
|
12
|
+
# * The names of the author may not be used to endorse or promote products
|
|
13
|
+
# derived from this software without specific prior written permission.
|
|
14
|
+
#
|
|
15
|
+
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
|
16
|
+
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
|
17
|
+
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
18
|
+
# DISCLAIMED. IN NO EVENT SHALL patrickHVE@googlemail.com BE LIABLE FOR ANY
|
|
19
|
+
# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
|
20
|
+
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
|
21
|
+
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
|
22
|
+
# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
23
|
+
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
|
24
|
+
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
25
|
+
|
|
26
|
+
require 'rex/post/meterpreter/packet'
|
|
27
|
+
|
|
28
|
+
module Rex
|
|
29
|
+
module Post
|
|
30
|
+
module Meterpreter
|
|
31
|
+
module Extensions
|
|
32
|
+
module Stdapi
|
|
33
|
+
module Railgun
|
|
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)
|
|
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)
|
|
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)
|
|
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)
|
|
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)
|
|
56
|
+
end; end; end; end; end; end
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
# -*- coding: binary -*-
|
|
2
|
+
require 'rex/post/meterpreter/extensions/stdapi/railgun/platform_util'
|
|
3
|
+
|
|
4
|
+
module Rex
|
|
5
|
+
module Post
|
|
6
|
+
module Meterpreter
|
|
7
|
+
module Extensions
|
|
8
|
+
module Stdapi
|
|
9
|
+
module Railgun
|
|
10
|
+
module Type
|
|
11
|
+
module PointerUtil
|
|
12
|
+
|
|
13
|
+
ARCH_POINTER_SIZE = {
|
|
14
|
+
PlatformUtil::X86_64 => 8,
|
|
15
|
+
PlatformUtil::X86_32 => 4
|
|
16
|
+
}.freeze
|
|
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
|
|
22
|
+
|
|
23
|
+
def self.pack_pointer(pointer, platform)
|
|
24
|
+
if pointer.nil?
|
|
25
|
+
return pack_pointer(0, platform)
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
case platform
|
|
29
|
+
when PlatformUtil::X86_64
|
|
30
|
+
# Assume little endian
|
|
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
|
+
|
|
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
|
+
# Assume little endian
|
|
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
|
+
|
|
52
|
+
def self.null_pointer(pointer, platform)
|
|
53
|
+
pack_pointer(0, platform)
|
|
54
|
+
end
|
|
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
|
|
68
|
+
|
|
69
|
+
return pointer.nil? || pointer == 0
|
|
70
|
+
end
|
|
71
|
+
#
|
|
72
|
+
# def self.is_unpacked_pointer?(pointer, platform)
|
|
73
|
+
# # TODO also check that the integer size is appropriate for the platform
|
|
74
|
+
# unless pointer.kind_of?(Fixnum) and pointer > 0 # and pointer <
|
|
75
|
+
# return false
|
|
76
|
+
# end
|
|
77
|
+
#
|
|
78
|
+
# packed_pointer = pack_pointer(pointer, platform)
|
|
79
|
+
# if !packed_pointer.nil? and packed_pointer.length == pointer_size(platform)
|
|
80
|
+
# return true
|
|
81
|
+
# end
|
|
82
|
+
#
|
|
83
|
+
# return false
|
|
84
|
+
# end
|
|
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
|
|
91
|
+
|
|
92
|
+
if type.kind_of?(String) && type =~ /^L?P/
|
|
93
|
+
return true
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
return false
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
end # PointerUtil
|
|
100
|
+
end # Type
|
|
101
|
+
end # Railgun
|
|
102
|
+
end # Stdapi
|
|
103
|
+
end # Extensions
|
|
104
|
+
end # Meterpreter
|
|
105
|
+
end # Post
|
|
106
|
+
end # Rex
|
|
@@ -0,0 +1,676 @@
|
|
|
1
|
+
# -*- coding: binary -*-
|
|
2
|
+
require 'rex/post/meterpreter/extensions/stdapi/railgun/dll_helper'
|
|
3
|
+
|
|
4
|
+
module Rex
|
|
5
|
+
module Post
|
|
6
|
+
module Meterpreter
|
|
7
|
+
module Extensions
|
|
8
|
+
module Stdapi
|
|
9
|
+
module Railgun
|
|
10
|
+
|
|
11
|
+
#
|
|
12
|
+
# Utility methods and constants for dealing with most types of variables.
|
|
13
|
+
#
|
|
14
|
+
class Util
|
|
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
|
+
# Assume little endian
|
|
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('V').first == 1
|
|
456
|
+
when :LONG
|
|
457
|
+
return raw.unpack('V').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
|
|
670
|
+
end # Util
|
|
671
|
+
end # Railgun
|
|
672
|
+
end # Stdapi
|
|
673
|
+
end # Extensions
|
|
674
|
+
end # Meterpreter
|
|
675
|
+
end # Post
|
|
676
|
+
end # Rex
|