ronin-support 1.0.0 → 1.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (151) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ruby.yml +14 -0
  3. data/.rubocop.yml +109 -0
  4. data/ChangeLog.md +33 -1
  5. data/Gemfile +8 -4
  6. data/README.md +1 -1
  7. data/Rakefile +2 -2
  8. data/examples/ssl_proxy.rb +2 -1
  9. data/examples/tcp_proxy.rb +6 -4
  10. data/lib/ronin/support/archive/core_ext/file.rb +43 -0
  11. data/lib/ronin/support/archive/core_ext.rb +1 -1
  12. data/lib/ronin/support/archive/tar/writer.rb +2 -2
  13. data/lib/ronin/support/archive/tar.rb +4 -4
  14. data/lib/ronin/support/archive/zip/reader.rb +2 -2
  15. data/lib/ronin/support/binary/array.rb +5 -8
  16. data/lib/ronin/support/binary/bit_flip.rb +7 -1
  17. data/lib/ronin/support/binary/buffer.rb +25 -25
  18. data/lib/ronin/support/binary/byte_slice.rb +17 -17
  19. data/lib/ronin/support/binary/core_ext.rb +2 -0
  20. data/lib/ronin/support/binary/cstring.rb +50 -4
  21. data/lib/ronin/support/binary/ctypes/arch/arm/big_endian.rb +4 -0
  22. data/lib/ronin/support/binary/ctypes/arch/arm.rb +3 -0
  23. data/lib/ronin/support/binary/ctypes/arch/arm64/big_endian.rb +4 -0
  24. data/lib/ronin/support/binary/ctypes/arch/arm64.rb +3 -0
  25. data/lib/ronin/support/binary/ctypes/arch/mips/little_endian.rb +4 -0
  26. data/lib/ronin/support/binary/ctypes/arch/mips.rb +3 -0
  27. data/lib/ronin/support/binary/ctypes/arch/mips64/little_endian.rb +4 -0
  28. data/lib/ronin/support/binary/ctypes/arch/mips64.rb +3 -0
  29. data/lib/ronin/support/binary/ctypes/arch/ppc.rb +3 -0
  30. data/lib/ronin/support/binary/ctypes/arch/ppc64.rb +3 -0
  31. data/lib/ronin/support/binary/ctypes/arch/x86.rb +3 -0
  32. data/lib/ronin/support/binary/ctypes/arch/x86_64.rb +3 -0
  33. data/lib/ronin/support/binary/ctypes/array_type.rb +2 -2
  34. data/lib/ronin/support/binary/ctypes/big_endian.rb +3 -0
  35. data/lib/ronin/support/binary/ctypes/enum_type.rb +2 -2
  36. data/lib/ronin/support/binary/ctypes/little_endian.rb +3 -0
  37. data/lib/ronin/support/binary/ctypes/native.rb +3 -0
  38. data/lib/ronin/support/binary/ctypes/os/bsd.rb +1 -1
  39. data/lib/ronin/support/binary/ctypes/scalar_type.rb +2 -2
  40. data/lib/ronin/support/binary/ctypes/struct_type.rb +3 -3
  41. data/lib/ronin/support/binary/ctypes/type_resolver.rb +7 -8
  42. data/lib/ronin/support/binary/ctypes/unbounded_array_type.rb +2 -2
  43. data/lib/ronin/support/binary/ctypes/union_type.rb +3 -3
  44. data/lib/ronin/support/binary/ctypes.rb +3 -3
  45. data/lib/ronin/support/binary/memory.rb +2 -2
  46. data/lib/ronin/support/binary/packet.rb +80 -0
  47. data/lib/ronin/support/binary/stack.rb +6 -7
  48. data/lib/ronin/support/binary/struct/member.rb +5 -3
  49. data/lib/ronin/support/binary/struct.rb +81 -79
  50. data/lib/ronin/support/binary/template.rb +2 -5
  51. data/lib/ronin/support/binary/unhexdump/parser.rb +11 -11
  52. data/lib/ronin/support/binary/union.rb +22 -22
  53. data/lib/ronin/support/binary.rb +1 -0
  54. data/lib/ronin/support/cli/ansi.rb +0 -1
  55. data/lib/ronin/support/cli/io_shell/core_ext/io.rb +1 -1
  56. data/lib/ronin/support/cli/io_shell.rb +4 -4
  57. data/lib/ronin/support/cli/printing.rb +3 -3
  58. data/lib/ronin/support/compression/core_ext/file.rb +16 -0
  59. data/lib/ronin/support/compression/zlib.rb +1 -1
  60. data/lib/ronin/support/core_ext/enumerable.rb +0 -2
  61. data/lib/ronin/support/core_ext/file.rb +1 -1
  62. data/lib/ronin/support/core_ext/kernel.rb +6 -9
  63. data/lib/ronin/support/core_ext/string.rb +2 -2
  64. data/lib/ronin/support/crypto/cert.rb +11 -15
  65. data/lib/ronin/support/crypto/cert_chain.rb +1 -1
  66. data/lib/ronin/support/crypto/cipher/aes.rb +3 -0
  67. data/lib/ronin/support/crypto/cipher/aes128.rb +4 -1
  68. data/lib/ronin/support/crypto/cipher/aes256.rb +4 -1
  69. data/lib/ronin/support/crypto/cipher.rb +1 -1
  70. data/lib/ronin/support/crypto/core_ext/file.rb +33 -1
  71. data/lib/ronin/support/crypto/core_ext/string.rb +34 -2
  72. data/lib/ronin/support/crypto/key/methods.rb +4 -1
  73. data/lib/ronin/support/crypto/key.rb +5 -2
  74. data/lib/ronin/support/crypto/openssl.rb +1 -1
  75. data/lib/ronin/support/crypto.rb +0 -1
  76. data/lib/ronin/support/encoding/base16.rb +2 -2
  77. data/lib/ronin/support/encoding/base32.rb +29 -18
  78. data/lib/ronin/support/encoding/c/core_ext/integer.rb +1 -1
  79. data/lib/ronin/support/encoding/c/core_ext/string.rb +1 -1
  80. data/lib/ronin/support/encoding/c.rb +6 -6
  81. data/lib/ronin/support/encoding/core_ext/string.rb +2 -2
  82. data/lib/ronin/support/encoding/hex/core_ext/string.rb +1 -1
  83. data/lib/ronin/support/encoding/hex.rb +4 -4
  84. data/lib/ronin/support/encoding/js/core_ext/integer.rb +1 -1
  85. data/lib/ronin/support/encoding/js.rb +5 -5
  86. data/lib/ronin/support/encoding/powershell/core_ext/integer.rb +2 -2
  87. data/lib/ronin/support/encoding/powershell.rb +5 -6
  88. data/lib/ronin/support/encoding/quoted_printable.rb +3 -1
  89. data/lib/ronin/support/encoding/ruby.rb +5 -5
  90. data/lib/ronin/support/encoding/shell/core_ext/integer.rb +2 -2
  91. data/lib/ronin/support/encoding/shell.rb +3 -3
  92. data/lib/ronin/support/encoding/sql.rb +1 -1
  93. data/lib/ronin/support/encoding/uuencoding.rb +3 -1
  94. data/lib/ronin/support/encoding/xml.rb +3 -3
  95. data/lib/ronin/support/encoding.rb +95 -0
  96. data/lib/ronin/support/network/asn/list.rb +6 -1
  97. data/lib/ronin/support/network/asn/record.rb +3 -0
  98. data/lib/ronin/support/network/asn/record_set.rb +3 -0
  99. data/lib/ronin/support/network/asn.rb +167 -6
  100. data/lib/ronin/support/network/dns/mixin.rb +2 -10
  101. data/lib/ronin/support/network/dns/resolver.rb +3 -0
  102. data/lib/ronin/support/network/domain.rb +21 -21
  103. data/lib/ronin/support/network/email_address.rb +1 -5
  104. data/lib/ronin/support/network/esmtp/mixin.rb +1 -0
  105. data/lib/ronin/support/network/ftp/mixin.rb +1 -1
  106. data/lib/ronin/support/network/host.rb +75 -47
  107. data/lib/ronin/support/network/http/core_ext/uri/http.rb +8 -0
  108. data/lib/ronin/support/network/http/core_ext.rb +1 -1
  109. data/lib/ronin/support/network/http.rb +317 -80
  110. data/lib/ronin/support/network/ip.rb +49 -23
  111. data/lib/ronin/support/network/ip_range/cidr.rb +1 -5
  112. data/lib/ronin/support/network/ip_range/glob.rb +1 -0
  113. data/lib/ronin/support/network/ip_range/range.rb +1 -1
  114. data/lib/ronin/support/network/ip_range.rb +5 -7
  115. data/lib/ronin/support/network/proxy.rb +4 -4
  116. data/lib/ronin/support/network/public_suffix/list.rb +10 -8
  117. data/lib/ronin/support/network/public_suffix/suffix_set.rb +3 -0
  118. data/lib/ronin/support/network/public_suffix.rb +9 -4
  119. data/lib/ronin/support/network/smtp/email.rb +0 -9
  120. data/lib/ronin/support/network/smtp/mixin.rb +2 -2
  121. data/lib/ronin/support/network/ssl/local_cert.rb +1 -3
  122. data/lib/ronin/support/network/ssl/mixin.rb +13 -13
  123. data/lib/ronin/support/network/ssl/openssl.rb +1 -1
  124. data/lib/ronin/support/network/ssl/proxy.rb +14 -16
  125. data/lib/ronin/support/network/ssl.rb +4 -2
  126. data/lib/ronin/support/network/tcp/proxy.rb +3 -3
  127. data/lib/ronin/support/network/tcp.rb +10 -12
  128. data/lib/ronin/support/network/telnet/mixin.rb +14 -14
  129. data/lib/ronin/support/network/tld/list.rb +2 -1
  130. data/lib/ronin/support/network/tld.rb +7 -4
  131. data/lib/ronin/support/network/tls/proxy.rb +1 -1
  132. data/lib/ronin/support/network/tls.rb +0 -2
  133. data/lib/ronin/support/network/udp/proxy.rb +5 -5
  134. data/lib/ronin/support/network/udp.rb +14 -16
  135. data/lib/ronin/support/path.rb +4 -4
  136. data/lib/ronin/support/text/erb/mixin.rb +3 -0
  137. data/lib/ronin/support/text/homoglyph/core_ext/string.rb +33 -0
  138. data/lib/ronin/support/text/homoglyph/table.rb +3 -3
  139. data/lib/ronin/support/text/patterns/credentials.rb +2 -2
  140. data/lib/ronin/support/text/patterns/crypto.rb +1 -1
  141. data/lib/ronin/support/text/patterns/file_system.rb +3 -4
  142. data/lib/ronin/support/text/patterns/network.rb +21 -21
  143. data/lib/ronin/support/text/patterns/numeric.rb +1 -1
  144. data/lib/ronin/support/text/patterns/source_code.rb +2 -2
  145. data/lib/ronin/support/text/random/mixin.rb +17 -17
  146. data/lib/ronin/support/text/random.rb +25 -25
  147. data/lib/ronin/support/text/typo/core_ext/string.rb +24 -0
  148. data/lib/ronin/support/text/typo/generator.rb +2 -2
  149. data/lib/ronin/support/version.rb +1 -1
  150. data/ronin-support.gemspec +6 -5
  151. metadata +3 -2
