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.
Files changed (517) hide show
  1. checksums.yaml +7 -0
  2. data/.editorconfig +11 -0
  3. data/.github/workflows/ruby.yml +27 -0
  4. data/.gitignore +7 -6
  5. data/.mailmap +1 -0
  6. data/.ruby-version +1 -0
  7. data/.yardopts +1 -2
  8. data/ChangeLog.md +533 -137
  9. data/Gemfile +20 -20
  10. data/README.md +137 -61
  11. data/Rakefile +29 -10
  12. data/data/text/homoglyphs/ascii.txt +8 -0
  13. data/data/text/homoglyphs/cyrillic.txt +33 -0
  14. data/data/text/homoglyphs/full_width.txt +81 -0
  15. data/data/text/homoglyphs/greek.txt +21 -0
  16. data/data/text/homoglyphs/latin_numbers.txt +14 -0
  17. data/data/text/homoglyphs/punctuation.txt +7 -0
  18. data/data/text/patterns/network/public_suffix.rb.erb +44 -0
  19. data/examples/ssl_proxy.rb +38 -0
  20. data/examples/tcp_proxy.rb +41 -0
  21. data/gemspec.yml +25 -15
  22. data/lib/ronin/support/archive/core_ext/file.rb +118 -0
  23. data/lib/ronin/{formatting/sql.rb → support/archive/core_ext.rb} +6 -7
  24. data/lib/ronin/support/archive/mixin.rb +213 -0
  25. data/lib/ronin/support/archive/tar/reader.rb +135 -0
  26. data/lib/ronin/support/archive/tar/writer.rb +197 -0
  27. data/lib/ronin/support/archive/tar.rb +155 -0
  28. data/lib/ronin/support/archive/zip/reader/entry.rb +134 -0
  29. data/lib/ronin/support/archive/zip/reader/statistics.rb +76 -0
  30. data/lib/ronin/support/archive/zip/reader.rb +273 -0
  31. data/lib/ronin/support/archive/zip/writer.rb +175 -0
  32. data/lib/ronin/support/archive/zip.rb +105 -0
  33. data/lib/ronin/support/archive.rb +211 -0
  34. data/lib/ronin/support/binary/array.rb +255 -0
  35. data/lib/ronin/support/binary/bit_flip.rb +147 -0
  36. data/lib/ronin/support/binary/buffer.rb +2027 -0
  37. data/lib/ronin/support/binary/byte_slice.rb +324 -0
  38. data/lib/ronin/support/binary/core_ext/array.rb +75 -0
  39. data/lib/ronin/support/binary/core_ext/float.rb +80 -0
  40. data/lib/ronin/support/binary/core_ext/integer.rb +305 -0
  41. data/lib/ronin/support/binary/core_ext/io.rb +38 -0
  42. data/lib/ronin/support/binary/core_ext/string.rb +115 -0
  43. data/lib/ronin/{formatting/extensions/text.rb → support/binary/core_ext.rb} +9 -9
  44. data/lib/ronin/support/binary/cstring.rb +259 -0
  45. data/lib/ronin/support/binary/ctypes/aggregate_type.rb +98 -0
  46. data/lib/ronin/support/binary/ctypes/arch/arm/big_endian.rb +77 -0
  47. data/lib/ronin/support/binary/ctypes/arch/arm.rb +75 -0
  48. data/lib/ronin/support/binary/ctypes/arch/arm64/big_endian.rb +77 -0
  49. data/lib/ronin/support/binary/ctypes/arch/arm64.rb +75 -0
  50. data/lib/ronin/support/binary/ctypes/arch/mips/little_endian.rb +77 -0
  51. data/lib/ronin/support/binary/ctypes/arch/mips.rb +75 -0
  52. data/lib/ronin/support/binary/ctypes/arch/mips64/little_endian.rb +77 -0
  53. data/lib/ronin/support/binary/ctypes/arch/mips64.rb +75 -0
  54. data/lib/ronin/support/binary/ctypes/arch/ppc.rb +75 -0
  55. data/lib/ronin/support/binary/ctypes/arch/ppc64.rb +75 -0
  56. data/lib/ronin/support/binary/ctypes/arch/x86.rb +75 -0
  57. data/lib/ronin/support/binary/ctypes/arch/x86_64.rb +75 -0
  58. data/lib/ronin/support/binary/ctypes/arch.rb +30 -0
  59. data/lib/ronin/support/binary/ctypes/array_object_type.rb +164 -0
  60. data/lib/ronin/support/binary/ctypes/array_type.rb +232 -0
  61. data/lib/ronin/support/binary/ctypes/big_endian.rb +195 -0
  62. data/lib/ronin/support/binary/ctypes/char_type.rb +59 -0
  63. data/lib/ronin/support/binary/ctypes/char_types.rb +39 -0
  64. data/lib/ronin/support/binary/ctypes/enum_type.rb +181 -0
  65. data/lib/ronin/support/binary/ctypes/float32_type.rb +50 -0
  66. data/lib/ronin/support/binary/ctypes/float64_type.rb +50 -0
  67. data/lib/ronin/support/binary/ctypes/float_type.rb +62 -0
  68. data/lib/ronin/support/binary/ctypes/int16_type.rb +50 -0
  69. data/lib/ronin/support/binary/ctypes/int32_type.rb +50 -0
  70. data/lib/ronin/support/binary/ctypes/int64_type.rb +50 -0
  71. data/lib/ronin/support/binary/ctypes/int8_type.rb +41 -0
  72. data/lib/ronin/support/binary/ctypes/int_type.rb +62 -0
  73. data/lib/ronin/support/binary/ctypes/little_endian.rb +195 -0
  74. data/lib/ronin/support/binary/ctypes/mixin.rb +135 -0
  75. data/lib/ronin/support/binary/ctypes/native.rb +205 -0
  76. data/lib/ronin/support/binary/ctypes/network.rb +29 -0
  77. data/lib/ronin/support/binary/ctypes/object_type.rb +55 -0
  78. data/lib/ronin/support/binary/ctypes/os/bsd.rb +65 -0
  79. data/lib/ronin/support/binary/ctypes/os/freebsd.rb +215 -0
  80. data/lib/ronin/support/binary/ctypes/os/linux.rb +193 -0
  81. data/lib/ronin/support/binary/ctypes/os/macos.rb +151 -0
  82. data/lib/ronin/support/binary/ctypes/os/netbsd.rb +147 -0
  83. data/lib/ronin/support/binary/ctypes/os/openbsd.rb +168 -0
  84. data/lib/ronin/support/binary/ctypes/os/unix.rb +78 -0
  85. data/lib/ronin/support/binary/ctypes/os/windows.rb +125 -0
  86. data/lib/ronin/support/binary/ctypes/os.rb +125 -0
  87. data/lib/ronin/support/binary/ctypes/scalar_type.rb +200 -0
  88. data/lib/ronin/support/binary/ctypes/string_type.rb +143 -0
  89. data/lib/ronin/support/binary/ctypes/struct_object_type.rb +173 -0
  90. data/lib/ronin/support/binary/ctypes/struct_type.rb +359 -0
  91. data/lib/ronin/support/binary/ctypes/type.rb +193 -0
  92. data/lib/ronin/support/binary/ctypes/type_resolver.rb +206 -0
  93. data/lib/ronin/support/binary/ctypes/uint16_type.rb +50 -0
  94. data/lib/ronin/support/binary/ctypes/uint32_type.rb +50 -0
  95. data/lib/ronin/support/binary/ctypes/uint64_type.rb +50 -0
  96. data/lib/ronin/support/binary/ctypes/uint8_type.rb +41 -0
  97. data/lib/ronin/support/binary/ctypes/uint_type.rb +59 -0
  98. data/lib/ronin/support/binary/ctypes/unbounded_array_type.rb +258 -0
  99. data/lib/ronin/support/binary/ctypes/union_object_type.rb +173 -0
  100. data/lib/ronin/support/binary/ctypes/union_type.rb +261 -0
  101. data/lib/ronin/support/binary/ctypes.rb +462 -0
  102. data/lib/ronin/support/binary/hexdump/core_ext/file.rb +118 -0
  103. data/lib/ronin/support/binary/hexdump/core_ext/string.rb +115 -0
  104. data/lib/ronin/support/binary/hexdump/core_ext.rb +20 -0
  105. data/lib/ronin/support/binary/hexdump/parser.rb +492 -0
  106. data/lib/ronin/support/binary/hexdump.rb +20 -0
  107. data/lib/ronin/support/binary/memory.rb +268 -0
  108. data/lib/ronin/support/binary/packet.rb +33 -0
  109. data/lib/ronin/support/binary/stack.rb +256 -0
  110. data/lib/ronin/support/binary/stream/methods.rb +1755 -0
  111. data/lib/ronin/support/binary/stream.rb +151 -0
  112. data/lib/ronin/support/binary/struct/member.rb +86 -0
  113. data/lib/ronin/support/binary/struct.rb +830 -0
  114. data/lib/ronin/support/binary/template.rb +284 -0
  115. data/lib/ronin/support/binary/union.rb +162 -0
  116. data/lib/ronin/support/binary.rb +26 -0
  117. data/lib/ronin/support/cli/ansi.rb +330 -0
  118. data/lib/ronin/support/cli/io_shell/core_ext/io.rb +67 -0
  119. data/lib/ronin/{fuzzing/extensions.rb → support/cli/io_shell/core_ext.rb} +6 -7
  120. data/lib/ronin/support/cli/io_shell.rb +161 -0
  121. data/lib/ronin/support/cli/printing.rb +216 -0
  122. data/lib/ronin/support/cli.rb +20 -0
  123. data/lib/ronin/support/compression/core_ext/file.rb +70 -0
  124. data/lib/ronin/support/compression/core_ext/string.rb +101 -0
  125. data/lib/ronin/{formatting/html.rb → support/compression/core_ext.rb} +6 -7
  126. data/lib/ronin/support/compression/gzip/reader.rb +70 -0
  127. data/lib/ronin/support/compression/gzip/writer.rb +74 -0
  128. data/lib/ronin/support/compression/gzip.rb +105 -0
  129. data/lib/ronin/support/compression/mixin.rb +180 -0
  130. data/lib/ronin/{network/extensions/esmtp/net.rb → support/compression/zlib.rb} +9 -10
  131. data/lib/ronin/support/compression.rb +174 -0
  132. data/lib/ronin/{extensions → support/core_ext}/enumerable.rb +5 -6
  133. data/lib/ronin/{extensions → support/core_ext}/file.rb +11 -34
  134. data/lib/ronin/support/core_ext/integer.rb +37 -0
  135. data/lib/ronin/support/core_ext/ipaddr.rb +65 -0
  136. data/lib/ronin/{extensions → support/core_ext}/kernel.rb +10 -9
  137. data/lib/ronin/{extensions → support/core_ext}/resolv.rb +5 -28
  138. data/lib/ronin/{extensions → support/core_ext}/string.rb +117 -57
  139. data/lib/ronin/support/core_ext.rb +33 -0
  140. data/lib/ronin/support/crypto/cert.rb +522 -0
  141. data/lib/ronin/support/crypto/cert_chain.rb +204 -0
  142. data/lib/ronin/support/crypto/cipher/aes.rb +71 -0
  143. data/lib/ronin/support/crypto/cipher/aes128.rb +54 -0
  144. data/lib/ronin/support/crypto/cipher/aes256.rb +54 -0
  145. data/lib/ronin/support/crypto/cipher.rb +194 -0
  146. data/lib/ronin/support/crypto/core_ext/file.rb +660 -0
  147. data/lib/ronin/support/crypto/core_ext/string.rb +548 -0
  148. data/lib/ronin/{binary.rb → support/crypto/core_ext.rb} +7 -8
  149. data/lib/ronin/support/crypto/hmac.rb +48 -0
  150. data/lib/ronin/support/crypto/key/dh.rb +122 -0
  151. data/lib/ronin/support/crypto/key/dsa.rb +103 -0
  152. data/lib/ronin/support/crypto/key/ec.rb +99 -0
  153. data/lib/ronin/support/crypto/key/methods.rb +163 -0
  154. data/lib/ronin/support/crypto/key/rsa.rb +169 -0
  155. data/lib/ronin/support/crypto/key.rb +105 -0
  156. data/lib/ronin/support/crypto/mixin.rb +620 -0
  157. data/lib/ronin/{network/extensions/http/net.rb → support/crypto/openssl.rb} +9 -10
  158. data/lib/ronin/support/crypto.rb +779 -0
  159. data/lib/ronin/support/encoding/base16/core_ext/string.rb +63 -0
  160. data/lib/ronin/support/encoding/base16/core_ext.rb +19 -0
  161. data/lib/ronin/support/encoding/base16.rb +82 -0
  162. data/lib/ronin/support/encoding/base32/core_ext/string.rb +63 -0
  163. data/lib/ronin/support/encoding/base32/core_ext.rb +19 -0
  164. data/lib/ronin/support/encoding/base32.rb +164 -0
  165. data/lib/ronin/support/encoding/base64/core_ext/string.rb +76 -0
  166. data/lib/ronin/support/encoding/base64/core_ext.rb +19 -0
  167. data/lib/ronin/support/encoding/base64.rb +78 -0
  168. data/lib/ronin/support/encoding/c/core_ext/integer.rb +82 -0
  169. data/lib/ronin/support/encoding/c/core_ext/string.rb +125 -0
  170. data/lib/ronin/support/encoding/c/core_ext.rb +20 -0
  171. data/lib/ronin/support/encoding/c.rb +277 -0
  172. data/lib/ronin/support/encoding/core_ext/string.rb +107 -0
  173. data/lib/ronin/support/encoding/core_ext.rb +33 -0
  174. data/lib/ronin/support/encoding/hex/core_ext/integer.rb +82 -0
  175. data/lib/ronin/support/encoding/hex/core_ext/string.rb +133 -0
  176. data/lib/ronin/support/encoding/hex/core_ext.rb +22 -0
  177. data/lib/ronin/support/encoding/hex.rb +248 -0
  178. data/lib/ronin/support/encoding/html/core_ext/integer.rb +106 -0
  179. data/lib/ronin/support/encoding/html/core_ext/string.rb +130 -0
  180. data/lib/ronin/support/encoding/html/core_ext.rb +20 -0
  181. data/lib/ronin/support/encoding/html.rb +233 -0
  182. data/lib/ronin/support/encoding/http/core_ext/integer.rb +95 -0
  183. data/lib/ronin/support/encoding/http/core_ext/string.rb +129 -0
  184. data/lib/ronin/support/encoding/http/core_ext.rb +20 -0
  185. data/lib/ronin/support/encoding/http.rb +241 -0
  186. data/lib/ronin/support/encoding/js/core_ext/integer.rb +67 -0
  187. data/lib/ronin/support/encoding/js/core_ext/string.rb +125 -0
  188. data/lib/ronin/support/encoding/js/core_ext.rb +20 -0
  189. data/lib/ronin/support/encoding/js.rb +279 -0
  190. data/lib/ronin/support/encoding/powershell/core_ext/integer.rb +87 -0
  191. data/lib/ronin/support/encoding/powershell/core_ext/string.rb +145 -0
  192. data/lib/ronin/support/encoding/powershell/core_ext.rb +20 -0
  193. data/lib/ronin/support/encoding/powershell.rb +297 -0
  194. data/lib/ronin/support/encoding/punycode/core_ext/string.rb +63 -0
  195. data/lib/ronin/support/encoding/punycode/core_ext.rb +19 -0
  196. data/lib/ronin/support/encoding/punycode.rb +76 -0
  197. data/lib/ronin/support/encoding/quoted_printable/core_ext/string.rb +75 -0
  198. data/lib/ronin/support/encoding/quoted_printable/core_ext.rb +19 -0
  199. data/lib/ronin/support/encoding/quoted_printable.rb +102 -0
  200. data/lib/ronin/support/encoding/ruby/core_ext/string.rb +129 -0
  201. data/lib/ronin/{formatting/binary.rb → support/encoding/ruby/core_ext.rb} +6 -7
  202. data/lib/ronin/support/encoding/ruby.rb +235 -0
  203. data/lib/ronin/support/encoding/shell/core_ext/integer.rb +89 -0
  204. data/lib/ronin/support/encoding/shell/core_ext/string.rb +134 -0
  205. data/lib/ronin/support/encoding/shell/core_ext.rb +20 -0
  206. data/lib/ronin/support/encoding/shell.rb +293 -0
  207. data/lib/ronin/{network/extensions → support/encoding}/smtp.rb +7 -7
  208. data/lib/ronin/support/encoding/sql/core_ext/string.rb +114 -0
  209. data/lib/ronin/{formatting/http.rb → support/encoding/sql/core_ext.rb} +6 -7
  210. data/lib/ronin/support/encoding/sql.rb +124 -0
  211. data/lib/ronin/support/encoding/uri/core_ext/integer.rb +149 -0
  212. data/lib/ronin/support/encoding/uri/core_ext/string.rb +195 -0
  213. data/lib/ronin/support/encoding/uri/core_ext.rb +20 -0
  214. data/lib/ronin/support/encoding/uri.rb +424 -0
  215. data/lib/ronin/support/encoding/uuencoding/core_ext/string.rb +73 -0
  216. data/lib/ronin/support/encoding/uuencoding/core_ext.rb +19 -0
  217. data/lib/ronin/support/encoding/uuencoding.rb +70 -0
  218. data/lib/ronin/support/encoding/xml/core_ext/integer.rb +100 -0
  219. data/lib/ronin/support/encoding/xml/core_ext/string.rb +124 -0
  220. data/lib/ronin/support/encoding/xml/core_ext.rb +20 -0
  221. data/lib/ronin/support/encoding/xml.rb +328 -0
  222. data/lib/ronin/support/encoding.rb +46 -0
  223. data/lib/ronin/support/home.rb +88 -0
  224. data/lib/ronin/support/mixin.rb +42 -0
  225. data/lib/ronin/support/network/asn/dns_record.rb +112 -0
  226. data/lib/ronin/support/network/asn/list.rb +269 -0
  227. data/lib/ronin/support/network/asn/record.rb +164 -0
  228. data/lib/ronin/support/network/asn/record_set.rb +226 -0
  229. data/lib/ronin/support/network/asn.rb +88 -0
  230. data/lib/ronin/{binary/hexdump.rb → support/network/core_ext.rb} +6 -7
  231. data/lib/ronin/support/network/dns/idn.rb +38 -0
  232. data/lib/ronin/support/network/dns/mixin.rb +941 -0
  233. data/lib/ronin/support/network/dns/resolver.rb +707 -0
  234. data/lib/ronin/support/network/dns.rb +1109 -0
  235. data/lib/ronin/support/network/domain.rb +70 -0
  236. data/lib/ronin/support/network/email_address.rb +574 -0
  237. data/lib/ronin/support/network/esmtp/mixin.rb +115 -0
  238. data/lib/ronin/support/network/exceptions.rb +43 -0
  239. data/lib/ronin/support/network/ftp/mixin.rb +106 -0
  240. data/lib/ronin/support/network/host.rb +1473 -0
  241. data/lib/ronin/support/network/http/cookie.rb +245 -0
  242. data/lib/ronin/support/network/http/core_ext/uri/http.rb +63 -0
  243. data/lib/ronin/support/network/http/core_ext.rb +19 -0
  244. data/lib/ronin/support/network/http/mixin.rb +890 -0
  245. data/lib/ronin/support/network/http/request.rb +215 -0
  246. data/lib/ronin/support/network/http/set_cookie.rb +210 -0
  247. data/lib/ronin/support/network/http/user_agents.rb +115 -0
  248. data/lib/ronin/support/network/http.rb +2582 -0
  249. data/lib/ronin/support/network/imap/mixin.rb +133 -0
  250. data/lib/ronin/support/network/ip/mixin.rb +114 -0
  251. data/lib/ronin/support/network/ip.rb +540 -0
  252. data/lib/ronin/support/network/ip_range/cidr.rb +252 -0
  253. data/lib/ronin/support/network/ip_range/glob.rb +309 -0
  254. data/lib/ronin/support/network/ip_range/range.rb +249 -0
  255. data/lib/ronin/support/network/ip_range.rb +284 -0
  256. data/lib/ronin/support/network/mixin.rb +58 -0
  257. data/lib/ronin/support/network/packet.rb +27 -0
  258. data/lib/ronin/support/network/pop3/mixin.rb +113 -0
  259. data/lib/ronin/support/network/proxy.rb +602 -0
  260. data/lib/ronin/support/network/public_suffix/list.rb +339 -0
  261. data/lib/ronin/support/network/public_suffix/suffix.rb +118 -0
  262. data/lib/ronin/support/network/public_suffix/suffix_set.rb +150 -0
  263. data/lib/ronin/support/network/public_suffix.rb +41 -0
  264. data/lib/ronin/support/network/smtp/email.rb +190 -0
  265. data/lib/ronin/support/network/smtp/mixin.rb +290 -0
  266. data/lib/ronin/{extensions/meta.rb → support/network/smtp.rb} +6 -7
  267. data/lib/ronin/support/network/ssl/local_cert.rb +114 -0
  268. data/lib/ronin/support/network/ssl/local_key.rb +84 -0
  269. data/lib/ronin/support/network/ssl/mixin.rb +740 -0
  270. data/lib/ronin/{network/extensions/imap/net.rb → support/network/ssl/openssl.rb} +9 -10
  271. data/lib/ronin/support/network/ssl/proxy.rb +296 -0
  272. data/lib/ronin/support/network/ssl.rb +173 -0
  273. data/lib/ronin/support/network/tcp/mixin.rb +400 -0
  274. data/lib/ronin/support/network/tcp/proxy.rb +435 -0
  275. data/lib/ronin/support/network/tcp.rb +443 -0
  276. data/lib/ronin/support/network/telnet/mixin.rb +150 -0
  277. data/lib/ronin/support/network/telnet.rb +90 -0
  278. data/lib/ronin/support/network/tld/list.rb +266 -0
  279. data/lib/ronin/support/network/tld.rb +41 -0
  280. data/lib/ronin/support/network/tls/mixin.rb +670 -0
  281. data/lib/ronin/support/network/tls/proxy.rb +135 -0
  282. data/lib/ronin/support/network/tls.rb +53 -0
  283. data/lib/ronin/support/network/udp/mixin.rb +389 -0
  284. data/lib/ronin/support/network/udp/proxy.rb +192 -0
  285. data/lib/ronin/support/network/udp.rb +435 -0
  286. data/lib/ronin/support/network/unix/mixin.rb +273 -0
  287. data/lib/ronin/support/network.rb +37 -0
  288. data/lib/ronin/support/path.rb +136 -0
  289. data/lib/ronin/{network/extensions/dns/net.rb → support/text/core_ext/regexp.rb} +8 -9
  290. data/lib/ronin/support/text/core_ext/string.rb +46 -0
  291. data/lib/ronin/support/text/core_ext.rb +23 -0
  292. data/lib/ronin/support/text/entropy/core_ext/string.rb +45 -0
  293. data/lib/ronin/support/text/entropy/core_ext.rb +19 -0
  294. data/lib/ronin/support/text/entropy.rb +66 -0
  295. data/lib/ronin/support/text/erb/mixin.rb +44 -0
  296. data/lib/ronin/support/text/erb.rb +19 -0
  297. data/lib/ronin/support/text/homoglyph/core_ext/string.rb +108 -0
  298. data/lib/ronin/{formatting/digest.rb → support/text/homoglyph/core_ext.rb} +6 -7
  299. data/lib/ronin/{network/http/exceptions/unknown_request.rb → support/text/homoglyph/exceptions.rb} +10 -9
  300. data/lib/ronin/support/text/homoglyph/table.rb +228 -0
  301. data/lib/ronin/support/text/homoglyph.rb +142 -0
  302. data/lib/ronin/support/text/mixin.rb +31 -0
  303. data/lib/ronin/support/text/patterns/credentials.rb +75 -0
  304. data/lib/ronin/support/text/patterns/crypto.rb +67 -0
  305. data/lib/ronin/support/text/patterns/file_system.rb +93 -0
  306. data/lib/ronin/support/text/patterns/language.rb +37 -0
  307. data/lib/ronin/support/text/patterns/network/public_suffix.rb +44 -0
  308. data/lib/ronin/support/text/patterns/network.rb +140 -0
  309. data/lib/ronin/support/text/patterns/numeric.rb +52 -0
  310. data/lib/ronin/support/text/patterns/pii.rb +105 -0
  311. data/lib/ronin/support/text/patterns/source_code.rb +148 -0
  312. data/lib/ronin/support/text/patterns.rb +25 -0
  313. data/lib/ronin/support/text/random/mixin.rb +437 -0
  314. data/lib/ronin/support/text/random.rb +419 -0
  315. data/lib/ronin/support/text/typo/core_ext/string.rb +123 -0
  316. data/lib/ronin/support/text/typo/core_ext.rb +19 -0
  317. data/lib/ronin/support/text/typo/exceptions.rb +28 -0
  318. data/lib/ronin/support/text/typo/generator.rb +161 -0
  319. data/lib/ronin/support/text/typo.rb +260 -0
  320. data/lib/ronin/support/text.rb +26 -0
  321. data/lib/ronin/support/version.rb +6 -7
  322. data/lib/ronin/support.rb +20 -15
  323. data/ronin-support.gemspec +3 -1
  324. metadata +462 -369
  325. data/.gemtest +0 -0
  326. data/lib/ronin/binary/hexdump/parser.rb +0 -403
  327. data/lib/ronin/binary/struct.rb +0 -567
  328. data/lib/ronin/binary/template.rb +0 -454
  329. data/lib/ronin/extensions/ip_addr.rb +0 -217
  330. data/lib/ronin/extensions/meta/object.rb +0 -24
  331. data/lib/ronin/extensions/regexp.rb +0 -157
  332. data/lib/ronin/extensions.rb +0 -29
  333. data/lib/ronin/formatting/extensions/binary/array.rb +0 -61
  334. data/lib/ronin/formatting/extensions/binary/base64.rb +0 -106
  335. data/lib/ronin/formatting/extensions/binary/file.rb +0 -77
  336. data/lib/ronin/formatting/extensions/binary/float.rb +0 -65
  337. data/lib/ronin/formatting/extensions/binary/integer.rb +0 -180
  338. data/lib/ronin/formatting/extensions/binary/string.rb +0 -345
  339. data/lib/ronin/formatting/extensions/binary.rb +0 -26
  340. data/lib/ronin/formatting/extensions/digest/file.rb +0 -129
  341. data/lib/ronin/formatting/extensions/digest/string.rb +0 -86
  342. data/lib/ronin/formatting/extensions/digest.rb +0 -21
  343. data/lib/ronin/formatting/extensions/html/integer.rb +0 -142
  344. data/lib/ronin/formatting/extensions/html/string.rb +0 -194
  345. data/lib/ronin/formatting/extensions/html.rb +0 -21
  346. data/lib/ronin/formatting/extensions/http/integer.rb +0 -69
  347. data/lib/ronin/formatting/extensions/http/string.rb +0 -110
  348. data/lib/ronin/formatting/extensions/http.rb +0 -21
  349. data/lib/ronin/formatting/extensions/sql/string.rb +0 -128
  350. data/lib/ronin/formatting/extensions/sql.rb +0 -20
  351. data/lib/ronin/formatting/extensions/text/array.rb +0 -137
  352. data/lib/ronin/formatting/extensions/text/string.rb +0 -297
  353. data/lib/ronin/formatting/extensions.rb +0 -24
  354. data/lib/ronin/formatting/text.rb +0 -20
  355. data/lib/ronin/formatting.rb +0 -25
  356. data/lib/ronin/fuzzing/extensions/string.rb +0 -209
  357. data/lib/ronin/fuzzing/fuzzer.rb +0 -110
  358. data/lib/ronin/fuzzing/fuzzing.rb +0 -360
  359. data/lib/ronin/fuzzing/mutator.rb +0 -161
  360. data/lib/ronin/fuzzing/repeater.rb +0 -81
  361. data/lib/ronin/fuzzing/template.rb +0 -133
  362. data/lib/ronin/fuzzing.rb +0 -21
  363. data/lib/ronin/mixin.rb +0 -89
  364. data/lib/ronin/network/dns.rb +0 -201
  365. data/lib/ronin/network/esmtp.rb +0 -113
  366. data/lib/ronin/network/extensions/dns.rb +0 -20
  367. data/lib/ronin/network/extensions/esmtp.rb +0 -20
  368. data/lib/ronin/network/extensions/http/uri/http.rb +0 -228
  369. data/lib/ronin/network/extensions/http.rb +0 -21
  370. data/lib/ronin/network/extensions/imap.rb +0 -20
  371. data/lib/ronin/network/extensions/pop3/net.rb +0 -24
  372. data/lib/ronin/network/extensions/pop3.rb +0 -20
  373. data/lib/ronin/network/extensions/smtp/net.rb +0 -24
  374. data/lib/ronin/network/extensions/ssl/net.rb +0 -24
  375. data/lib/ronin/network/extensions/ssl.rb +0 -20
  376. data/lib/ronin/network/extensions/tcp/net.rb +0 -24
  377. data/lib/ronin/network/extensions/tcp.rb +0 -20
  378. data/lib/ronin/network/extensions/telnet/net.rb +0 -24
  379. data/lib/ronin/network/extensions/telnet.rb +0 -20
  380. data/lib/ronin/network/extensions/udp/net.rb +0 -24
  381. data/lib/ronin/network/extensions/udp.rb +0 -20
  382. data/lib/ronin/network/extensions.rb +0 -29
  383. data/lib/ronin/network/ftp.rb +0 -149
  384. data/lib/ronin/network/http/exceptions.rb +0 -20
  385. data/lib/ronin/network/http/http.rb +0 -1127
  386. data/lib/ronin/network/http/proxy.rb +0 -330
  387. data/lib/ronin/network/http.rb +0 -22
  388. data/lib/ronin/network/imap.rb +0 -158
  389. data/lib/ronin/network/mixins/dns.rb +0 -55
  390. data/lib/ronin/network/mixins/esmtp.rb +0 -164
  391. data/lib/ronin/network/mixins/ftp.rb +0 -155
  392. data/lib/ronin/network/mixins/http.rb +0 -227
  393. data/lib/ronin/network/mixins/imap.rb +0 -156
  394. data/lib/ronin/network/mixins/mixin.rb +0 -58
  395. data/lib/ronin/network/mixins/pop3.rb +0 -149
  396. data/lib/ronin/network/mixins/smtp.rb +0 -159
  397. data/lib/ronin/network/mixins/ssl.rb +0 -148
  398. data/lib/ronin/network/mixins/tcp.rb +0 -368
  399. data/lib/ronin/network/mixins/telnet.rb +0 -208
  400. data/lib/ronin/network/mixins/udp.rb +0 -381
  401. data/lib/ronin/network/mixins/unix.rb +0 -279
  402. data/lib/ronin/network/mixins.rb +0 -29
  403. data/lib/ronin/network/network.rb +0 -45
  404. data/lib/ronin/network/pop3.rb +0 -124
  405. data/lib/ronin/network/proxy.rb +0 -578
  406. data/lib/ronin/network/smtp/email.rb +0 -174
  407. data/lib/ronin/network/smtp/smtp.rb +0 -230
  408. data/lib/ronin/network/smtp.rb +0 -22
  409. data/lib/ronin/network/ssl.rb +0 -186
  410. data/lib/ronin/network/tcp/proxy.rb +0 -417
  411. data/lib/ronin/network/tcp/tcp.rb +0 -443
  412. data/lib/ronin/network/tcp.rb +0 -21
  413. data/lib/ronin/network/telnet.rb +0 -264
  414. data/lib/ronin/network/udp/proxy.rb +0 -191
  415. data/lib/ronin/network/udp/udp.rb +0 -450
  416. data/lib/ronin/network/udp.rb +0 -21
  417. data/lib/ronin/network/unix.rb +0 -286
  418. data/lib/ronin/network.rb +0 -31
  419. data/lib/ronin/path.rb +0 -137
  420. data/lib/ronin/spec/ui/output.rb +0 -22
  421. data/lib/ronin/support/inflector.rb +0 -92
  422. data/lib/ronin/support/support.rb +0 -42
  423. data/lib/ronin/templates/erb.rb +0 -78
  424. data/lib/ronin/templates/template.rb +0 -169
  425. data/lib/ronin/templates.rb +0 -21
  426. data/lib/ronin/ui/output/helpers.rb +0 -296
  427. data/lib/ronin/ui/output/output.rb +0 -146
  428. data/lib/ronin/ui/output/terminal/color.rb +0 -124
  429. data/lib/ronin/ui/output/terminal/raw.rb +0 -103
  430. data/lib/ronin/ui/output/terminal.rb +0 -21
  431. data/lib/ronin/ui/output.rb +0 -21
  432. data/lib/ronin/ui/shell.rb +0 -286
  433. data/lib/ronin/wordlist.rb +0 -287
  434. data/spec/binary/hexdump/helpers/hexdumps/ascii.bin +0 -0
  435. data/spec/binary/hexdump/helpers/hexdumps/hexdump_decimal_shorts.txt +0 -17
  436. data/spec/binary/hexdump/helpers/hexdumps/hexdump_hex_bytes.txt +0 -17
  437. data/spec/binary/hexdump/helpers/hexdumps/hexdump_hex_shorts.txt +0 -17
  438. data/spec/binary/hexdump/helpers/hexdumps/hexdump_octal_bytes.txt +0 -17
  439. data/spec/binary/hexdump/helpers/hexdumps/hexdump_octal_shorts.txt +0 -17
  440. data/spec/binary/hexdump/helpers/hexdumps/hexdump_repeated.txt +0 -6
  441. data/spec/binary/hexdump/helpers/hexdumps/od_decimal_bytes.txt +0 -17
  442. data/spec/binary/hexdump/helpers/hexdumps/od_decimal_ints.txt +0 -17
  443. data/spec/binary/hexdump/helpers/hexdumps/od_decimal_quads.txt +0 -17
  444. data/spec/binary/hexdump/helpers/hexdumps/od_decimal_shorts.txt +0 -17
  445. data/spec/binary/hexdump/helpers/hexdumps/od_doubles.txt +0 -17
  446. data/spec/binary/hexdump/helpers/hexdumps/od_floats.txt +0 -17
  447. data/spec/binary/hexdump/helpers/hexdumps/od_hex_bytes.txt +0 -17
  448. data/spec/binary/hexdump/helpers/hexdumps/od_hex_ints.txt +0 -17
  449. data/spec/binary/hexdump/helpers/hexdumps/od_hex_quads.txt +0 -17
  450. data/spec/binary/hexdump/helpers/hexdumps/od_hex_shorts.txt +0 -17
  451. data/spec/binary/hexdump/helpers/hexdumps/od_named_chars.txt +0 -17
  452. data/spec/binary/hexdump/helpers/hexdumps/od_octal_bytes.txt +0 -17
  453. data/spec/binary/hexdump/helpers/hexdumps/od_octal_ints.txt +0 -17
  454. data/spec/binary/hexdump/helpers/hexdumps/od_octal_quads.txt +0 -17
  455. data/spec/binary/hexdump/helpers/hexdumps/od_octal_shorts.txt +0 -17
  456. data/spec/binary/hexdump/helpers/hexdumps/od_repeated.txt +0 -6
  457. data/spec/binary/hexdump/helpers/hexdumps/repeated.bin +0 -1
  458. data/spec/binary/hexdump/helpers/hexdumps.rb +0 -13
  459. data/spec/binary/hexdump/parser_spec.rb +0 -302
  460. data/spec/binary/struct_spec.rb +0 -496
  461. data/spec/binary/template_spec.rb +0 -414
  462. data/spec/extensions/enumerable_spec.rb +0 -24
  463. data/spec/extensions/file_spec.rb +0 -63
  464. data/spec/extensions/ip_addr_spec.rb +0 -203
  465. data/spec/extensions/kernel_spec.rb +0 -30
  466. data/spec/extensions/regexp_spec.rb +0 -482
  467. data/spec/extensions/resolv_spec.rb +0 -18
  468. data/spec/extensions/string_spec.rb +0 -179
  469. data/spec/formatting/binary/array_spec.rb +0 -26
  470. data/spec/formatting/binary/base64_spec.rb +0 -50
  471. data/spec/formatting/binary/float_spec.rb +0 -34
  472. data/spec/formatting/binary/integer_spec.rb +0 -166
  473. data/spec/formatting/binary/string_spec.rb +0 -197
  474. data/spec/formatting/digest/string_spec.rb +0 -82
  475. data/spec/formatting/html/integer_spec.rb +0 -66
  476. data/spec/formatting/html/string_spec.rb +0 -103
  477. data/spec/formatting/http/integer_spec.rb +0 -42
  478. data/spec/formatting/http/string_spec.rb +0 -76
  479. data/spec/formatting/sql/string_spec.rb +0 -75
  480. data/spec/formatting/text/array_spec.rb +0 -105
  481. data/spec/formatting/text/string_spec.rb +0 -162
  482. data/spec/fuzzing/extensions/string_spec.rb +0 -87
  483. data/spec/fuzzing/fuzzer_spec.rb +0 -109
  484. data/spec/fuzzing/fuzzing_spec.rb +0 -24
  485. data/spec/fuzzing/mutator_spec.rb +0 -112
  486. data/spec/fuzzing/repeater_spec.rb +0 -57
  487. data/spec/fuzzing/template_spec.rb +0 -54
  488. data/spec/mixin_spec.rb +0 -53
  489. data/spec/network/dns_spec.rb +0 -201
  490. data/spec/network/ftp_spec.rb +0 -81
  491. data/spec/network/http/http_spec.rb +0 -466
  492. data/spec/network/http/proxy_spec.rb +0 -148
  493. data/spec/network/network_spec.rb +0 -8
  494. data/spec/network/proxy_spec.rb +0 -121
  495. data/spec/network/shared/unix_server.rb +0 -31
  496. data/spec/network/smtp/email_spec.rb +0 -100
  497. data/spec/network/ssl_spec.rb +0 -70
  498. data/spec/network/tcp/proxy_spec.rb +0 -116
  499. data/spec/network/tcp/tcp_spec.rb +0 -273
  500. data/spec/network/telnet_spec.rb +0 -67
  501. data/spec/network/udp/udp_spec.rb +0 -271
  502. data/spec/network/unix_spec.rb +0 -183
  503. data/spec/path_spec.rb +0 -86
  504. data/spec/spec_helper.rb +0 -9
  505. data/spec/support/inflector_spec.rb +0 -22
  506. data/spec/support_spec.rb +0 -8
  507. data/spec/templates/classes/example_erb.rb +0 -11
  508. data/spec/templates/classes/example_template.rb +0 -35
  509. data/spec/templates/erb_spec.rb +0 -21
  510. data/spec/templates/helpers/data/includes/_relative.erb +0 -1
  511. data/spec/templates/helpers/data/templates/example.erb +0 -1
  512. data/spec/templates/helpers/data.rb +0 -9
  513. data/spec/templates/template_spec.rb +0 -54
  514. data/spec/ui/classes/test_shell.rb +0 -22
  515. data/spec/ui/output_spec.rb +0 -32
  516. data/spec/ui/shell_spec.rb +0 -83
  517. data/spec/wordlist_spec.rb +0 -151
