ronin-support 0.5.1 → 1.0.0.beta1
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 +7 -0
- data/.editorconfig +11 -0
- data/.github/workflows/ruby.yml +27 -0
- data/.gitignore +7 -6
- data/.mailmap +1 -0
- data/.ruby-version +1 -0
- data/.yardopts +1 -2
- data/ChangeLog.md +533 -137
- data/Gemfile +20 -20
- data/README.md +137 -61
- data/Rakefile +29 -10
- data/data/text/homoglyphs/ascii.txt +8 -0
- data/data/text/homoglyphs/cyrillic.txt +33 -0
- data/data/text/homoglyphs/full_width.txt +81 -0
- data/data/text/homoglyphs/greek.txt +21 -0
- data/data/text/homoglyphs/latin_numbers.txt +14 -0
- data/data/text/homoglyphs/punctuation.txt +7 -0
- data/data/text/patterns/network/public_suffix.rb.erb +44 -0
- data/examples/ssl_proxy.rb +38 -0
- data/examples/tcp_proxy.rb +41 -0
- data/gemspec.yml +25 -15
- data/lib/ronin/support/archive/core_ext/file.rb +118 -0
- data/lib/ronin/{formatting/sql.rb → support/archive/core_ext.rb} +6 -7
- data/lib/ronin/support/archive/mixin.rb +213 -0
- data/lib/ronin/support/archive/tar/reader.rb +135 -0
- data/lib/ronin/support/archive/tar/writer.rb +197 -0
- data/lib/ronin/support/archive/tar.rb +155 -0
- data/lib/ronin/support/archive/zip/reader/entry.rb +134 -0
- data/lib/ronin/support/archive/zip/reader/statistics.rb +76 -0
- data/lib/ronin/support/archive/zip/reader.rb +273 -0
- data/lib/ronin/support/archive/zip/writer.rb +175 -0
- data/lib/ronin/support/archive/zip.rb +105 -0
- data/lib/ronin/support/archive.rb +211 -0
- data/lib/ronin/support/binary/array.rb +255 -0
- data/lib/ronin/support/binary/bit_flip.rb +147 -0
- data/lib/ronin/support/binary/buffer.rb +2027 -0
- data/lib/ronin/support/binary/byte_slice.rb +324 -0
- data/lib/ronin/support/binary/core_ext/array.rb +75 -0
- data/lib/ronin/support/binary/core_ext/float.rb +80 -0
- data/lib/ronin/support/binary/core_ext/integer.rb +305 -0
- data/lib/ronin/support/binary/core_ext/io.rb +38 -0
- data/lib/ronin/support/binary/core_ext/string.rb +115 -0
- data/lib/ronin/{formatting/extensions/text.rb → support/binary/core_ext.rb} +9 -9
- data/lib/ronin/support/binary/cstring.rb +259 -0
- data/lib/ronin/support/binary/ctypes/aggregate_type.rb +98 -0
- data/lib/ronin/support/binary/ctypes/arch/arm/big_endian.rb +77 -0
- data/lib/ronin/support/binary/ctypes/arch/arm.rb +75 -0
- data/lib/ronin/support/binary/ctypes/arch/arm64/big_endian.rb +77 -0
- data/lib/ronin/support/binary/ctypes/arch/arm64.rb +75 -0
- data/lib/ronin/support/binary/ctypes/arch/mips/little_endian.rb +77 -0
- data/lib/ronin/support/binary/ctypes/arch/mips.rb +75 -0
- data/lib/ronin/support/binary/ctypes/arch/mips64/little_endian.rb +77 -0
- data/lib/ronin/support/binary/ctypes/arch/mips64.rb +75 -0
- data/lib/ronin/support/binary/ctypes/arch/ppc.rb +75 -0
- data/lib/ronin/support/binary/ctypes/arch/ppc64.rb +75 -0
- data/lib/ronin/support/binary/ctypes/arch/x86.rb +75 -0
- data/lib/ronin/support/binary/ctypes/arch/x86_64.rb +75 -0
- data/lib/ronin/support/binary/ctypes/arch.rb +30 -0
- data/lib/ronin/support/binary/ctypes/array_object_type.rb +164 -0
- data/lib/ronin/support/binary/ctypes/array_type.rb +232 -0
- data/lib/ronin/support/binary/ctypes/big_endian.rb +195 -0
- data/lib/ronin/support/binary/ctypes/char_type.rb +59 -0
- data/lib/ronin/support/binary/ctypes/char_types.rb +39 -0
- data/lib/ronin/support/binary/ctypes/enum_type.rb +181 -0
- data/lib/ronin/support/binary/ctypes/float32_type.rb +50 -0
- data/lib/ronin/support/binary/ctypes/float64_type.rb +50 -0
- data/lib/ronin/support/binary/ctypes/float_type.rb +62 -0
- data/lib/ronin/support/binary/ctypes/int16_type.rb +50 -0
- data/lib/ronin/support/binary/ctypes/int32_type.rb +50 -0
- data/lib/ronin/support/binary/ctypes/int64_type.rb +50 -0
- data/lib/ronin/support/binary/ctypes/int8_type.rb +41 -0
- data/lib/ronin/support/binary/ctypes/int_type.rb +62 -0
- data/lib/ronin/support/binary/ctypes/little_endian.rb +195 -0
- data/lib/ronin/support/binary/ctypes/mixin.rb +135 -0
- data/lib/ronin/support/binary/ctypes/native.rb +205 -0
- data/lib/ronin/support/binary/ctypes/network.rb +29 -0
- data/lib/ronin/support/binary/ctypes/object_type.rb +55 -0
- data/lib/ronin/support/binary/ctypes/os/bsd.rb +65 -0
- data/lib/ronin/support/binary/ctypes/os/freebsd.rb +215 -0
- data/lib/ronin/support/binary/ctypes/os/linux.rb +193 -0
- data/lib/ronin/support/binary/ctypes/os/macos.rb +151 -0
- data/lib/ronin/support/binary/ctypes/os/netbsd.rb +147 -0
- data/lib/ronin/support/binary/ctypes/os/openbsd.rb +168 -0
- data/lib/ronin/support/binary/ctypes/os/unix.rb +78 -0
- data/lib/ronin/support/binary/ctypes/os/windows.rb +125 -0
- data/lib/ronin/support/binary/ctypes/os.rb +125 -0
- data/lib/ronin/support/binary/ctypes/scalar_type.rb +200 -0
- data/lib/ronin/support/binary/ctypes/string_type.rb +143 -0
- data/lib/ronin/support/binary/ctypes/struct_object_type.rb +173 -0
- data/lib/ronin/support/binary/ctypes/struct_type.rb +359 -0
- data/lib/ronin/support/binary/ctypes/type.rb +193 -0
- data/lib/ronin/support/binary/ctypes/type_resolver.rb +206 -0
- data/lib/ronin/support/binary/ctypes/uint16_type.rb +50 -0
- data/lib/ronin/support/binary/ctypes/uint32_type.rb +50 -0
- data/lib/ronin/support/binary/ctypes/uint64_type.rb +50 -0
- data/lib/ronin/support/binary/ctypes/uint8_type.rb +41 -0
- data/lib/ronin/support/binary/ctypes/uint_type.rb +59 -0
- data/lib/ronin/support/binary/ctypes/unbounded_array_type.rb +258 -0
- data/lib/ronin/support/binary/ctypes/union_object_type.rb +173 -0
- data/lib/ronin/support/binary/ctypes/union_type.rb +261 -0
- data/lib/ronin/support/binary/ctypes.rb +462 -0
- data/lib/ronin/support/binary/hexdump/core_ext/file.rb +118 -0
- data/lib/ronin/support/binary/hexdump/core_ext/string.rb +115 -0
- data/lib/ronin/support/binary/hexdump/core_ext.rb +20 -0
- data/lib/ronin/support/binary/hexdump/parser.rb +492 -0
- data/lib/ronin/support/binary/hexdump.rb +20 -0
- data/lib/ronin/support/binary/memory.rb +268 -0
- data/lib/ronin/support/binary/packet.rb +33 -0
- data/lib/ronin/support/binary/stack.rb +256 -0
- data/lib/ronin/support/binary/stream/methods.rb +1755 -0
- data/lib/ronin/support/binary/stream.rb +151 -0
- data/lib/ronin/support/binary/struct/member.rb +86 -0
- data/lib/ronin/support/binary/struct.rb +830 -0
- data/lib/ronin/support/binary/template.rb +284 -0
- data/lib/ronin/support/binary/union.rb +162 -0
- data/lib/ronin/support/binary.rb +26 -0
- data/lib/ronin/support/cli/ansi.rb +330 -0
- data/lib/ronin/support/cli/io_shell/core_ext/io.rb +67 -0
- data/lib/ronin/{fuzzing/extensions.rb → support/cli/io_shell/core_ext.rb} +6 -7
- data/lib/ronin/support/cli/io_shell.rb +161 -0
- data/lib/ronin/support/cli/printing.rb +216 -0
- data/lib/ronin/support/cli.rb +20 -0
- data/lib/ronin/support/compression/core_ext/file.rb +70 -0
- data/lib/ronin/support/compression/core_ext/string.rb +101 -0
- data/lib/ronin/{formatting/html.rb → support/compression/core_ext.rb} +6 -7
- data/lib/ronin/support/compression/gzip/reader.rb +70 -0
- data/lib/ronin/support/compression/gzip/writer.rb +74 -0
- data/lib/ronin/support/compression/gzip.rb +105 -0
- data/lib/ronin/support/compression/mixin.rb +180 -0
- data/lib/ronin/{network/extensions/esmtp/net.rb → support/compression/zlib.rb} +9 -10
- data/lib/ronin/support/compression.rb +174 -0
- data/lib/ronin/{extensions → support/core_ext}/enumerable.rb +5 -6
- data/lib/ronin/{extensions → support/core_ext}/file.rb +11 -34
- data/lib/ronin/support/core_ext/integer.rb +37 -0
- data/lib/ronin/support/core_ext/ipaddr.rb +65 -0
- data/lib/ronin/{extensions → support/core_ext}/kernel.rb +10 -9
- data/lib/ronin/{extensions → support/core_ext}/resolv.rb +5 -28
- data/lib/ronin/{extensions → support/core_ext}/string.rb +117 -57
- data/lib/ronin/support/core_ext.rb +33 -0
- data/lib/ronin/support/crypto/cert.rb +522 -0
- data/lib/ronin/support/crypto/cert_chain.rb +204 -0
- data/lib/ronin/support/crypto/cipher/aes.rb +71 -0
- data/lib/ronin/support/crypto/cipher/aes128.rb +54 -0
- data/lib/ronin/support/crypto/cipher/aes256.rb +54 -0
- data/lib/ronin/support/crypto/cipher.rb +194 -0
- data/lib/ronin/support/crypto/core_ext/file.rb +660 -0
- data/lib/ronin/support/crypto/core_ext/string.rb +548 -0
- data/lib/ronin/{binary.rb → support/crypto/core_ext.rb} +7 -8
- data/lib/ronin/support/crypto/hmac.rb +48 -0
- data/lib/ronin/support/crypto/key/dh.rb +122 -0
- data/lib/ronin/support/crypto/key/dsa.rb +103 -0
- data/lib/ronin/support/crypto/key/ec.rb +99 -0
- data/lib/ronin/support/crypto/key/methods.rb +163 -0
- data/lib/ronin/support/crypto/key/rsa.rb +169 -0
- data/lib/ronin/support/crypto/key.rb +105 -0
- data/lib/ronin/support/crypto/mixin.rb +620 -0
- data/lib/ronin/{network/extensions/http/net.rb → support/crypto/openssl.rb} +9 -10
- data/lib/ronin/support/crypto.rb +779 -0
- data/lib/ronin/support/encoding/base16/core_ext/string.rb +63 -0
- data/lib/ronin/support/encoding/base16/core_ext.rb +19 -0
- data/lib/ronin/support/encoding/base16.rb +82 -0
- data/lib/ronin/support/encoding/base32/core_ext/string.rb +63 -0
- data/lib/ronin/support/encoding/base32/core_ext.rb +19 -0
- data/lib/ronin/support/encoding/base32.rb +164 -0
- data/lib/ronin/support/encoding/base64/core_ext/string.rb +76 -0
- data/lib/ronin/support/encoding/base64/core_ext.rb +19 -0
- data/lib/ronin/support/encoding/base64.rb +78 -0
- data/lib/ronin/support/encoding/c/core_ext/integer.rb +82 -0
- data/lib/ronin/support/encoding/c/core_ext/string.rb +125 -0
- data/lib/ronin/support/encoding/c/core_ext.rb +20 -0
- data/lib/ronin/support/encoding/c.rb +277 -0
- data/lib/ronin/support/encoding/core_ext/string.rb +107 -0
- data/lib/ronin/support/encoding/core_ext.rb +33 -0
- data/lib/ronin/support/encoding/hex/core_ext/integer.rb +82 -0
- data/lib/ronin/support/encoding/hex/core_ext/string.rb +133 -0
- data/lib/ronin/support/encoding/hex/core_ext.rb +22 -0
- data/lib/ronin/support/encoding/hex.rb +248 -0
- data/lib/ronin/support/encoding/html/core_ext/integer.rb +106 -0
- data/lib/ronin/support/encoding/html/core_ext/string.rb +130 -0
- data/lib/ronin/support/encoding/html/core_ext.rb +20 -0
- data/lib/ronin/support/encoding/html.rb +233 -0
- data/lib/ronin/support/encoding/http/core_ext/integer.rb +95 -0
- data/lib/ronin/support/encoding/http/core_ext/string.rb +129 -0
- data/lib/ronin/support/encoding/http/core_ext.rb +20 -0
- data/lib/ronin/support/encoding/http.rb +241 -0
- data/lib/ronin/support/encoding/js/core_ext/integer.rb +67 -0
- data/lib/ronin/support/encoding/js/core_ext/string.rb +125 -0
- data/lib/ronin/support/encoding/js/core_ext.rb +20 -0
- data/lib/ronin/support/encoding/js.rb +279 -0
- data/lib/ronin/support/encoding/powershell/core_ext/integer.rb +87 -0
- data/lib/ronin/support/encoding/powershell/core_ext/string.rb +145 -0
- data/lib/ronin/support/encoding/powershell/core_ext.rb +20 -0
- data/lib/ronin/support/encoding/powershell.rb +297 -0
- data/lib/ronin/support/encoding/punycode/core_ext/string.rb +63 -0
- data/lib/ronin/support/encoding/punycode/core_ext.rb +19 -0
- data/lib/ronin/support/encoding/punycode.rb +76 -0
- data/lib/ronin/support/encoding/quoted_printable/core_ext/string.rb +75 -0
- data/lib/ronin/support/encoding/quoted_printable/core_ext.rb +19 -0
- data/lib/ronin/support/encoding/quoted_printable.rb +102 -0
- data/lib/ronin/support/encoding/ruby/core_ext/string.rb +129 -0
- data/lib/ronin/{formatting/binary.rb → support/encoding/ruby/core_ext.rb} +6 -7
- data/lib/ronin/support/encoding/ruby.rb +235 -0
- data/lib/ronin/support/encoding/shell/core_ext/integer.rb +89 -0
- data/lib/ronin/support/encoding/shell/core_ext/string.rb +134 -0
- data/lib/ronin/support/encoding/shell/core_ext.rb +20 -0
- data/lib/ronin/support/encoding/shell.rb +293 -0
- data/lib/ronin/{network/extensions → support/encoding}/smtp.rb +7 -7
- data/lib/ronin/support/encoding/sql/core_ext/string.rb +114 -0
- data/lib/ronin/{formatting/http.rb → support/encoding/sql/core_ext.rb} +6 -7
- data/lib/ronin/support/encoding/sql.rb +124 -0
- data/lib/ronin/support/encoding/uri/core_ext/integer.rb +149 -0
- data/lib/ronin/support/encoding/uri/core_ext/string.rb +195 -0
- data/lib/ronin/support/encoding/uri/core_ext.rb +20 -0
- data/lib/ronin/support/encoding/uri.rb +424 -0
- data/lib/ronin/support/encoding/uuencoding/core_ext/string.rb +73 -0
- data/lib/ronin/support/encoding/uuencoding/core_ext.rb +19 -0
- data/lib/ronin/support/encoding/uuencoding.rb +70 -0
- data/lib/ronin/support/encoding/xml/core_ext/integer.rb +100 -0
- data/lib/ronin/support/encoding/xml/core_ext/string.rb +124 -0
- data/lib/ronin/support/encoding/xml/core_ext.rb +20 -0
- data/lib/ronin/support/encoding/xml.rb +328 -0
- data/lib/ronin/support/encoding.rb +46 -0
- data/lib/ronin/support/home.rb +88 -0
- data/lib/ronin/support/mixin.rb +42 -0
- data/lib/ronin/support/network/asn/dns_record.rb +112 -0
- data/lib/ronin/support/network/asn/list.rb +269 -0
- data/lib/ronin/support/network/asn/record.rb +164 -0
- data/lib/ronin/support/network/asn/record_set.rb +226 -0
- data/lib/ronin/support/network/asn.rb +88 -0
- data/lib/ronin/{binary/hexdump.rb → support/network/core_ext.rb} +6 -7
- data/lib/ronin/support/network/dns/idn.rb +38 -0
- data/lib/ronin/support/network/dns/mixin.rb +941 -0
- data/lib/ronin/support/network/dns/resolver.rb +707 -0
- data/lib/ronin/support/network/dns.rb +1109 -0
- data/lib/ronin/support/network/domain.rb +70 -0
- data/lib/ronin/support/network/email_address.rb +574 -0
- data/lib/ronin/support/network/esmtp/mixin.rb +115 -0
- data/lib/ronin/support/network/exceptions.rb +43 -0
- data/lib/ronin/support/network/ftp/mixin.rb +106 -0
- data/lib/ronin/support/network/host.rb +1473 -0
- data/lib/ronin/support/network/http/cookie.rb +245 -0
- data/lib/ronin/support/network/http/core_ext/uri/http.rb +63 -0
- data/lib/ronin/support/network/http/core_ext.rb +19 -0
- data/lib/ronin/support/network/http/mixin.rb +890 -0
- data/lib/ronin/support/network/http/request.rb +215 -0
- data/lib/ronin/support/network/http/set_cookie.rb +210 -0
- data/lib/ronin/support/network/http/user_agents.rb +115 -0
- data/lib/ronin/support/network/http.rb +2582 -0
- data/lib/ronin/support/network/imap/mixin.rb +133 -0
- data/lib/ronin/support/network/ip/mixin.rb +114 -0
- data/lib/ronin/support/network/ip.rb +540 -0
- data/lib/ronin/support/network/ip_range/cidr.rb +252 -0
- data/lib/ronin/support/network/ip_range/glob.rb +309 -0
- data/lib/ronin/support/network/ip_range/range.rb +249 -0
- data/lib/ronin/support/network/ip_range.rb +284 -0
- data/lib/ronin/support/network/mixin.rb +58 -0
- data/lib/ronin/support/network/packet.rb +27 -0
- data/lib/ronin/support/network/pop3/mixin.rb +113 -0
- data/lib/ronin/support/network/proxy.rb +602 -0
- data/lib/ronin/support/network/public_suffix/list.rb +339 -0
- data/lib/ronin/support/network/public_suffix/suffix.rb +118 -0
- data/lib/ronin/support/network/public_suffix/suffix_set.rb +150 -0
- data/lib/ronin/support/network/public_suffix.rb +41 -0
- data/lib/ronin/support/network/smtp/email.rb +190 -0
- data/lib/ronin/support/network/smtp/mixin.rb +290 -0
- data/lib/ronin/{extensions/meta.rb → support/network/smtp.rb} +6 -7
- data/lib/ronin/support/network/ssl/local_cert.rb +114 -0
- data/lib/ronin/support/network/ssl/local_key.rb +84 -0
- data/lib/ronin/support/network/ssl/mixin.rb +740 -0
- data/lib/ronin/{network/extensions/imap/net.rb → support/network/ssl/openssl.rb} +9 -10
- data/lib/ronin/support/network/ssl/proxy.rb +296 -0
- data/lib/ronin/support/network/ssl.rb +173 -0
- data/lib/ronin/support/network/tcp/mixin.rb +400 -0
- data/lib/ronin/support/network/tcp/proxy.rb +435 -0
- data/lib/ronin/support/network/tcp.rb +443 -0
- data/lib/ronin/support/network/telnet/mixin.rb +150 -0
- data/lib/ronin/support/network/telnet.rb +90 -0
- data/lib/ronin/support/network/tld/list.rb +266 -0
- data/lib/ronin/support/network/tld.rb +41 -0
- data/lib/ronin/support/network/tls/mixin.rb +670 -0
- data/lib/ronin/support/network/tls/proxy.rb +135 -0
- data/lib/ronin/support/network/tls.rb +53 -0
- data/lib/ronin/support/network/udp/mixin.rb +389 -0
- data/lib/ronin/support/network/udp/proxy.rb +192 -0
- data/lib/ronin/support/network/udp.rb +435 -0
- data/lib/ronin/support/network/unix/mixin.rb +273 -0
- data/lib/ronin/support/network.rb +37 -0
- data/lib/ronin/support/path.rb +136 -0
- data/lib/ronin/{network/extensions/dns/net.rb → support/text/core_ext/regexp.rb} +8 -9
- data/lib/ronin/support/text/core_ext/string.rb +46 -0
- data/lib/ronin/support/text/core_ext.rb +23 -0
- data/lib/ronin/support/text/entropy/core_ext/string.rb +45 -0
- data/lib/ronin/support/text/entropy/core_ext.rb +19 -0
- data/lib/ronin/support/text/entropy.rb +66 -0
- data/lib/ronin/support/text/erb/mixin.rb +44 -0
- data/lib/ronin/support/text/erb.rb +19 -0
- data/lib/ronin/support/text/homoglyph/core_ext/string.rb +108 -0
- data/lib/ronin/{formatting/digest.rb → support/text/homoglyph/core_ext.rb} +6 -7
- data/lib/ronin/{network/http/exceptions/unknown_request.rb → support/text/homoglyph/exceptions.rb} +10 -9
- data/lib/ronin/support/text/homoglyph/table.rb +228 -0
- data/lib/ronin/support/text/homoglyph.rb +142 -0
- data/lib/ronin/support/text/mixin.rb +31 -0
- data/lib/ronin/support/text/patterns/credentials.rb +75 -0
- data/lib/ronin/support/text/patterns/crypto.rb +67 -0
- data/lib/ronin/support/text/patterns/file_system.rb +93 -0
- data/lib/ronin/support/text/patterns/language.rb +37 -0
- data/lib/ronin/support/text/patterns/network/public_suffix.rb +44 -0
- data/lib/ronin/support/text/patterns/network.rb +140 -0
- data/lib/ronin/support/text/patterns/numeric.rb +52 -0
- data/lib/ronin/support/text/patterns/pii.rb +105 -0
- data/lib/ronin/support/text/patterns/source_code.rb +148 -0
- data/lib/ronin/support/text/patterns.rb +25 -0
- data/lib/ronin/support/text/random/mixin.rb +437 -0
- data/lib/ronin/support/text/random.rb +419 -0
- data/lib/ronin/support/text/typo/core_ext/string.rb +123 -0
- data/lib/ronin/support/text/typo/core_ext.rb +19 -0
- data/lib/ronin/support/text/typo/exceptions.rb +28 -0
- data/lib/ronin/support/text/typo/generator.rb +161 -0
- data/lib/ronin/support/text/typo.rb +260 -0
- data/lib/ronin/support/text.rb +26 -0
- data/lib/ronin/support/version.rb +6 -7
- data/lib/ronin/support.rb +20 -15
- data/ronin-support.gemspec +3 -1
- metadata +462 -369
- data/.gemtest +0 -0
- data/lib/ronin/binary/hexdump/parser.rb +0 -403
- data/lib/ronin/binary/struct.rb +0 -567
- data/lib/ronin/binary/template.rb +0 -454
- data/lib/ronin/extensions/ip_addr.rb +0 -217
- data/lib/ronin/extensions/meta/object.rb +0 -24
- data/lib/ronin/extensions/regexp.rb +0 -157
- data/lib/ronin/extensions.rb +0 -29
- data/lib/ronin/formatting/extensions/binary/array.rb +0 -61
- data/lib/ronin/formatting/extensions/binary/base64.rb +0 -106
- data/lib/ronin/formatting/extensions/binary/file.rb +0 -77
- data/lib/ronin/formatting/extensions/binary/float.rb +0 -65
- data/lib/ronin/formatting/extensions/binary/integer.rb +0 -180
- data/lib/ronin/formatting/extensions/binary/string.rb +0 -345
- data/lib/ronin/formatting/extensions/binary.rb +0 -26
- data/lib/ronin/formatting/extensions/digest/file.rb +0 -129
- data/lib/ronin/formatting/extensions/digest/string.rb +0 -86
- data/lib/ronin/formatting/extensions/digest.rb +0 -21
- data/lib/ronin/formatting/extensions/html/integer.rb +0 -142
- data/lib/ronin/formatting/extensions/html/string.rb +0 -194
- data/lib/ronin/formatting/extensions/html.rb +0 -21
- data/lib/ronin/formatting/extensions/http/integer.rb +0 -69
- data/lib/ronin/formatting/extensions/http/string.rb +0 -110
- data/lib/ronin/formatting/extensions/http.rb +0 -21
- data/lib/ronin/formatting/extensions/sql/string.rb +0 -128
- data/lib/ronin/formatting/extensions/sql.rb +0 -20
- data/lib/ronin/formatting/extensions/text/array.rb +0 -137
- data/lib/ronin/formatting/extensions/text/string.rb +0 -297
- data/lib/ronin/formatting/extensions.rb +0 -24
- data/lib/ronin/formatting/text.rb +0 -20
- data/lib/ronin/formatting.rb +0 -25
- data/lib/ronin/fuzzing/extensions/string.rb +0 -209
- data/lib/ronin/fuzzing/fuzzer.rb +0 -110
- data/lib/ronin/fuzzing/fuzzing.rb +0 -360
- data/lib/ronin/fuzzing/mutator.rb +0 -161
- data/lib/ronin/fuzzing/repeater.rb +0 -81
- data/lib/ronin/fuzzing/template.rb +0 -133
- data/lib/ronin/fuzzing.rb +0 -21
- data/lib/ronin/mixin.rb +0 -89
- data/lib/ronin/network/dns.rb +0 -201
- data/lib/ronin/network/esmtp.rb +0 -113
- data/lib/ronin/network/extensions/dns.rb +0 -20
- data/lib/ronin/network/extensions/esmtp.rb +0 -20
- data/lib/ronin/network/extensions/http/uri/http.rb +0 -228
- data/lib/ronin/network/extensions/http.rb +0 -21
- data/lib/ronin/network/extensions/imap.rb +0 -20
- data/lib/ronin/network/extensions/pop3/net.rb +0 -24
- data/lib/ronin/network/extensions/pop3.rb +0 -20
- data/lib/ronin/network/extensions/smtp/net.rb +0 -24
- data/lib/ronin/network/extensions/ssl/net.rb +0 -24
- data/lib/ronin/network/extensions/ssl.rb +0 -20
- data/lib/ronin/network/extensions/tcp/net.rb +0 -24
- data/lib/ronin/network/extensions/tcp.rb +0 -20
- data/lib/ronin/network/extensions/telnet/net.rb +0 -24
- data/lib/ronin/network/extensions/telnet.rb +0 -20
- data/lib/ronin/network/extensions/udp/net.rb +0 -24
- data/lib/ronin/network/extensions/udp.rb +0 -20
- data/lib/ronin/network/extensions.rb +0 -29
- data/lib/ronin/network/ftp.rb +0 -149
- data/lib/ronin/network/http/exceptions.rb +0 -20
- data/lib/ronin/network/http/http.rb +0 -1127
- data/lib/ronin/network/http/proxy.rb +0 -330
- data/lib/ronin/network/http.rb +0 -22
- data/lib/ronin/network/imap.rb +0 -158
- data/lib/ronin/network/mixins/dns.rb +0 -55
- data/lib/ronin/network/mixins/esmtp.rb +0 -164
- data/lib/ronin/network/mixins/ftp.rb +0 -155
- data/lib/ronin/network/mixins/http.rb +0 -227
- data/lib/ronin/network/mixins/imap.rb +0 -156
- data/lib/ronin/network/mixins/mixin.rb +0 -58
- data/lib/ronin/network/mixins/pop3.rb +0 -149
- data/lib/ronin/network/mixins/smtp.rb +0 -159
- data/lib/ronin/network/mixins/ssl.rb +0 -148
- data/lib/ronin/network/mixins/tcp.rb +0 -368
- data/lib/ronin/network/mixins/telnet.rb +0 -208
- data/lib/ronin/network/mixins/udp.rb +0 -381
- data/lib/ronin/network/mixins/unix.rb +0 -279
- data/lib/ronin/network/mixins.rb +0 -29
- data/lib/ronin/network/network.rb +0 -45
- data/lib/ronin/network/pop3.rb +0 -124
- data/lib/ronin/network/proxy.rb +0 -578
- data/lib/ronin/network/smtp/email.rb +0 -174
- data/lib/ronin/network/smtp/smtp.rb +0 -230
- data/lib/ronin/network/smtp.rb +0 -22
- data/lib/ronin/network/ssl.rb +0 -186
- data/lib/ronin/network/tcp/proxy.rb +0 -417
- data/lib/ronin/network/tcp/tcp.rb +0 -443
- data/lib/ronin/network/tcp.rb +0 -21
- data/lib/ronin/network/telnet.rb +0 -264
- data/lib/ronin/network/udp/proxy.rb +0 -191
- data/lib/ronin/network/udp/udp.rb +0 -450
- data/lib/ronin/network/udp.rb +0 -21
- data/lib/ronin/network/unix.rb +0 -286
- data/lib/ronin/network.rb +0 -31
- data/lib/ronin/path.rb +0 -137
- data/lib/ronin/spec/ui/output.rb +0 -22
- data/lib/ronin/support/inflector.rb +0 -92
- data/lib/ronin/support/support.rb +0 -42
- data/lib/ronin/templates/erb.rb +0 -78
- data/lib/ronin/templates/template.rb +0 -169
- data/lib/ronin/templates.rb +0 -21
- data/lib/ronin/ui/output/helpers.rb +0 -296
- data/lib/ronin/ui/output/output.rb +0 -146
- data/lib/ronin/ui/output/terminal/color.rb +0 -124
- data/lib/ronin/ui/output/terminal/raw.rb +0 -103
- data/lib/ronin/ui/output/terminal.rb +0 -21
- data/lib/ronin/ui/output.rb +0 -21
- data/lib/ronin/ui/shell.rb +0 -286
- data/lib/ronin/wordlist.rb +0 -287
- data/spec/binary/hexdump/helpers/hexdumps/ascii.bin +0 -0
- data/spec/binary/hexdump/helpers/hexdumps/hexdump_decimal_shorts.txt +0 -17
- data/spec/binary/hexdump/helpers/hexdumps/hexdump_hex_bytes.txt +0 -17
- data/spec/binary/hexdump/helpers/hexdumps/hexdump_hex_shorts.txt +0 -17
- data/spec/binary/hexdump/helpers/hexdumps/hexdump_octal_bytes.txt +0 -17
- data/spec/binary/hexdump/helpers/hexdumps/hexdump_octal_shorts.txt +0 -17
- data/spec/binary/hexdump/helpers/hexdumps/hexdump_repeated.txt +0 -6
- data/spec/binary/hexdump/helpers/hexdumps/od_decimal_bytes.txt +0 -17
- data/spec/binary/hexdump/helpers/hexdumps/od_decimal_ints.txt +0 -17
- data/spec/binary/hexdump/helpers/hexdumps/od_decimal_quads.txt +0 -17
- data/spec/binary/hexdump/helpers/hexdumps/od_decimal_shorts.txt +0 -17
- data/spec/binary/hexdump/helpers/hexdumps/od_doubles.txt +0 -17
- data/spec/binary/hexdump/helpers/hexdumps/od_floats.txt +0 -17
- data/spec/binary/hexdump/helpers/hexdumps/od_hex_bytes.txt +0 -17
- data/spec/binary/hexdump/helpers/hexdumps/od_hex_ints.txt +0 -17
- data/spec/binary/hexdump/helpers/hexdumps/od_hex_quads.txt +0 -17
- data/spec/binary/hexdump/helpers/hexdumps/od_hex_shorts.txt +0 -17
- data/spec/binary/hexdump/helpers/hexdumps/od_named_chars.txt +0 -17
- data/spec/binary/hexdump/helpers/hexdumps/od_octal_bytes.txt +0 -17
- data/spec/binary/hexdump/helpers/hexdumps/od_octal_ints.txt +0 -17
- data/spec/binary/hexdump/helpers/hexdumps/od_octal_quads.txt +0 -17
- data/spec/binary/hexdump/helpers/hexdumps/od_octal_shorts.txt +0 -17
- data/spec/binary/hexdump/helpers/hexdumps/od_repeated.txt +0 -6
- data/spec/binary/hexdump/helpers/hexdumps/repeated.bin +0 -1
- data/spec/binary/hexdump/helpers/hexdumps.rb +0 -13
- data/spec/binary/hexdump/parser_spec.rb +0 -302
- data/spec/binary/struct_spec.rb +0 -496
- data/spec/binary/template_spec.rb +0 -414
- data/spec/extensions/enumerable_spec.rb +0 -24
- data/spec/extensions/file_spec.rb +0 -63
- data/spec/extensions/ip_addr_spec.rb +0 -203
- data/spec/extensions/kernel_spec.rb +0 -30
- data/spec/extensions/regexp_spec.rb +0 -482
- data/spec/extensions/resolv_spec.rb +0 -18
- data/spec/extensions/string_spec.rb +0 -179
- data/spec/formatting/binary/array_spec.rb +0 -26
- data/spec/formatting/binary/base64_spec.rb +0 -50
- data/spec/formatting/binary/float_spec.rb +0 -34
- data/spec/formatting/binary/integer_spec.rb +0 -166
- data/spec/formatting/binary/string_spec.rb +0 -197
- data/spec/formatting/digest/string_spec.rb +0 -82
- data/spec/formatting/html/integer_spec.rb +0 -66
- data/spec/formatting/html/string_spec.rb +0 -103
- data/spec/formatting/http/integer_spec.rb +0 -42
- data/spec/formatting/http/string_spec.rb +0 -76
- data/spec/formatting/sql/string_spec.rb +0 -75
- data/spec/formatting/text/array_spec.rb +0 -105
- data/spec/formatting/text/string_spec.rb +0 -162
- data/spec/fuzzing/extensions/string_spec.rb +0 -87
- data/spec/fuzzing/fuzzer_spec.rb +0 -109
- data/spec/fuzzing/fuzzing_spec.rb +0 -24
- data/spec/fuzzing/mutator_spec.rb +0 -112
- data/spec/fuzzing/repeater_spec.rb +0 -57
- data/spec/fuzzing/template_spec.rb +0 -54
- data/spec/mixin_spec.rb +0 -53
- data/spec/network/dns_spec.rb +0 -201
- data/spec/network/ftp_spec.rb +0 -81
- data/spec/network/http/http_spec.rb +0 -466
- data/spec/network/http/proxy_spec.rb +0 -148
- data/spec/network/network_spec.rb +0 -8
- data/spec/network/proxy_spec.rb +0 -121
- data/spec/network/shared/unix_server.rb +0 -31
- data/spec/network/smtp/email_spec.rb +0 -100
- data/spec/network/ssl_spec.rb +0 -70
- data/spec/network/tcp/proxy_spec.rb +0 -116
- data/spec/network/tcp/tcp_spec.rb +0 -273
- data/spec/network/telnet_spec.rb +0 -67
- data/spec/network/udp/udp_spec.rb +0 -271
- data/spec/network/unix_spec.rb +0 -183
- data/spec/path_spec.rb +0 -86
- data/spec/spec_helper.rb +0 -9
- data/spec/support/inflector_spec.rb +0 -22
- data/spec/support_spec.rb +0 -8
- data/spec/templates/classes/example_erb.rb +0 -11
- data/spec/templates/classes/example_template.rb +0 -35
- data/spec/templates/erb_spec.rb +0 -21
- data/spec/templates/helpers/data/includes/_relative.erb +0 -1
- data/spec/templates/helpers/data/templates/example.erb +0 -1
- data/spec/templates/helpers/data.rb +0 -9
- data/spec/templates/template_spec.rb +0 -54
- data/spec/ui/classes/test_shell.rb +0 -22
- data/spec/ui/output_spec.rb +0 -32
- data/spec/ui/shell_spec.rb +0 -83
- data/spec/wordlist_spec.rb +0 -151
|
@@ -0,0 +1,258 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
#
|
|
3
|
+
# Copyright (c) 2006-2022 Hal Brodigan (postmodern.mod3 at gmail.com)
|
|
4
|
+
#
|
|
5
|
+
# ronin-support is free software: you can redistribute it and/or modify
|
|
6
|
+
# it under the terms of the GNU Lesser General Public License as published
|
|
7
|
+
# by the Free Software Foundation, either version 3 of the License, or
|
|
8
|
+
# (at your option) any later version.
|
|
9
|
+
#
|
|
10
|
+
# ronin-support is distributed in the hope that it will be useful,
|
|
11
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
12
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
13
|
+
# GNU Lesser General Public License for more details.
|
|
14
|
+
#
|
|
15
|
+
# You should have received a copy of the GNU Lesser General Public License
|
|
16
|
+
# along with ronin-support. If not, see <https://www.gnu.org/licenses/>.
|
|
17
|
+
#
|
|
18
|
+
|
|
19
|
+
require 'ronin/support/binary/ctypes/aggregate_type'
|
|
20
|
+
require 'ronin/support/binary/ctypes/scalar_type'
|
|
21
|
+
|
|
22
|
+
module Ronin
|
|
23
|
+
module Support
|
|
24
|
+
module Binary
|
|
25
|
+
module CTypes
|
|
26
|
+
#
|
|
27
|
+
# Represents an unbounded array type.
|
|
28
|
+
#
|
|
29
|
+
# @api private
|
|
30
|
+
#
|
|
31
|
+
# @since 1.0.0
|
|
32
|
+
#
|
|
33
|
+
class UnboundedArrayType < AggregateType
|
|
34
|
+
|
|
35
|
+
# The type of each element in the unbounded array type.
|
|
36
|
+
#
|
|
37
|
+
# @return [Type]
|
|
38
|
+
attr_reader :type
|
|
39
|
+
|
|
40
|
+
#
|
|
41
|
+
# Initializes the unbounded array type.
|
|
42
|
+
#
|
|
43
|
+
# @param [Type] type
|
|
44
|
+
# The type of each element in the unbounded array type.
|
|
45
|
+
#
|
|
46
|
+
# @raise [ArgumentError]
|
|
47
|
+
# Cannot initialize a nested {UnboundedArrayType}.
|
|
48
|
+
#
|
|
49
|
+
def initialize(type, alignment: nil)
|
|
50
|
+
if type.class == UnboundedArrayType
|
|
51
|
+
raise(ArgumentError,"cannot initialize a nested #{UnboundedArrayType}")
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
@type = type
|
|
55
|
+
@alignment = alignment
|
|
56
|
+
|
|
57
|
+
super(
|
|
58
|
+
# "T*" syntax only works on individual pack-string codes,
|
|
59
|
+
# so we only set #pack_string for scalar types that also have
|
|
60
|
+
# a #pack_string.
|
|
61
|
+
pack_string: if @type.kind_of?(ScalarType) && @type.pack_string
|
|
62
|
+
"#{@type.pack_string}*"
|
|
63
|
+
end
|
|
64
|
+
)
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
#
|
|
68
|
+
# The "size" in bytes of the unbounded array type.
|
|
69
|
+
#
|
|
70
|
+
# @return [Float::INFINITY]
|
|
71
|
+
#
|
|
72
|
+
def size
|
|
73
|
+
Float::INFINITY
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
#
|
|
77
|
+
# The alignment, in bytes, for the unbounded array.
|
|
78
|
+
#
|
|
79
|
+
# @return [Integer]
|
|
80
|
+
#
|
|
81
|
+
def alignment
|
|
82
|
+
@alignment || @type.alignment
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
#
|
|
86
|
+
# Creates a copy of the unbounded array type with a different
|
|
87
|
+
# {#alignment}.
|
|
88
|
+
#
|
|
89
|
+
# @param [Integer] new_alignment
|
|
90
|
+
# The new alignment for the new unbounded array type.
|
|
91
|
+
#
|
|
92
|
+
# @return [ScalarType]
|
|
93
|
+
# The new unbounded array type.
|
|
94
|
+
#
|
|
95
|
+
def align(new_alignment)
|
|
96
|
+
self.class.new(@type, alignment: new_alignment)
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
#
|
|
100
|
+
# The "length" of the unbounded array type.
|
|
101
|
+
#
|
|
102
|
+
# @return [Float::INFINITY]
|
|
103
|
+
#
|
|
104
|
+
def length
|
|
105
|
+
Float::INFINITY
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
#
|
|
109
|
+
# The endianness of each element in the unbounded array.
|
|
110
|
+
#
|
|
111
|
+
# @return [:little, :big, nil]
|
|
112
|
+
# Indicates whether each element is little-endian, big-endian,
|
|
113
|
+
# or `nil` if each element has no endianness.
|
|
114
|
+
#
|
|
115
|
+
def endian
|
|
116
|
+
@type.endian
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
#
|
|
120
|
+
# Indicates whether each element is signed.
|
|
121
|
+
#
|
|
122
|
+
# @return [Boolean]
|
|
123
|
+
#
|
|
124
|
+
def signed?
|
|
125
|
+
@type.signed?
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
#
|
|
129
|
+
# Indicates whether each element is unsigned.
|
|
130
|
+
#
|
|
131
|
+
# @return [Boolean]
|
|
132
|
+
#
|
|
133
|
+
def unsigned?
|
|
134
|
+
@type.unsigned?
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
#
|
|
138
|
+
# Packs an array of values into the type's binary format.
|
|
139
|
+
#
|
|
140
|
+
# @param [Array<Integer, Float, String>] array
|
|
141
|
+
# The array to pack.
|
|
142
|
+
#
|
|
143
|
+
# @return [String]
|
|
144
|
+
# The packed binary data.
|
|
145
|
+
#
|
|
146
|
+
# @api public
|
|
147
|
+
#
|
|
148
|
+
def pack(array)
|
|
149
|
+
if @pack_string
|
|
150
|
+
super(array)
|
|
151
|
+
else
|
|
152
|
+
buffer = String.new('', encoding: Encoding::ASCII_8BIT)
|
|
153
|
+
|
|
154
|
+
array.each do |element|
|
|
155
|
+
buffer << @type.pack(element)
|
|
156
|
+
end
|
|
157
|
+
|
|
158
|
+
return buffer
|
|
159
|
+
end
|
|
160
|
+
end
|
|
161
|
+
|
|
162
|
+
#
|
|
163
|
+
# Unpacks an array of binary data.
|
|
164
|
+
#
|
|
165
|
+
# @param [String] data
|
|
166
|
+
# The binary data to unpack.
|
|
167
|
+
#
|
|
168
|
+
# @return [Array<Integer, Float, String, nil>]
|
|
169
|
+
# The unpacked array.
|
|
170
|
+
#
|
|
171
|
+
# @api public
|
|
172
|
+
#
|
|
173
|
+
def unpack(data)
|
|
174
|
+
if @pack_string
|
|
175
|
+
super(data)
|
|
176
|
+
else
|
|
177
|
+
case @type
|
|
178
|
+
when StringType
|
|
179
|
+
unpack_strings(data)
|
|
180
|
+
else
|
|
181
|
+
type_size = @type.size
|
|
182
|
+
|
|
183
|
+
(0...data.bytesize).step(type_size).map do |offset|
|
|
184
|
+
@type.unpack(data.byteslice(offset,type_size))
|
|
185
|
+
end
|
|
186
|
+
end
|
|
187
|
+
end
|
|
188
|
+
end
|
|
189
|
+
|
|
190
|
+
#
|
|
191
|
+
# Enqueues an array of values onto the flat list of values.
|
|
192
|
+
#
|
|
193
|
+
# @param [Array] values
|
|
194
|
+
# The flat array of values.
|
|
195
|
+
#
|
|
196
|
+
# @param [Array] array
|
|
197
|
+
# The array to enqueue.
|
|
198
|
+
#
|
|
199
|
+
# @api private
|
|
200
|
+
#
|
|
201
|
+
def enqueue_value(values,array)
|
|
202
|
+
array.each do |element|
|
|
203
|
+
@type.enqueue_value(values,element)
|
|
204
|
+
end
|
|
205
|
+
end
|
|
206
|
+
|
|
207
|
+
#
|
|
208
|
+
# Dequeues an array from the flat list of values.
|
|
209
|
+
#
|
|
210
|
+
# @param [Array] values
|
|
211
|
+
# The flat array of values.
|
|
212
|
+
#
|
|
213
|
+
# @return [Array]
|
|
214
|
+
# The dequeued array.
|
|
215
|
+
#
|
|
216
|
+
# @api private
|
|
217
|
+
#
|
|
218
|
+
def dequeue_value(values)
|
|
219
|
+
array = []
|
|
220
|
+
|
|
221
|
+
until values.empty?
|
|
222
|
+
array << @type.dequeue_value(values)
|
|
223
|
+
end
|
|
224
|
+
|
|
225
|
+
return array
|
|
226
|
+
end
|
|
227
|
+
|
|
228
|
+
private
|
|
229
|
+
|
|
230
|
+
#
|
|
231
|
+
# Unpacks an arbitrary number of null-terminated C Strings.
|
|
232
|
+
#
|
|
233
|
+
# @param [String] data
|
|
234
|
+
# The binary encoded data.
|
|
235
|
+
#
|
|
236
|
+
# @return [Array<String>]
|
|
237
|
+
# The unpacked Strings.
|
|
238
|
+
#
|
|
239
|
+
def unpack_strings(data)
|
|
240
|
+
array = []
|
|
241
|
+
length = data.bytesize
|
|
242
|
+
offset = 0
|
|
243
|
+
|
|
244
|
+
while offset < length
|
|
245
|
+
string = @type.unpack(data[offset..])
|
|
246
|
+
array << string
|
|
247
|
+
|
|
248
|
+
offset += string.bytesize + 1
|
|
249
|
+
end
|
|
250
|
+
|
|
251
|
+
return array
|
|
252
|
+
end
|
|
253
|
+
|
|
254
|
+
end
|
|
255
|
+
end
|
|
256
|
+
end
|
|
257
|
+
end
|
|
258
|
+
end
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
#
|
|
3
|
+
# Copyright (c) 2006-2022 Hal Brodigan (postmodern.mod3 at gmail.com)
|
|
4
|
+
#
|
|
5
|
+
# ronin-support is free software: you can redistribute it and/or modify
|
|
6
|
+
# it under the terms of the GNU Lesser General Public License as published
|
|
7
|
+
# by the Free Software Foundation, either version 3 of the License, or
|
|
8
|
+
# (at your option) any later version.
|
|
9
|
+
#
|
|
10
|
+
# ronin-support is distributed in the hope that it will be useful,
|
|
11
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
12
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
13
|
+
# GNU Lesser General Public License for more details.
|
|
14
|
+
#
|
|
15
|
+
# You should have received a copy of the GNU Lesser General Public License
|
|
16
|
+
# along with ronin-support. If not, see <https://www.gnu.org/licenses/>.
|
|
17
|
+
#
|
|
18
|
+
|
|
19
|
+
require 'ronin/support/binary/ctypes/object_type'
|
|
20
|
+
require 'ronin/support/binary/ctypes/union_type'
|
|
21
|
+
|
|
22
|
+
module Ronin
|
|
23
|
+
module Support
|
|
24
|
+
module Binary
|
|
25
|
+
module CTypes
|
|
26
|
+
#
|
|
27
|
+
# Represents a {Binary::Union} type.
|
|
28
|
+
#
|
|
29
|
+
# @api private
|
|
30
|
+
#
|
|
31
|
+
# @since 1.0.0
|
|
32
|
+
#
|
|
33
|
+
class UnionObjectType < ObjectType
|
|
34
|
+
|
|
35
|
+
# The {Union} class.
|
|
36
|
+
#
|
|
37
|
+
# @return [Union.class]
|
|
38
|
+
attr_reader :union_class
|
|
39
|
+
|
|
40
|
+
# The type used for packing literal `Hash` values.
|
|
41
|
+
#
|
|
42
|
+
# @return [UnionType]
|
|
43
|
+
attr_reader :union_type
|
|
44
|
+
|
|
45
|
+
#
|
|
46
|
+
# Initializes the memory-mapped union type.
|
|
47
|
+
#
|
|
48
|
+
# @param [Union.class] union_class
|
|
49
|
+
# The {Union} class.
|
|
50
|
+
#
|
|
51
|
+
# @param [UnionType] union_type
|
|
52
|
+
# The union type for the union class.
|
|
53
|
+
#
|
|
54
|
+
def initialize(union_class,union_type)
|
|
55
|
+
@union_class = union_class
|
|
56
|
+
@union_type = union_type
|
|
57
|
+
|
|
58
|
+
super(@union_type.size)
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
#
|
|
62
|
+
# The size of the union type.
|
|
63
|
+
#
|
|
64
|
+
# @return [Integer, Float::INFINITY]
|
|
65
|
+
#
|
|
66
|
+
def size
|
|
67
|
+
@union_type.size
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
#
|
|
71
|
+
# The alignment, in bytes, of the memory-mapped {Union}.
|
|
72
|
+
#
|
|
73
|
+
# @return [Integer]
|
|
74
|
+
#
|
|
75
|
+
def alignment
|
|
76
|
+
@union_type.alignment
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
#
|
|
80
|
+
# Creates a copy of the union object type with a different
|
|
81
|
+
# {#alignment}.
|
|
82
|
+
#
|
|
83
|
+
# @param [Integer] new_alignment
|
|
84
|
+
# The new alignment for the new union object type.
|
|
85
|
+
#
|
|
86
|
+
# @return [ScalarType]
|
|
87
|
+
# The new union object type.
|
|
88
|
+
#
|
|
89
|
+
def align(new_alignment)
|
|
90
|
+
self.class.new(@union_class,@union_type.align(new_alignment))
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
#
|
|
94
|
+
# The members of the union type.
|
|
95
|
+
#
|
|
96
|
+
# @return [Hash{Symbol => UnionType::Member}]
|
|
97
|
+
#
|
|
98
|
+
def members
|
|
99
|
+
@union_type.members
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
#
|
|
103
|
+
# Packs the memory-mapped {Union}.
|
|
104
|
+
#
|
|
105
|
+
# @param [Binary::Union, Hash] union
|
|
106
|
+
# The memory-mapped {Union} object.
|
|
107
|
+
#
|
|
108
|
+
# @return [String]
|
|
109
|
+
# The underlying binary data for the memory object.
|
|
110
|
+
#
|
|
111
|
+
# @raise [ArgumentError]
|
|
112
|
+
# The given value was not a {Binary::Union} or `Hash`.
|
|
113
|
+
#
|
|
114
|
+
def pack(union)
|
|
115
|
+
case union
|
|
116
|
+
when Binary::Union
|
|
117
|
+
union.to_s
|
|
118
|
+
when Hash
|
|
119
|
+
@union_type.pack(union)
|
|
120
|
+
else
|
|
121
|
+
raise(ArgumentError,"value must be either a #{Binary::Union} or an #{Hash}: #{union.inspect}")
|
|
122
|
+
end
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
#
|
|
126
|
+
# Unpacks the memory-mapped {Union}.
|
|
127
|
+
#
|
|
128
|
+
# @param [String] data
|
|
129
|
+
# The raw binary data to unpack.
|
|
130
|
+
#
|
|
131
|
+
# @return [Binary::Union]
|
|
132
|
+
# the unpacked {Union} object.
|
|
133
|
+
#
|
|
134
|
+
def unpack(data)
|
|
135
|
+
@union_class.unpack(data)
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
#
|
|
139
|
+
# Enqueues the memory-mapped {Union} into the list of values.
|
|
140
|
+
#
|
|
141
|
+
# @param [Array] values
|
|
142
|
+
# The flat array of values.
|
|
143
|
+
#
|
|
144
|
+
# @param [Binary::Union, Hash] union
|
|
145
|
+
# The {Union} object to enqueue.
|
|
146
|
+
#
|
|
147
|
+
def enqueue_value(values,union)
|
|
148
|
+
case union
|
|
149
|
+
when Binary::Union
|
|
150
|
+
values.push(union.to_s)
|
|
151
|
+
when Hash
|
|
152
|
+
values.push(@union_type.pack(union))
|
|
153
|
+
end
|
|
154
|
+
end
|
|
155
|
+
|
|
156
|
+
#
|
|
157
|
+
# Dequeues a memory object from the flat list of values.
|
|
158
|
+
#
|
|
159
|
+
# @param [Array] values
|
|
160
|
+
# The flat array of values.
|
|
161
|
+
#
|
|
162
|
+
# @return [Union]
|
|
163
|
+
# The dequued {Union} object.
|
|
164
|
+
#
|
|
165
|
+
def dequeue_value(values)
|
|
166
|
+
@union_class.new(values.shift)
|
|
167
|
+
end
|
|
168
|
+
|
|
169
|
+
end
|
|
170
|
+
end
|
|
171
|
+
end
|
|
172
|
+
end
|
|
173
|
+
end
|
|
@@ -0,0 +1,261 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
#
|
|
3
|
+
# Copyright (c) 2006-2022 Hal Brodigan (postmodern.mod3 at gmail.com)
|
|
4
|
+
#
|
|
5
|
+
# ronin-support is free software: you can redistribute it and/or modify
|
|
6
|
+
# it under the terms of the GNU Lesser General Public License as published
|
|
7
|
+
# by the Free Software Foundation, either version 3 of the License, or
|
|
8
|
+
# (at your option) any later version.
|
|
9
|
+
#
|
|
10
|
+
# ronin-support is distributed in the hope that it will be useful,
|
|
11
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
12
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
13
|
+
# GNU Lesser General Public License for more details.
|
|
14
|
+
#
|
|
15
|
+
# You should have received a copy of the GNU Lesser General Public License
|
|
16
|
+
# along with ronin-support. If not, see <https://www.gnu.org/licenses/>.
|
|
17
|
+
#
|
|
18
|
+
|
|
19
|
+
require 'ronin/support/binary/ctypes/aggregate_type'
|
|
20
|
+
|
|
21
|
+
module Ronin
|
|
22
|
+
module Support
|
|
23
|
+
module Binary
|
|
24
|
+
module CTypes
|
|
25
|
+
#
|
|
26
|
+
# Represents a `union` type.
|
|
27
|
+
#
|
|
28
|
+
# @api private
|
|
29
|
+
#
|
|
30
|
+
# @since 1.0.0
|
|
31
|
+
#
|
|
32
|
+
class UnionType < AggregateType
|
|
33
|
+
|
|
34
|
+
#
|
|
35
|
+
# Represents a member within a union.
|
|
36
|
+
#
|
|
37
|
+
# @api private
|
|
38
|
+
#
|
|
39
|
+
# @since 1.0.0
|
|
40
|
+
#
|
|
41
|
+
class Member
|
|
42
|
+
|
|
43
|
+
# The type of the member.
|
|
44
|
+
#
|
|
45
|
+
# @return [Type]
|
|
46
|
+
attr_reader :type
|
|
47
|
+
|
|
48
|
+
#
|
|
49
|
+
# Initializes the member.
|
|
50
|
+
#
|
|
51
|
+
# @param [Type] type
|
|
52
|
+
# The type of the member.
|
|
53
|
+
#
|
|
54
|
+
def initialize(type)
|
|
55
|
+
@type = type
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
#
|
|
59
|
+
# The offset of the member within the union.
|
|
60
|
+
#
|
|
61
|
+
# @return [0]
|
|
62
|
+
#
|
|
63
|
+
# @note This method is mainly for compatibility with
|
|
64
|
+
# {StructType::Member#offset}.
|
|
65
|
+
#
|
|
66
|
+
def offset
|
|
67
|
+
0
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
#
|
|
71
|
+
# The size, in bytes, of the member within the union.
|
|
72
|
+
#
|
|
73
|
+
# @return [Integer]
|
|
74
|
+
#
|
|
75
|
+
def size
|
|
76
|
+
@type.size
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
#
|
|
80
|
+
# The alignment, in bytes, of the member within the union.
|
|
81
|
+
#
|
|
82
|
+
# @return [Integer]
|
|
83
|
+
#
|
|
84
|
+
def alignment
|
|
85
|
+
@type.alignment
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
# The members of the union type.
|
|
91
|
+
#
|
|
92
|
+
# @return [Hash{Symbol => Member}]
|
|
93
|
+
attr_reader :members
|
|
94
|
+
|
|
95
|
+
# The size of the union type.
|
|
96
|
+
#
|
|
97
|
+
# @return [Integer, Float::INFINITY]
|
|
98
|
+
attr_reader :size
|
|
99
|
+
|
|
100
|
+
# The alignment, in bytes, for the union type, so that all members
|
|
101
|
+
# within the union type are themselves aligned.
|
|
102
|
+
#
|
|
103
|
+
# @return [Integer]
|
|
104
|
+
attr_reader :alignment
|
|
105
|
+
|
|
106
|
+
#
|
|
107
|
+
# Initializes the union type.
|
|
108
|
+
#
|
|
109
|
+
# @param [Hash{Symbol => Member}] members
|
|
110
|
+
# The members for the union type.
|
|
111
|
+
#
|
|
112
|
+
# @param [Integer] size
|
|
113
|
+
# The size of the union type.
|
|
114
|
+
#
|
|
115
|
+
# @param [Integer] alignment
|
|
116
|
+
# The alignment of the union type.
|
|
117
|
+
#
|
|
118
|
+
def initialize(members, size: , alignment: )
|
|
119
|
+
@members = members
|
|
120
|
+
@size = size
|
|
121
|
+
@alignment = alignment
|
|
122
|
+
|
|
123
|
+
super(pack_string: nil)
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
#
|
|
127
|
+
# Builds the union type from the given fields.
|
|
128
|
+
#
|
|
129
|
+
# @param [Hash{Symbol => Type}] fields
|
|
130
|
+
# The field names and types for the union type.
|
|
131
|
+
#
|
|
132
|
+
# @param [Integer, nil] alignment
|
|
133
|
+
# Custom alignment to use instead of the union's alignment.
|
|
134
|
+
#
|
|
135
|
+
# @return [UnionType]
|
|
136
|
+
# The new union type.
|
|
137
|
+
#
|
|
138
|
+
def self.build(fields, alignment: nil)
|
|
139
|
+
members = {}
|
|
140
|
+
max_size = 0
|
|
141
|
+
max_alignment = 0
|
|
142
|
+
|
|
143
|
+
fields.each do |name,type|
|
|
144
|
+
members[name] = Member.new(type)
|
|
145
|
+
|
|
146
|
+
# omit infinite sizes from the union size
|
|
147
|
+
if (type.size > max_size) && (type.size != Float::INFINITY)
|
|
148
|
+
max_size = type.size
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
max_alignment = type.alignment if type.alignment > max_alignment
|
|
152
|
+
end
|
|
153
|
+
|
|
154
|
+
return new(members, size: max_size,
|
|
155
|
+
alignment: alignment || max_alignment)
|
|
156
|
+
end
|
|
157
|
+
|
|
158
|
+
#
|
|
159
|
+
# Creates a new Hash of the union's uninitialized members.
|
|
160
|
+
#
|
|
161
|
+
# @return [Hash]
|
|
162
|
+
# The uninitialized values for the new union's members.
|
|
163
|
+
#
|
|
164
|
+
def uninitialized_value
|
|
165
|
+
Hash[@members.map { |name,member|
|
|
166
|
+
[name, member.type.uninitialized_value]
|
|
167
|
+
}]
|
|
168
|
+
end
|
|
169
|
+
|
|
170
|
+
#
|
|
171
|
+
# The number of members within the union.
|
|
172
|
+
#
|
|
173
|
+
# @return [Integer]
|
|
174
|
+
#
|
|
175
|
+
def length
|
|
176
|
+
@members.length
|
|
177
|
+
end
|
|
178
|
+
|
|
179
|
+
#
|
|
180
|
+
# Creates a copy of the union type with a different {#alignment}.
|
|
181
|
+
#
|
|
182
|
+
# @param [Integer] new_alignment
|
|
183
|
+
# The new alignment for the new union type.
|
|
184
|
+
#
|
|
185
|
+
# @return [ScalarType]
|
|
186
|
+
# The new union type.
|
|
187
|
+
#
|
|
188
|
+
def align(new_alignment)
|
|
189
|
+
self.class.new(@members, size: @size,
|
|
190
|
+
alignment: new_alignment)
|
|
191
|
+
end
|
|
192
|
+
|
|
193
|
+
#
|
|
194
|
+
# Packs a hash of values into the member's binary layout.
|
|
195
|
+
#
|
|
196
|
+
# @param [Hash{Symbol => Integer, Float, String}] hash
|
|
197
|
+
# The hash of values to pack.
|
|
198
|
+
#
|
|
199
|
+
# @return [String]
|
|
200
|
+
# The packed binary data.
|
|
201
|
+
#
|
|
202
|
+
def pack(hash)
|
|
203
|
+
unknown_keys = hash.keys - @members.keys
|
|
204
|
+
|
|
205
|
+
unless unknown_keys.empty?
|
|
206
|
+
raise(ArgumentError,"unknown union members: #{unknown_keys.map(&:inspect).join(', ')}")
|
|
207
|
+
end
|
|
208
|
+
|
|
209
|
+
buffer = if @size == Float::INFINITY
|
|
210
|
+
String.new(encoding: Encoding::ASCII_8BIT)
|
|
211
|
+
else
|
|
212
|
+
String.new("\0" * @size, encoding: Encoding::ASCII_8BIT)
|
|
213
|
+
end
|
|
214
|
+
|
|
215
|
+
hash.each do |name,value|
|
|
216
|
+
member = @members.fetch(name)
|
|
217
|
+
data = member.type.pack(value)
|
|
218
|
+
|
|
219
|
+
if data.bytesize <= @size
|
|
220
|
+
# if the packed data fits into buffer, overlay it
|
|
221
|
+
buffer[0,data.bytesize] = data
|
|
222
|
+
else
|
|
223
|
+
# otherwise replace the buffer with the larger data
|
|
224
|
+
buffer = data
|
|
225
|
+
end
|
|
226
|
+
end
|
|
227
|
+
|
|
228
|
+
return buffer
|
|
229
|
+
end
|
|
230
|
+
|
|
231
|
+
#
|
|
232
|
+
# Unpacks binary data into a Hash of values using the union's binary
|
|
233
|
+
# layout.
|
|
234
|
+
#
|
|
235
|
+
# @param [String] data
|
|
236
|
+
# The binary data to unpack.
|
|
237
|
+
#
|
|
238
|
+
# @return [Hash{Symbol => Integer, Float, String, nil}]
|
|
239
|
+
# The unpacked hash.
|
|
240
|
+
#
|
|
241
|
+
def unpack(data)
|
|
242
|
+
hash = {}
|
|
243
|
+
|
|
244
|
+
@members.each do |name,member|
|
|
245
|
+
slice = if member.size == Float::INFINITY
|
|
246
|
+
data
|
|
247
|
+
else
|
|
248
|
+
data.byteslice(0,member.size)
|
|
249
|
+
end
|
|
250
|
+
|
|
251
|
+
hash[name] = member.type.unpack(slice)
|
|
252
|
+
end
|
|
253
|
+
|
|
254
|
+
return hash
|
|
255
|
+
end
|
|
256
|
+
|
|
257
|
+
end
|
|
258
|
+
end
|
|
259
|
+
end
|
|
260
|
+
end
|
|
261
|
+
end
|