@@ -69,15 +69,15 @@ module Ronin
69
69
 
70
70
  case string
71
71
  when ByteSlice
72
- if (offset < 0) || (offset+length > string.bytesize)
72
+ if (offset < 0) || ((offset + length) > string.bytesize)
73
73
  raise(IndexError,"offset #{offset} or length #{length} is out of bounds: 0...#{string.bytesize}")
74
74
  end
75
75
 
76
76
  @string = string.string
77
- @offset = string.offset+offset
77
+ @offset = string.offset + offset
78
78
  @length = length
79
79
  when String
80
- if (offset < 0) || (offset+length > string.bytesize)
80
+ if (offset < 0) || ((offset + length) > string.bytesize)
81
81
  raise(IndexError,"offset #{offset} or length #{length} is out of bounds: 0...#{string.bytesize}")
82
82
  end
83
83
 
@@ -109,17 +109,17 @@ module Ronin
109
109
  when Range
110
110
  range = index_or_range
111
111
 
112
- @string[@offset+range.begin,range.end-range.begin]
112
+ @string[@offset + range.begin,range.end - range.begin]
113
113
  when Integer
114
114
  index = index_or_range
115
115
 
116
116
  case length
117
117
  when Integer
118
- @string[@offset+index,length]
118
+ @string[@offset + index,length]
119
119
  when nil