@@ -0,0 +1,830 @@
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/memory'
20
+ require 'ronin/support/binary/struct/member'
21
+ require 'ronin/support/binary/ctypes/mixin'
22
+ require 'ronin/support/binary/ctypes/type_resolver'
23
+ require 'ronin/support/binary/array'
24
+
25
+ module Ronin
26
+ module Support
27
+ module Binary
28
+ #
29
+ # Generic Binary Struct class.
30
+ #
31
+ # @note This class provides lazy memory mapped access to an underlying
32
+ # buffer. This means values are decoded/encoded each time they are read
33
+ # or written to.
34
+ #
35
+ # ## Examples
36
+ #
37
+ # ### Defining Members
38
+ #
39
+ # class Point < Ronin::Support::Binary::Struct
40
+ #
41
+ # member :x, :int32
42
+ # member :y, :int32
43
+ #
44
+ # end
45
+ #
46
+ # ### Initializing Structs
47
+ #
48
+ # From a Hash:
49
+ #
50
+ # point = Point.new(x: 1, y: 2)
51
+ #
52
+ # From a buffer:
53
+ #
54
+ # point = Point.new("\x01\x00\x00\x00\xFF\xFF\xFF\xFF")
55
+ #
56
+ # ### Reading Fields
57
+ #
58
+ # point = Point.new("\x01\x00\x00\x00\xFF\xFF\xFF\xFF")
59
+ # point[:x]
60
+ # # => 1
61
+ # point[:y]
62
+ # # => -1
63
+ #
64
+ # point.x
65
+ # # => 1
66
+ # point.y
67
+ # # => -1
68
+ #
69
+ # ### Packing Structs
70
+ #
71
+ # class Point < Ronin::Support::Binary::Struct
72
+ #
73
+ # member :x, :int32
74
+ # member :y, :int32
75
+ #
76
+ # end
77
+ #
78
+ # point = Point.new(x: 10, y: -1)
79
+ # point.pack
80
+ # # => "\n\x00\x00\x00\xFF\xFF\xFF\xFF"
81
+ #
82
+ # ### Unpacking Structs
83
+ #
84
+ # class Point < Ronin::Support::Binary::Struct
85
+ #
86
+ # member :x, :int32
87
+ # member :y, :int32
88
+ #
89
+ # end
90
+ #
91
+ # point = Point.unpack("\x00\x00\x00\x01\xFF\xFF\xFF\xFF")
92
+ # point.x
93
+ # # => 1
94
+ # point.y
95
+ # # => -1
96
+ #
97
+ # ### Inheriting Structs
98
+ #
99
+ # class Point < Ronin::Support::Binary::Struct
100
+ #
101
+ # member :x, :int32
102
+ # member :y, :int32
103
+ #
104
+ # end
105
+ #
106
+ # class Point3D < Point
107
+ #
108
+ # member :z, :int32
109
+ #
110
+ # end
111
+ #
112
+ # point = Point.new(x: 100, y: 42)
113
+ # point3d = Point3D.new(x: 100, y: 42, z: -1)
114
+ #
115
+ # ### Array Fields
116
+ #
117
+ # class MyStruct < Ronin::Support::Binary::Struct
118
+ #
119
+ # member :x, :uint32
120
+ # member :nums, [:uint8, 10]
121
+ #
122
+ # end
123
+ #
124
+ # struct = MyStruct.new
125
+ # struct.nums = [0x01, 0x02, 0x03, 0x04]
126
+ # struct.pack
127
+ # # => "\x00\x00\x00\x00\x01\x02\x03\x04\x00\x00\x00\x00\x00\x00"
128
+ #
129
+ # ### Unbounded Array Fields
130
+ #
131
+ # class MyStruct < Ronin::Support::Binary::Struct
132
+ #
133
+ # member :length, :uint32
134
+ # member :payload, (:uint8..)
135
+ #
136
+ # end
137
+ #
138
+ # struct = MyStruct.new
139
+ # struct.payload = [0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08]
140
+ # struct.pack
141
+ # # => "\x00\x00\x00\x00\x01\x02\x03\x04\x05\x06\a\b"
142
+ #
143
+ # ### Struct Endianness
144
+ #
145
+ # class MyStruct < Ronin::Support::Binary::Struct
146
+ #
147
+ # platform endian: :big
148
+ #
149
+ # member :x, :uint32
150
+ # member :y, :uint32
151
+ #
152
+ # end
153
+ #
154
+ # struct = MyStruct.new
155
+ # struct.x = 0xAABB
156
+ # struct.y = 0xCCDD
157
+ # struct.pack
158
+ # # => "\x00\x00\xAA\xBB\x00\x00\xCC\xDD"
159
+ #
160
+ # ### Struct Architecture
161
+ #
162
+ # class MyStruct < Ronin::Support::Binary::Struct
163
+ #
164
+ # platform arch: :arm64_be
165
+ #
166
+ # member :x, :int
167
+ # member :y, :int
168
+ # member :f, :double
169
+ #
170
+ # end
171
+ #
172
+ # struct = MyStruct.new
173
+ # struct.x = 100
174
+ # struct.y = -100
175
+ # struct.f = (90 / Math::PI)
176
+ # struct.pack
177
+ # # => "\x00\x00\x00d\xFF\xFF\xFF\x9C@<\xA5\xDC\x1Ac\xC1\xF8"
178
+ #
179
+ # ### Struct Operating System (OS)
180
+ #
181
+ # class MyStruct < Ronin::Support::Binary::Struct
182
+ #
183
+ # platform arch: :x86_64, os: :windows
184
+ #
185
+ # member :x, :long
186
+ # member :y, :long
187
+ #
188
+ # end
189
+ #
190
+ # struct = MyStruct.new
191
+ # struct.x = 255
192
+ # struct.y = -1
193
+ # struct.pack
194
+ # # => "\xFF\x00\x00\x00\xFF\xFF\xFF\xFF"
195
+ #
196
+ # ### Struct Alignment
197
+ #
198
+ # class Pixel < Ronin::Support::Binary::Struct
199
+ #
200
+ # align 4
201
+ #
202
+ # member :r, :uint8
203
+ # member :g, :uint8
204
+ # member :b, :uint8
205
+ #
206
+ # end
207
+ #
208
+ # class PixelBuf < Ronin::Support::Binary::Struct
209
+ #
210
+ # member :count, :uint8
211
+ # member :pixels, [Pixel, 255]
212
+ #
213
+ # end
214
+ #
215
+ # pixelbuf = PixelBuf.new
216
+ # pixelbuf.count = 2
217
+ # pixelbuf.pixels[0].r = 0xAA
218
+ # pixelbuf.pixels[0].g = 0xBB
219
+ # pixelbuf.pixels[0].b = 0xCC
220
+ # pixelbuf.pixels[1].r = 0xAA
221
+ # pixelbuf.pixels[1].g = 0xBB
222
+ # pixelbuf.pixels[1].b = 0xCC
223
+ # pixelbuf.pack
224
+ # # => "\x02\x00\x00\x00\xAA\xBB\xCC\xAA\xBB\xCC..."
225
+ #
226
+ # ### Disable Struct Padding
227
+ #
228
+ # class MyStruct < Ronin::Support::Binary::Struct
229
+ #
230
+ # padding false
231
+ #
232
+ # member :c, :char
233
+ # member :i, :int32
234
+ #
235
+ # end
236
+ #
237
+ # struct = MyStruct.new
238
+ # struct.c = 'A'
239
+ # struct.i = -1
240
+ # struct.pack
241
+ # # => "A\xFF\xFF\xFF\xFF"
242
+ #
243
+ # @api public
244
+ #
245
+ class Struct < Memory
246
+
247
+ # The type system used by the struct.
248
+ #
249
+ # @return [CTypes::StructType]
250
+ #
251
+ # @api private
252
+ attr_reader :type
253
+
254
+ #
255
+ # Initializes the struct.
256
+ #
257
+ # @param [Hash{Symbol => Object}, String, ByteSlice] buffer_or_values
258
+ # Optional values to initialize the members of the struct.
259
+ #
260
+ # @example Initiializing a new struct from a buffer:
261
+ # class MyStruct < Ronin::Support::Binary::Struct
262
+ #
263
+ # member :x, :uint32
264
+ # member :f, :double
265
+ # member :nums, [:uint8, 10]
266
+ #
267
+ # end
268
+ #
269
+ # struct = MyStruct.new("\x01\x00\x00\x00\x00\x00\x00\x00333333\xD3?\x01\x02\x03\x00\x00\x00\x00\x00\x00\x00")
270
+ # struct.x
271
+ # # => 1
272
+ # struct.f
273
+ # # => 0.3
274
+ # struct.nums.to_a
275
+ # # => [1, 2, 3, 0, 0, 0, 0, 0, 0, 0]
276
+ #
277
+ # @example Initializing a new struct with values:
278
+ # struct = MyStruct.new(x: 1, f: 0.3, nums: [1,2,3])
279
+ # struct.x
280
+ # # => 1
281
+ # struct.f
282
+ # # => 0.3
283
+ # struct.nums.to_a
284
+ # # => [1, 2, 3, 0, 0, 0, 0, 0, 0, 0]
285
+ #
286
+ # @api public
287
+ #
288
+ def initialize(buffer_or_values={})
289
+ @type_system = self.class.type_system
290
+ @type = self.class.type
291
+
292
+ @cache = {}
293
+
294
+ case buffer_or_values
295
+ when Hash
296
+ super(@type.size)
297
+
298
+ values = buffer_or_values
299
+ values.each do |name,value|
300
+ self[name] = value
301
+ end
302
+ when String, ByteSlice
303
+ buffer = buffer_or_values
304
+
305
+ super(buffer)
306
+ else
307
+ raise(ArgumentError,"first argument of #{self.class}.new must be either a Hash of values or a String or #{ByteSlice}")
308
+ end
309
+ end
310
+
311
+ #
312
+ # The type for the struct class.
313
+ #
314
+ # @return [CTypes::StructObjectType]
315
+ # The underlying type.
316
+ #
317
+ # @api semipublic
318
+ #
319
+ def self.type
320
+ @type ||= type_resolver.resolve(self)
321
+ end
322
+
323
+ #
324
+ # The size of the struct.
325
+ #
326
+ # @return [Integer]
327
+ # The size of the struct in bytes.
328
+ #
329
+ # @example
330
+ # class MyStruct < Ronin::Support::Binary::Struct
331
+ #
332
+ # member :x, :uint32
333
+ # member :y, :uint32
334
+ #
335
+ # end
336
+ #
337
+ # MyStruct.size
338
+ # # => 8
339
+ #
340
+ # @api public
341
+ #
342
+ def self.size
343
+ type.size
344
+ end
345
+
346
+ #
347
+ # Translates the struct class using the given type system into a new
348
+ # struct class.
349
+ #
350
+ # @param [:little, :big, :net, nil] endian
351
+ # The desired endian-ness.
352
+ #
353
+ # @param [:x86, :x86_64,
354
+ # :ppc, :ppc64,
355
+ # :mips, :mips_le, :mips_be,
356
+ # :mips64, :mips64_le, :mips64_be,
357
+ # :arm, :arm_le, :arm_be,
358
+ # :arm64, :arm64_le, :arm64_be, nil] arch
359
+ # The new architecture for the struct.
360
+ #
361
+ # @return [Class<Struct>]
362
+ #
363
+ def self.translate(endian: nil, arch: nil)
364
+ struct_class = Class.new(self)
365
+
366
+ if arch then struct_class.arch(arch)
367
+ elsif endian then struct_class.endian(endian)
368
+ end
369
+
370
+ struct_class
371
+ end
372
+
373
+ #
374
+ # The members in the struct.
375
+ #
376
+ # @return [Hash{Symbol => Member}]
377
+ # The member names and type information.
378
+ #
379
+ # @api semipublic
380
+ #
381
+ def self.members
382
+ @members ||= if superclass < Struct
383
+ superclass.members.dup
384
+ else
385
+ {}
386
+ end
387
+ end
388
+
389
+ #
390
+ # Determines if the struct has the given member.
391
+ #
392
+ # @param [Symbol] name
393
+ # The member name.
394
+ #
395
+ # @return [Boolean]
396
+ # Specifies that the member exists in the struct.
397
+ #
398
+ # @api semipublic
399
+ #
400
+ def self.has_member?(name)
401
+ members.has_key?(name.to_sym)
402
+ end
403
+
404
+ #
405
+ # Initializes the struct and then packs it.
406
+ #
407
+ # @param [Hash{Symbol => Object}] values
408
+ # The values to initialize the struct with.
409
+ #
410
+ # @return [String]
411
+ # The packed struct.
412
+ #
413
+ # @example
414
+ # class MyStruct < Ronin::Support::Binary::Struct
415
+ #
416
+ # member :x, :uint32
417
+ # member :f, :double
418
+ # member :nums, [:uint8, 10]
419
+ #
420
+ # end
421
+ #
422
+ # MyStruct.pack(x: 1, f: 0.3, nums: [1,2,3])
423
+ # # => "\x01\x00\x00\x00\x00\x00\x00\x00333333\xD3?\x01\x02\x03\x00\x00\x00\x00\x00\x00\x00"
424
+ #
425
+ # @api public
426
+ #
427
+ def self.pack(values)
428
+ new(values).to_s
429
+ end
430
+
431
+ #
432
+ # Unpacks data into the struct.
433
+ #
434
+ # @param [String] data
435
+ # The data to unpack.
436
+ #
437
+ # @return [Struct]
438
+ # The newly unpacked struct.
439
+ #
440
+ # @example
441
+ # class MyStruct < Ronin::Support::Binary::Struct
442
+ #
443
+ # member :x, :uint32
444
+ # member :f, :double
445
+ # member :nums, [:uint8, 10]
446
+ #
447
+ # end
448
+ #
449
+ # struct = MyStruct.unpack("\x01\x00\x00\x00\x00\x00\x00\x00333333\xD3?\x01\x02\x03\x00\x00\x00\x00\x00\x00\x00")
450
+ #
451
+ # @api public
452
+ #
453
+ def self.unpack(data)
454
+ new(data)
455
+ end
456
+
457
+ #
458
+ # Reads the struct from the IO stream.
459
+ #
460
+ # @param [IO] io
461
+ # The IO object to read from.
462
+ #
463
+ # @return [Struct]
464
+ # The read struct.
465
+ #
466
+ # @example
467
+ # class MyStruct < Ronin::Support::Binary::Struct
468
+ #
469
+ # member :x, :uint32
470
+ # member :f, :double
471
+ # member :nums, [:uint8, 10]
472
+ #
473
+ # end
474
+ #
475
+ # file = File.new('binary.dat','b')
476
+ # struct = MyStruct.read_from(file)
477
+ #
478
+ # @see #read_from
479
+ #
480
+ # @api public
481
+ #
482
+ def self.read_from(io)
483
+ new().read_from(io)
484
+ end
485
+
486
+ #
487
+ # Reads a value from the struct.
488
+ #
489
+ # @param [Symbol] name
490
+ # The member name.
491
+ #
492
+ # @return [Integer, Float, String, Binary::Array, Binary::Struct]
493
+ # The value of the member.
494
+ #
495
+ # @raise [ArgumentError]
496
+ # The struct does not contain the member.
497
+ #
498
+ # @example
499
+ # class MyStruct < Ronin::Support::Binary::Struct
500
+ #
501
+ # member :x, :uint32
502
+ # member :f, :double
503
+ # member :nums, [:uint8, 10]
504
+ #
505
+ # end
506
+ #
507
+ # struct = MyStruct.new("\x01\x00\x00\x00\x00\x00\x00\x00333333\xD3?\x01\x02\x03\x00\x00\x00\x00\x00\x00\x00")
508
+ # struct[:x]
509
+ # # => 1
510
+ # struct[:f]
511
+ # # => 0.3
512
+ # struct[:nums].to_a
513
+ # # => [1, 2, 3, 0, 0, 0, 0, 0, 0, 0]
514
+ #
515
+ # @api public
516
+ #
517
+ def [](name)
518
+ if (member = @type.members[name])
519
+ case member.type
520
+ when CTypes::UnboundedArrayType
521
+ # XXX: but how do we handle an unbounded array of structs?
522
+ @cache[name] ||= (
523
+ slice = byteslice(member.offset,size - member.offset)
524
+ Binary::Array.new(member.type.type,slice)
525
+ )
526
+ when CTypes::ObjectType
527
+ @cache[name] ||= (
528
+ slice = byteslice(member.offset,member.type.size)
529
+ member.type.unpack(slice)
530
+ )
531
+ else
532
+ data = super(member.offset,member.type.size)
533
+ member.type.unpack(data)
534
+ end
535
+ else
536
+ raise(ArgumentError,"no such member: #{name.inspect}")
537
+ end
538
+ end
539
+
540
+ #
541
+ # Writes a value to the struct.
542
+ #
543
+ # @param [Symbol] name
544
+ # The member name.
545
+ #
546
+ # @param [Integer, Float, String, Array, Struct] value
547
+ # The value to write.
548
+ #
549
+ # @return [Integer, Float, String, Array, Struct]
550
+ # The value of the member.
551
+ #
552
+ # @raise [ArgumentError]
553
+ # The struct does not contain the member.
554
+ #
555
+ # @example
556
+ # class MyStruct < Ronin::Support::Binary::Struct
557
+ #
558
+ # member :x, :uint32
559
+ # member :f, :double
560
+ # member :nums, [:uint8, 10]
561
+ #
562
+ # end
563
+ #
564
+ # struct = MyStruct.new
565
+ # struct[:x] = 1
566
+ # struct[:x]
567
+ # # => 1
568
+ # struct[:f] = 0.3
569
+ # struct[:f]
570
+ # # => 0.3
571
+ # struct[:nums] = [1,2,3]
572
+ # struct[:nums].to_a
573
+ # # => [1, 2, 3, 0, 0, 0, 0, 0, 0, 0]
574
+ #
575
+ # @api public
576
+ #
577
+ def []=(name,value)
578
+ if (member = @type.members[name])
579
+ data = member.type.pack(value)
580
+
581
+ super(member.offset,member.type.size,data)
582
+ return value
583
+ else
584
+ raise(ArgumentError,"no such member: #{name.inspect}")
585
+ end
586
+ end
587
+
588
+ #
589
+ # Enumerates over the members within the struct.
590
+ #
591
+ # @yield [name, value]
592
+ # If a block is given, it will be passed each member name and value
593
+ # from within the struct.
594
+ #
595
+ # @yieldparam [Symbol] name
596
+ # The name of the struct memeber.
597
+ #
598
+ # @yieldparam [Object] value
599
+ # The decoded value of the struct member.
600
+ #
601
+ # @return [Enumerator]
602
+ # If no block is given, an Enumerator object will be returned.
603
+ #
604
+ # @api public
605
+ #
606
+ def each(&block)
607
+ return enum_for(__method__) unless block_given?
608
+
609
+ @type.members.each_key do |name|
610
+ yield name, self[name]
611
+ end
612
+ end
613
+
614
+ #
615
+ # Converts the struct to a Hash.
616
+ #
617
+ # @return [Hash{Symbol => Object}]
618
+ # The hash of member names and values.
619
+ #
620
+ # @api public
621
+ #
622
+ def to_h
623
+ Hash[@type.members.keys.map { |name|
624
+ [name, self[name]]
625
+ }]
626
+ end
627
+
628
+ #
629
+ # Converts the struct to an Array of values.
630
+ #
631
+ # @return [::Array<Object>]
632
+ # The array of values within the struct.
633
+ #
634
+ # @api public
635
+ #
636
+ def to_a
637
+ @type.members.keys.map do |name|
638
+ self[name]
639
+ end
640
+ end
641
+
642
+ extend CTypes::Mixin
643
+
644
+ #
645
+ # Gets or sets the struct's target platform.
646
+ #
647
+ # @param [:little, :big, :net, nil] endian
648
+ # The desired endianness for the struct.
649
+ #
650
+ # @param [:x86, :x86_64,
651
+ # :ppc, :ppc64,
652
+ # :mips, :mips_le, :mips_be,
653
+ # :mips64, :mips64_le, :mips64_be,
654
+ # :arm, :arm_le, :arm_be,
655
+ # :arm64, :arm64_le, :arm64_be] arch
656
+ # The desired architecture for the struct.
657
+ #
658
+ # @param [:linux, :macos, :windows,
659
+ # :bsd, :freebsd, :openbsd, :netbsd] os
660
+ # The Operating System (OS) for the struct.
661
+ #
662
+ # @return [Hash{Symbol => Object}]
663
+ # The platform configuration Hash.
664
+ #
665
+ # @api public
666
+ #
667
+ def self.platform(endian: nil, arch: nil, os: nil)
668
+ if endian || arch || os
669
+ @type_system = CTypes.platform(endian: endian, arch: arch, os: os)
670
+ @platform = {endian: endian, arch: arch, os: os}
671
+ else
672
+ @platform ||= if superclass < Struct
673
+ superclass.platform
674
+ else
675
+ {}
676
+ end
677
+ end
678
+ end
679
+
680
+ #
681
+ # The alignment of the struct.
682
+ #
683
+ # @return [Integer]
684
+ # The alignment, in bytes, for the struct.
685
+ #
686
+ # @api public
687
+ #
688
+ def self.alignment
689
+ @alignment ||= if superclass < Struct
690
+ superclass.alignment
691
+ end
692
+ end
693
+
694
+ #
695
+ # Sets the alignment of the struct.
696
+ #
697
+ # @param [Integer] new_alignment
698
+ # The new alignment for the struct.
699
+ #
700
+ # @api public
701
+ #
702
+ def self.align(new_alignment)
703
+ @alignment = new_alignment
704
+ end
705
+
706
+ #
707
+ # Gets or sets whether the struct's members will have padding.
708
+ #
709
+ # @param [Boolean, nil] new_padding
710
+ # The optional new value for {padding}.
711
+ #
712
+ # @return [Boolean]
713
+ # Specifies whether the struct's members will be padded.
714
+ #
715
+ # @api public
716
+ #
717
+ def self.padding(new_padding=nil)
718
+ unless new_padding.nil?
719
+ @padding = new_padding
720
+ else
721
+ if @padding.nil?
722
+ @padding = if superclass < Struct
723
+ superclass.padding
724
+ else
725
+ true
726
+ end
727
+ else
728
+ @padding
729
+ end
730
+ end
731
+ end
732
+
733
+ #
734
+ # Gets or sets the struct's type system.
735
+ #
736
+ # @return [Types, CTypes::LittleEndian,
737
+ # CTypes::BigEndian,
738
+ # CTypes::Network]
739
+ #
740
+ # @api semipublic
741
+ #
742
+ def self.type_system
743
+ @type_system ||= if superclass < Struct
744
+ superclass.type_system
745
+ else
746
+ CTypes
747
+ end
748
+ end
749
+
750
+ #
751
+ # The type resolver using {type_system}.
752
+ #
753
+ # @return [CTypes::TypeResolver]
754
+ #
755
+ # @api semipublic
756
+ #
757
+ def self.type_resolver
758
+ @resolver ||= CTypes::TypeResolver.new(type_system)
759
+ end
760
+
761
+ #
762
+ # Defines a member in the struct.
763
+ #
764
+ # @param [Symbol] name
765
+ # The name of the member.
766
+ #
767
+ # @param [Symbol, (Symbol, Integer), Range(Symbol)] type_signature
768
+ # The type of the member.
769
+ #
770
+ # @example Defining a member:
771
+ # class MyStruct < Ronin::Support::Binary::Struct
772
+ # member :x, :uint32
773
+ # end
774
+ #
775
+ # struct = MyStruct.new
776
+ # struct.x = 0x11223344
777
+ #
778
+ # @example Defining an Array member:
779
+ # class MyStruct < Ronin::Support::Binary::Struct
780
+ # member :nums, [:uint32, 10]
781
+ # end
782
+ #
783
+ # struct = MyStruct.new
784
+ # struct.x = [0x11111111, 0x22222222, 0x33333333, 0x44444444]
785
+ #
786
+ # @example Defining an unbounded Array member:
787
+ # class MyStruct < Ronin::Support::Binary::Struct
788
+ # member :payload, :uint8..
789
+ # end
790
+ #
791
+ # struct = MyStruct.new
792
+ # struct.payloads = [0x1, 0x2, 0x3, 0x4]
793
+ #
794
+ # @api public
795
+ #
796
+ def self.member(name,type_signature,**kwargs)
797
+ self.members[name] = Member.new(name,type_signature,**kwargs)
798
+
799
+ define_method(name) { self[name] }
800
+ define_method("#{name}=") { |value| self[name] = value }
801
+ end
802
+
803
+ end
804
+
805
+ #
806
+ # Defines a new {Struct} sub-class with the desired endian-ness or
807
+ # architecture.
808
+ #
809
+ # @param [:little, :big, :net, nil] endian
810
+ # The desired endian-ness.
811
+ #
812
+ # @param [:x86, :x86_64,
813
+ # :ppc, :ppc64,
814
+ # :mips, :mips_le, :mips_be,
815
+ # :mips64, :mips64_le, :mips64_be,
816
+ # :arm, :arm_le, :arm_be,
817
+ # :arm64, :arm64_le, :arm64_be, nil] arch
818
+ # The new architecture for the struct.
819
+ #
820
+ # @return [Class<Binary::Struct>]
821
+ # The configured {Struct} sub-class.
822
+ #
823
+ # @see Struct.translate
824
+ #
825
+ def self.Struct(endian: nil, arch: nil)
826
+ Struct.translate(endian: endian, arch: arch)
827
+ end
828
+ end
829
+ end
830
+ end