120
- @string[@offset+index]
120
+ @string[@offset + index]
121
121
  when Float::INFINITY
122
- @string[@offset+index,@length-index]
122
+ @string[@offset + index,@length - index]
123
123
  else
124
124
  raise(ArgumentError,"invalid length (#{length.inspect}) must be an Integer, nil, or Float::INFINITY")
125
125
  end
@@ -151,17 +151,17 @@ module Ronin
151
151
  when Range
152
152
  range = index_or_range
153
153
 
154
- @string[@offset+range.begin,range.end-range.begin] = value
154
+ @string[@offset + range.begin,range.end - range.begin] = value
155
155
  when Integer
156
156
  index = index_or_range
157
157
 
158
158
  case length
159
159
  when Integer
160
- @string[@offset+index,length] = value
160
+ @string[@offset + index,length] = value
161
161
  when nil
162
- @string[@offset+index] = value
162
+ @string[@offset + index] = value
163
163
  when Float::INFINITY
164
- @string[@offset+index,@length-index] = value
164
+ @string[@offset + index,@length - index] = value
165
165
  else
166
166
  raise(ArgumentError,"invalid length (#{length.inspect}) must be an Integer, nil, or Float::INFINITY")
167
167
  end
@@ -200,7 +200,7 @@ module Ronin
200
200
  # found.
201
201
  #
202
202
  def index(substring,offset=0)
203
- if (index = @string.index(substring,@offset+offset))
203
+ if (index = @string.index(substring,@offset + offset))
204
204
  if index < (@offset + @length)
205
205
  index - @offset
206
206
  end
@@ -211,13 +211,13 @@ module Ronin
211
211
  # Gets the byte at the given index within the byte slice.
212
212
  #
213
213
  # @param [Integer] index
214
- #
214
+ #
215
215
  # @return [Integer, nil]
216
216
  # The byte at the given index, or nil if the index is out of bounds.
217
217
  #
218
218
  def getbyte(index)
219
219
  if index < @length
220
- @string.getbyte(@offset+index)
220
+ @string.getbyte(@offset + index)
221
221
  end
222
222
  end
223
223
 
@@ -235,7 +235,7 @@ module Ronin
235
235
  #
236
236
  def setbyte(index,byte)
237
237
  if index < @length
238
- @string.setbyte(@offset+index,byte)
238
+ @string.setbyte(@offset + index,byte)
239
239
  else
240
240
  raise(IndexError,"index #{index.inspect} is out of bounds")
241
241
  end
@@ -257,7 +257,7 @@ module Ronin
257
257
  def each_byte
258
258
  return enum_for(__method__) unless block_given?
259
259
 
260
- (@offset...(@offset+@length)).each do |index|
260
+ (@offset...(@offset + @length)).each do |index|
261
261
  yield @string.getbyte(index)
262
262
  end
263
263
  end
@@ -288,7 +288,7 @@ module Ronin
288
288
  def each_char
289
289
  return enum_for(__method__) unless block_given?
290
290
 
291
- (@offset...(@offset+@length)).each do |index|
291
+ (@offset...(@offset + @length)).each do |index|
292
292
  yield @string[index]
293
293
  end
294
294
  end
@@ -16,6 +16,8 @@
16
16
  # along with ronin-support. If not, see <https://www.gnu.org/licenses/>.
17
17
  #
18
18
 
19
+ require 'ronin/support/binary/core_ext/integer'
20
+ require 'ronin/support/binary/core_ext/float'
19
21
  require 'ronin/support/binary/core_ext/string'
20
22
  require 'ronin/support/binary/core_ext/array'
21
23
  require 'ronin/support/binary/core_ext/io'
@@ -24,6 +24,49 @@ module Ronin
24
24
  #
25
25
  # Represents a null terminated C string.
26
26
  #
27
+ # ## Examples
28
+ #
29
+ # ### Initializing C Strings
30
+ #
31
+ # From a String:
32
+ #
33
+ # str = Binary::CString.new("hello ")
34
+ # # => #<Ronin::Support::Binary::CString:0x00007fc94ba577f8 @string="hello \u0000">
35
+ #
36
+ # From a binary C string:
37
+ #
38
+ # str = Binary::CString.new("world\0".b)
39
+ # # => #<Ronin::Support::Binary::CString:0x00007fc94ba06f88 @string="world\u0000">
40
+ #
41
+ # From characters:
42
+ #
43
+ # str = Binary::CString['A', 'B', 'C']
44
+ # # => #<Ronin::Support::Binary::CString:0x00007fc94ba6f268 @string="ABC\x00">
45
+ #
46
+ # ### Modifying C Strings
47
+ #
48
+ # Concating Strings to a C String:
49
+ #
50
+ # str = Binary::CString.new("hello ")
51
+ # str.concat("world")
52
+ # # => #<Ronin::Support::Binary::CString:0x00007fc94b978df0 @string="hello world\u0000">
53
+ # str.to_s
54
+ # # => "hello world"
55
+ #
56
+ # Appending two C Strings:
57
+ #
58
+ # str1 = Binary::CString.new("hello ")
59
+ # str2 = Binary::CString.new("world\0")
60
+ # str = str1 + str2
61
+ # # => #<Ronin::Support::Binary::CString:0x00007fc94b9523f8 @string="hello world\u0000">
62
+ #
63
+ # Setting characters:
64
+ #
65
+ # str = Binary::CString.new("hello")
66
+ # str[0] = 'X'
67
+ # str.to_s
68
+ # # => "Xello"
69
+ #
27
70
  # @api public
28
71
  #
29
72
  # @since 1.0.0
@@ -101,14 +144,15 @@ module Ronin
101
144
  # @return [self]
102
145
  #
103
146
  def concat(value)
104
- value = case value
105
- when Integer then value.chr
106
- else value.to_s
107
- end
147
+ value = case value
148
+ when Integer then value.chr
149
+ else value.to_s
150
+ end
108
151
  value_size = value.bytesize
109
152
 
110
153
  unless value.include?(NULL)
111
154
  value = "#{value}#{NULL}"
155
+
112
156
  value_size += 1
113
157
  end
114
158
 
@@ -153,6 +197,7 @@ module Ronin
153
197
 
154
198
  @string.each_char do |char|
155
199
  break if char == NULL
200
+
156
201
  yield char
157
202
  end
158
203
  end
@@ -185,6 +230,7 @@ module Ronin
185
230
 
186
231
  @string.each_byte do |byte|
187
232
  break if byte == 0x00
233
+
188
234
  yield byte
189
235
  end
190
236
  end
@@ -24,6 +24,10 @@ module Ronin
24
24
  module CTypes
25
25
  module Arch
26
26
  module ARM
27
+ #
28
+ # Represents the C types for the ARM architecture, in big-endian
29
+ # mode.
30
+ #
27
31
  module BigEndian
28
32
  include CTypes::BigEndian
29
33
 
@@ -23,6 +23,9 @@ module Ronin
23
23
  module Binary
24
24
  module CTypes
25
25
  module Arch
26
+ #
27
+ # Represents the C types for the ARM architecture.
28
+ #
26
29
  module ARM
27
30
  include LittleEndian
28
31
 
@@ -24,6 +24,10 @@ module Ronin
24
24
  module CTypes
25
25
  module Arch
26
26
  module ARM64
27
+ #
28
+ # Represents the C types for the ARM64 architecture, in big-endian
29
+ # mode.
30
+ #
27
31
  module BigEndian
28
32
  include CTypes::BigEndian
29
33
 
@@ -23,6 +23,9 @@ module Ronin
23
23
  module Binary
24
24
  module CTypes
25
25
  module Arch
26
+ #
27
+ # Represents the C types for the ARM64 architecture.
28
+ #
26
29
  module ARM64
27
30
  include LittleEndian
28
31
 
@@ -24,6 +24,10 @@ module Ronin
24
24
  module CTypes
25
25
  module Arch
26
26
  module MIPS
27
+ #
28
+ # Represents the C types for the MIPS architecture, in little-endian
29
+ # mode.
30
+ #
27
31
  module LittleEndian
28
32
  include CTypes::LittleEndian
29
33
 
@@ -23,6 +23,9 @@ module Ronin
23
23
  module Binary
24
24
  module CTypes
25
25
  module Arch
26
+ #
27
+ # Represents the C types for the MIPS architecture.
28
+ #
26
29
  module MIPS
27
30
  include BigEndian
28
31
 
@@ -24,6 +24,10 @@ module Ronin
24
24
  module CTypes
25
25
  module Arch
26
26
  module MIPS64
27
+ #
28
+ # Represents the C types for the MIPS64 architecture,
29
+ # in little-endian mode.
30
+ #
27
31
  module LittleEndian
28
32
  include CTypes::LittleEndian
29
33
 
@@ -23,6 +23,9 @@ module Ronin
23
23
  module Binary
24
24
  module CTypes
25
25
  module Arch
26
+ #
27
+ # Represents the C types for the MIPS64 architecture.
28
+ #
26
29
  module MIPS64
27
30
  include BigEndian
28
31
 
@@ -23,6 +23,9 @@ module Ronin
23
23
  module Binary
24
24
  module CTypes
25
25
  module Arch
26
+ #
27
+ # Represents the C types for the PPC architecture.
28
+ #
26
29
  module PPC
27
30
  include BigEndian
28
31
 
@@ -23,6 +23,9 @@ module Ronin
23
23
  module Binary
24
24
  module CTypes
25
25
  module Arch
26
+ #
27
+ # Represents the C types for the PPC64 architecture.
28
+ #
26
29
  module PPC64
27
30
  include BigEndian
28
31
 
@@ -23,6 +23,9 @@ module Ronin
23
23
  module Binary
24
24
  module CTypes
25
25
  module Arch
26
+ #
27
+ # Represents the C types for the x86 architecture.
28
+ #
26
29
  module X86
27
30
  include LittleEndian
28
31
 
@@ -23,6 +23,9 @@ module Ronin
23
23
  module Binary
24
24
  module CTypes
25
25
  module Arch
26
+ #
27
+ # Represents the C types for the x86-64 architecture.
28
+ #
26
29
  module X86_64
27
30
  include LittleEndian
28
31
 
@@ -60,7 +60,7 @@ module Ronin
60
60
  # Custom type alignment to override the type's alignment.
61
61
  #
62
62
  def initialize(type,length, alignment: nil)
63
- if type.class == UnboundedArrayType
63
+ if type.kind_of?(UnboundedArrayType)
64
64
  raise(ArgumentError,"cannot initialize an #{self.class} of #{UnboundedArrayType}")
65
65
  end
66
66
 
@@ -152,7 +152,7 @@ module Ronin
152
152
  if @pack_string
153
153
  super(array)
154
154
  else
155
- buffer = String.new("", encoding: Encoding::ASCII_8BIT)
155
+ buffer = String.new
156
156
 
157
157
  @length.times do |index|
158
158
  value = array[index] || @type.uninitialized_value
@@ -33,6 +33,9 @@ module Ronin
33
33
  module Support
34
34
  module Binary
35
35
  module CTypes
36
+ #
37
+ # Represents the C types, but in big-endian byte-order.
38
+ #
36
39
  module BigEndian
37
40
  include CharTypes
38
41
 
@@ -54,8 +54,8 @@ module Ronin
54
54
  def initialize(int_type,mapping)
55
55
  super(pack_string: nil)
56
56
 
57
- @int_type = int_type
58
- @mapping = mapping
57
+ @int_type = int_type
58
+ @mapping = mapping
59
59
  @reverse_mapping = @mapping.invert
60
60
  end
61
61
 
@@ -33,6 +33,9 @@ module Ronin
33
33
  module Support
34
34
  module Binary
35
35
  module CTypes
36
+ #
37
+ # Represents the C types, but in little-endian byte-order.
38
+ #
36
39
  module LittleEndian
37
40
  include CharTypes
38
41
 
@@ -32,6 +32,9 @@ module Ronin
32
32
  module Support
33
33
  module Binary
34
34
  module CTypes
35
+ #
36
+ # Represents the system's native C types.
37
+ #
35
38
  module Native
36
39
  include CharTypes
37
40
 
@@ -33,7 +33,7 @@ module Ronin
33
33
  class BSD < UNIX
34
34
 
35
35
  #
36
- # Initializes the FreeBSD types object.
36
+ # Initializes the common BSD types object.
37
37
  #
38
38
  # @param [#[]] types
39
39
  # The base types module.
@@ -82,7 +82,7 @@ module Ronin
82
82
  @signed = signed
83
83
  end
84
84
 
85
- #
85
+ #
86
86
  # Whether the scalar type is signed.
87
87
  #
88
88
  # @return [Boolean]
@@ -91,7 +91,7 @@ module Ronin
91
91
  @signed
92
92
  end
93
93
 
94
- #
94
+ #
95
95
  # Whether the scalar type is unsigned.
96
96
  #
97
97
  # @return [Boolean]
@@ -214,9 +214,9 @@ module Ronin
214
214
  # The uninitialized values for the new struct's members.
215
215
  #
216
216
  def uninitialized_value
217
- Hash[@members.map { |name,member|
218
- [name, member.type.uninitialized_value]
219
- }]
217
+ @members.transform_values do |member|
218
+ member.type.uninitialized_value
219
+ end
220
220
  end
221
221
 
222
222
  #
@@ -155,9 +155,9 @@ module Ronin
155
155
  #
156
156
  def resolve_struct(type_signature)
157
157
  struct_class = type_signature
158
- struct_members = Hash[struct_class.members.map { |name,member|
159
- [name, resolve(member.type_signature)]
160
- }]
158
+ struct_members = struct_class.members.transform_values { |member|
159
+ resolve(member.type_signature)
160
+ }
161
161
 
162
162
  struct_type = StructType.build(
163
163
  struct_members, alignment: struct_class.alignment,
@@ -176,9 +176,9 @@ module Ronin
176
176
  #
177
177
  def resolve_union(type_signature)
178
178
  union_class = type_signature
179
- union_members = Hash[union_class.members.map { |name,member|
180
- [name, resolve(member.type_signature)]
181
- }]
179
+ union_members = union_class.members.transform_values { |member|
180
+ resolve(member.type_signature)
181
+ }
182
182
 
183
183
  union_type = UnionType.build(
184
184
  union_members, alignment: union_class.alignment
@@ -191,7 +191,7 @@ module Ronin
191
191
  # Resolves a type name.
192
192
  #
193
193
  # @param [Symbol] name
194
- #
194
+ #
195
195
  # @return [Type]
196
196
  #
197
197
  def resolve_symbol(name)
@@ -203,4 +203,3 @@ module Ronin
203
203
  end
204
204
  end
205
205
  end
206
-
@@ -47,7 +47,7 @@ module Ronin
47
47
  # Cannot initialize a nested {UnboundedArrayType}.
48
48
  #
49
49
  def initialize(type, alignment: nil)
50
- if type.class == UnboundedArrayType
50
+ if type.kind_of?(UnboundedArrayType)
51
51
  raise(ArgumentError,"cannot initialize a nested #{UnboundedArrayType}")
52
52
  end
53
53
 
@@ -149,7 +149,7 @@ module Ronin
149
149
  if @pack_string
150
150
  super(array)
151
151
  else
152
- buffer = String.new('', encoding: Encoding::ASCII_8BIT)
152
+ buffer = String.new
153
153
 
154
154
  array.each do |element|
155
155
  buffer << @type.pack(element)
@@ -162,9 +162,9 @@ module Ronin
162
162
  # The uninitialized values for the new union's members.
163
163
  #
164
164
  def uninitialized_value
165
- Hash[@members.map { |name,member|
166
- [name, member.type.uninitialized_value]
167
- }]
165
+ @members.transform_values do |member|
166
+ member.type.uninitialized_value
167
+ end
168
168
  end
169
169
 
170
170
  #
@@ -61,7 +61,7 @@ module Ronin
61
61
  # * Floating Point Types:
62
62
  # * {CTypes::Float32Type float} (`-3.40282347E+38F` -
63
63
  # `3.40282347E+38F`)
64
- # * {CTypes::Float64Type double} (`-1.79769313486231570E+308` -
64
+ # * {CTypes::Float64Type double} (`-1.79769313486231570E+308` -
65
65
  # `1.79769313486231570E+308`)
66
66
  # * Aggregate Types:
67
67
  # * {CTypes::ArrayType Array} (ex: `{1,2,3}`)
@@ -182,7 +182,7 @@ module Ronin
182
182
  UINT32_NET = Network::UINT32
183
183
  UINT64_NET = Network::UINT64
184
184
 
185
- WORD_NET = Network::WORD
185
+ WORD_NET = Network::WORD
186
186
  DWORD_NET = Network::DWORD
187
187
  QWORD_NET = Network::QWORD
188
188
 
@@ -390,7 +390,7 @@ module Ronin
390
390
  openbsd: OS::OpenBSD,
391
391
  netbsd: OS::NetBSD,
392
392
 
393
- linux: OS:: Linux,
393
+ linux: OS::Linux,
394
394
  macos: OS::MacOS,
395
395
  windows: OS::Windows
396
396
  }
@@ -145,7 +145,7 @@ module Ronin
145
145
 
146
146
  case length
147
147
  when Integer then @string[index,length] = value
148
- when nil then @string[index] = value
148
+ when nil then @string[index] = value
149
149
  when Float::INFINITY
150
150
  @string[index,@string.length - index] = value
151
151
  else
@@ -157,7 +157,7 @@ module Ronin
157
157
  end
158
158
 
159
159
  #
160
- # Returns a byte slice of the memory at the given offset and for the
160
+ # Returns a byte slice of the memory at the given offset and for the
161
161
  # remainder of the memory.
162
162
  #
163
163
  # @param [Integer] offset
@@ -21,6 +21,86 @@ require 'ronin/support/binary/struct'
21
21
  module Ronin
22
22
  module Support
23
23
  module Binary
24
+ #
25
+ # Represents a network packet in network byte-order.
26
+ #
27
+ # ## Examples
28
+ #
29
+ # ### Defining Packet Fields
30
+ #
31
+ # class Packet < Ronin::Support::Binary::Packet
32
+ #
33
+ # member :flags, :uint8
34
+ # member :src, :uint32
35
+ # member :dst, :uint32
36
+ # member :length, :uint32
37
+ #
38
+ # end
39
+ #
40
+ # ### Initializing Packets
41
+ #
42
+ # From a Hash:
43
+ #
44
+ # packet = Packet.new(
45
+ # flags: 0x0c,
46
+ # src: IPAddr.new('1.2.3.4').to_i,
47
+ # dst: IPAddr.new('5.6.7.8').to_i,
48
+ # length: 1024
49
+ # )
50
+ #
51
+ # From a buffer:
52
+ #
53
+ # packet = Packet.unpack("\f\x01\x02\x03\x04\x05\x06\a\b\x00\x00\x04\x00")
54
+ #
55
+ # ### Reading Fields
56
+ #
57
+ # packet = Packet.new("\f\x01\x02\x03\x04\x05\x06\a\b\x00\x00\x04\x00")
58
+ # packet[:flags]
59
+ # # => 12
60
+ # packet.flags
61
+ # # => 12
62
+ #
63
+ # ### Packing Packets
64
+ #
65
+ # class Packet < Ronin::Support::Binary::Packet
66
+ #
67
+ # member :flags, :uint8
68
+ # member :src, :uint32
69
+ # member :dst, :uint32
70
+ # member :length, :uint32
71
+ #
72
+ # end
73
+ #
74
+ # packet = Packet.new(
75
+ # flags: 0x0c,
76
+ # src: IPAddr.new('1.2.3.4').to_i,
77
+ # dst: IPAddr.new('5.6.7.8').to_i,
78
+ # length: 1024
79
+ # )
80
+ # packet.pack
81
+ # # => "\f\x01\x02\x03\x04\x05\x06\a\b\x00\x00\x04\x00"
82
+ #
83
+ # ### Unpacking Packets
84
+ #
85
+ # class Packet < Ronin::Support::Binary::Packet
86
+ #
87
+ # member :flags, :uint8
88
+ # member :src, :uint32
89
+ # member :dst, :uint32
90
+ # member :length, :uint32
91
+ #
92
+ # end
93
+ #
94
+ # packet = Packet.unpack("\f\x01\x02\x03\x04\x05\x06\a\b\x00\x00\x04\x00")
95
+ # packet.flags
96
+ # # => 12
97
+ # packet.src
98
+ # # => 16909060
99
+ # packet.dst
100
+ # # => 84281096
101
+ # packet.length
102
+ # # => 1024
103
+ #
24
104
  class Packet < Binary::Struct
25
105
 
26
106
  platform endian: :net