aastdlib 0.0.3

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 (80) hide show
  1. checksums.yaml +7 -0
  2. data/Gemfile +4 -0
  3. data/LICENSE.txt +21 -0
  4. data/README.md +39 -0
  5. data/Rakefile +6 -0
  6. data/aastdlib.gemspec +37 -0
  7. data/bin/console +14 -0
  8. data/bin/setup +8 -0
  9. data/doc/Aastdlib.html +110 -0
  10. data/doc/Array.html +164 -0
  11. data/doc/Dir.html +96 -0
  12. data/doc/Gemfile.html +95 -0
  13. data/doc/Hash.html +197 -0
  14. data/doc/Integer.html +162 -0
  15. data/doc/LICENSE_txt.html +112 -0
  16. data/doc/Object.html +501 -0
  17. data/doc/README_md.html +155 -0
  18. data/doc/Rakefile.html +96 -0
  19. data/doc/String.html +1240 -0
  20. data/doc/Symbol.html +197 -0
  21. data/doc/aastdlib_gemspec.html +127 -0
  22. data/doc/bin/setup.html +96 -0
  23. data/doc/created.rid +19 -0
  24. data/doc/css/fonts.css +167 -0
  25. data/doc/css/rdoc.css +590 -0
  26. data/doc/fonts/Lato-Light.ttf +0 -0
  27. data/doc/fonts/Lato-LightItalic.ttf +0 -0
  28. data/doc/fonts/Lato-Regular.ttf +0 -0
  29. data/doc/fonts/Lato-RegularItalic.ttf +0 -0
  30. data/doc/fonts/SourceCodePro-Bold.ttf +0 -0
  31. data/doc/fonts/SourceCodePro-Regular.ttf +0 -0
  32. data/doc/images/add.png +0 -0
  33. data/doc/images/arrow_up.png +0 -0
  34. data/doc/images/brick.png +0 -0
  35. data/doc/images/brick_link.png +0 -0
  36. data/doc/images/bug.png +0 -0
  37. data/doc/images/bullet_black.png +0 -0
  38. data/doc/images/bullet_toggle_minus.png +0 -0
  39. data/doc/images/bullet_toggle_plus.png +0 -0
  40. data/doc/images/date.png +0 -0
  41. data/doc/images/delete.png +0 -0
  42. data/doc/images/find.png +0 -0
  43. data/doc/images/loadingAnimation.gif +0 -0
  44. data/doc/images/macFFBgHack.png +0 -0
  45. data/doc/images/package.png +0 -0
  46. data/doc/images/page_green.png +0 -0
  47. data/doc/images/page_white_text.png +0 -0
  48. data/doc/images/page_white_width.png +0 -0
  49. data/doc/images/plugin.png +0 -0
  50. data/doc/images/ruby.png +0 -0
  51. data/doc/images/tag_blue.png +0 -0
  52. data/doc/images/tag_green.png +0 -0
  53. data/doc/images/transparent.png +0 -0
  54. data/doc/images/wrench.png +0 -0
  55. data/doc/images/wrench_orange.png +0 -0
  56. data/doc/images/zoom.png +0 -0
  57. data/doc/index.html +114 -0
  58. data/doc/js/darkfish.js +161 -0
  59. data/doc/js/jquery.js +4 -0
  60. data/doc/js/navigation.js +142 -0
  61. data/doc/js/navigation.js.gz +0 -0
  62. data/doc/js/search.js +109 -0
  63. data/doc/js/search_index.js +1 -0
  64. data/doc/js/search_index.js.gz +0 -0
  65. data/doc/js/searcher.js +229 -0
  66. data/doc/js/searcher.js.gz +0 -0
  67. data/doc/table_of_contents.html +282 -0
  68. data/lib/aastdlib.rb +12 -0
  69. data/lib/aastdlib/array.rb +20 -0
  70. data/lib/aastdlib/file.rb +23 -0
  71. data/lib/aastdlib/hash.rb +22 -0
  72. data/lib/aastdlib/integer.rb +16 -0
  73. data/lib/aastdlib/object.rb +200 -0
  74. data/lib/aastdlib/string.rb +377 -0
  75. data/lib/aastdlib/symbol.rb +19 -0
  76. data/lib/aastdlib/version.rb +3 -0
  77. data/pkg/aastdlib-0.0.0.gem +0 -0
  78. data/pkg/aastdlib-0.0.1.gem +0 -0
  79. data/pkg/aastdlib-0.0.2.gem +0 -0
  80. metadata +179 -0
@@ -0,0 +1,12 @@
1
+ require "terminal-table"
2
+ require "aastdlib/version"
3
+
4
+ path = __FILE__.split('/')
5
+ path = path[0..(path.count - 2)].join('/')
6
+ path += '/aastdlib/'
7
+
8
+ Dir::entries(path).keep_if {|e| e =~ /\.rb$/}.each { |f| require(path+f) }
9
+
10
+ module Aastdlib
11
+ # Your code goes here...
12
+ end
@@ -0,0 +1,20 @@
1
+ class Array
2
+
3
+ # Accepts a value that is check against each element
4
+ # in the array itself and returns a new array containing
5
+ # the index for each matching element.
6
+ def indices(value)
7
+ counter = 0
8
+ indices = []
9
+
10
+ self.each do |v|
11
+ indices << counter if value == v
12
+ counter+=1
13
+ end
14
+
15
+ return indices
16
+
17
+ end
18
+
19
+
20
+ end
@@ -0,0 +1,23 @@
1
+ class File
2
+
3
+ def self.check_and_open(filename, mode="r+")
4
+
5
+ raise "Error: File doesn't exist (#{filename})" if !File::exist?(filename)
6
+
7
+ file = File::open(filename, mode)
8
+
9
+ if block_given?
10
+
11
+ yield(file)
12
+ file.close
13
+ return
14
+
15
+ else
16
+
17
+ return file
18
+
19
+ end
20
+
21
+ end
22
+
23
+ end
@@ -0,0 +1,22 @@
1
+ class Hash
2
+
3
+ # Return a copy of the hash with each key converted
4
+ # to a string.
5
+ def stringify_keys()
6
+
7
+ stringified = {}
8
+ self.each {|k,v| stringified[k.to_s] = v}
9
+ return stringified
10
+
11
+ end
12
+
13
+ # _Hash is modified inline!_ Converts each key to a string.
14
+ def stringify_keys!()
15
+
16
+ stringified = self.stringify_keys()
17
+ self.clear
18
+ stringified.each {|k,v| self[k] = v}
19
+
20
+ end
21
+
22
+ end
@@ -0,0 +1,16 @@
1
+ class Integer
2
+
3
+ # Return a copy of the integer in base 16. The
4
+ # pack argument determines whether or not the value
5
+ # should be packed to binary form using Array::pack().
6
+ def to_hex_string(pack=false)
7
+
8
+ out = self.to_s(16)
9
+ out = ("0"+out) if out.length == 1
10
+ out = [out].pack('H*') if pack
11
+
12
+ return out
13
+
14
+ end
15
+
16
+ end
@@ -0,0 +1,200 @@
1
+ class Object
2
+
3
+ # Declare and define an instance variable for a given object.
4
+ # Name is the instance variable name and value is the item assigned
5
+ # to that instance variable. Convenience determines whether getter/setter
6
+ # methods are defined as well.
7
+ def declare_and_define_ivar(name:, value:, convenience: true)
8
+
9
+ if name =~ /^@/
10
+
11
+ iv_handle = name
12
+ name = name.to_s.gsub('@','')
13
+
14
+ else
15
+
16
+ iv_handle = ('@'+name)
17
+
18
+ end
19
+
20
+ iv_handle = iv_handle.to_sym if iv_handle.respond_to?(:to_sym)
21
+
22
+ self.instance_variable_set(iv_handle, value)
23
+
24
+ if convenience
25
+
26
+ # getter
27
+ self.define_singleton_method(name) do
28
+ self.instance_variable_get(iv_handle)
29
+ end
30
+
31
+ # setter
32
+ self.define_singleton_method(name+'=') do |value|
33
+ self.instance_variable_set(iv_handle, value)
34
+ end
35
+
36
+ end
37
+
38
+ end
39
+
40
+ # Convenience method for declare_and_define_ivar()
41
+ def define_ivar(name:, value:, convenience: true)
42
+
43
+ self.declare_and_define_ivar(name: name, value: value)
44
+
45
+ end
46
+
47
+ # Using terminal-table, format all instance variables in a
48
+ # visually appealing text-based table.
49
+ def instance_variable_table()
50
+
51
+ rows = []
52
+ table = Terminal::Table.new()
53
+ table.headings = ['Instance Variable', 'Object']
54
+ table.title = "#{self.class}: Instance Vairables"
55
+
56
+ self.instance_variables.each do |iv|
57
+
58
+ rows << [iv.to_s,self.instance_variable_get(iv)]
59
+
60
+ end
61
+
62
+ table.rows = rows
63
+
64
+ return table
65
+
66
+ end
67
+
68
+ # Inspect the object all pretty like.
69
+ def pretty_inspect()
70
+
71
+ tab_count = 0
72
+
73
+ out = self.inspect.gsub("@","\n\t@")
74
+ .lines
75
+
76
+ expanded = ""
77
+
78
+ counter = out.length
79
+ (0..counter-1).each do |n|
80
+
81
+ line = out[n]
82
+
83
+ expanded += ("\t"*tab_count) + line
84
+
85
+ tab_count += 1 if line =~ /\=\#\</
86
+
87
+ if line =~ /\>\,/ and tab_count != 0
88
+
89
+ tab_count -= 1
90
+
91
+ end
92
+
93
+ end
94
+
95
+ return expanded
96
+
97
+ end
98
+
99
+ # Pretty inspect and print it to stdout.
100
+ def pi(obj)
101
+
102
+ puts
103
+ puts obj.pretty_inspect
104
+ puts
105
+
106
+ end
107
+
108
+ # Using terminal-table, print a visually appealing table detailing
109
+ # methods offered by the object. Valid arguments to _type_ include:
110
+ # - private
111
+ # - public
112
+ # - protected
113
+ def method_table(type=nil)
114
+
115
+ mlists = {
116
+ methods: [],
117
+ private: [],
118
+ protected: [],
119
+ public: []
120
+ }
121
+
122
+ if type
123
+
124
+ case type
125
+
126
+ when :private
127
+
128
+ self.private_methods.sort.each {|m| mlists[:private] << m}
129
+
130
+ when :protected
131
+
132
+ self.protected_methods.sort.each {|m| mlists[:protected] << m}
133
+
134
+ when :public
135
+
136
+ self.public_methods.sort.each {|m| mlists[:public] << m}
137
+
138
+ end
139
+
140
+ else
141
+
142
+ self.methods.sort.each {|m| mlists[:methods] << m} unless type
143
+ self.private_methods.sort.each {|m| mlists[:private] << m}
144
+ self.protected_methods.sort.each {|m| mlists[:protected] << m}
145
+ self.public_methods.sort.each {|m| mlists[:public] << m}
146
+
147
+ end
148
+
149
+ mlists.delete_if {|k,v| v == []}
150
+
151
+ if mlists.count < 1
152
+
153
+ if type
154
+
155
+ puts "[+] No methods of #{type} type available!"
156
+
157
+ else
158
+
159
+ puts "[+] No methods available!"
160
+
161
+ end
162
+
163
+ return
164
+
165
+ end
166
+
167
+ lengths = []
168
+ headings = ['#']
169
+
170
+ mlists.each do |k,v|
171
+ headings << k.to_s.gsub('_',' ').capitalize
172
+ lengths << v.length
173
+ end
174
+
175
+ max_len = lengths.uniq.sort.last
176
+
177
+ table = Terminal::Table.new()
178
+ table.headings = headings
179
+ table.title = "Methods: #{self.class}"
180
+
181
+ rows = []
182
+
183
+ max_len.times do |n|
184
+
185
+ row = []
186
+
187
+ row << n
188
+ mlists.each { |k,v| row << mlists[k][n] }
189
+
190
+ rows << row
191
+
192
+ end
193
+
194
+ table.rows = rows
195
+
196
+ return table
197
+
198
+ end
199
+
200
+ end
@@ -0,0 +1,377 @@
1
+ #!/usr/bin/ruby
2
+ # encoding: ASCII-8BIT
3
+
4
+ # Extension of the String class.
5
+ class String
6
+
7
+ require 'base64'
8
+
9
+ HEX_VALUES = "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f" +
10
+ "\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f" +
11
+ "\x20\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f" +
12
+ "\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3a\x3b\x3c\x3d\x3e\x3f" +
13
+ "\x40\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f" +
14
+ "\x50\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5a\x5b\x5c\x5d\x5e\x5f" +
15
+ "\x60\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6a\x6b\x6c\x6d\x6e\x6f" +
16
+ "\x70\x71\x72\x73\x74\x75\x76\x77\x78\x79\x7a\x7b\x7c\x7d\x7e\x7f" +
17
+ "\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f" +
18
+ "\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f" +
19
+ "\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf" +
20
+ "\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf" +
21
+ "\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf" +
22
+ "\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf" +
23
+ "\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef" +
24
+ "\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff"
25
+
26
+ # generate all hex values and return them in a string
27
+ def self.generate_all_hex_values(upcase=true)
28
+
29
+ s = ""
30
+
31
+ 256.times do |n|
32
+
33
+ n = n.to_s(16)
34
+ n = n.upcase if upcase
35
+ n = '0' + n if n.length < 2
36
+ s += '\x' + n
37
+
38
+ end
39
+
40
+ return s
41
+
42
+ end
43
+
44
+ # Insert a string at a random index within this string
45
+ def rando_insert(str)
46
+
47
+ unless self.length > 1
48
+
49
+ raise "String length is too short! length must be 2 or greater (len >= 2)"
50
+
51
+ end
52
+
53
+ return self.dup.insert(rand(0..(self.length-1)), str)
54
+
55
+ end
56
+
57
+ # return the string with a border at the top and bottom of the string
58
+ # border character can be altered
59
+ def borderize(char='-')
60
+
61
+ border = char * self.length
62
+ return "#{border}\n#{self}\n#{border}"
63
+
64
+ end
65
+
66
+ # trim the string to a particular length and echo it to stdout as a
67
+ # script ready string
68
+ def prettyfi(max_len=60)
69
+
70
+ if self.length < max_len
71
+
72
+ out = self
73
+
74
+ else
75
+
76
+ # holds output fragments
77
+ buff = []
78
+
79
+ start, _end = 0, (max_len-1)
80
+
81
+ ind,counter = -1, 0
82
+
83
+ chunk = ""
84
+ while c = self[ind+=1]
85
+
86
+ counter += 1
87
+ chunk += c
88
+
89
+ if counter == (max_len) or ind == (self.length-1)
90
+
91
+ buff << '"' + chunk + '"'
92
+ chunk = ""
93
+ counter = 0
94
+
95
+ end
96
+
97
+ end
98
+
99
+ out = buff.join(" +\n")
100
+
101
+ end
102
+
103
+ return out
104
+
105
+ end
106
+
107
+ # same thing as prettyfi but converts contents of the string
108
+ # to \x format
109
+ def prettyfi_shellcode(prefix: '\x', limit: 16)
110
+
111
+ ary = self.bin_to_array
112
+
113
+ output = ""
114
+
115
+ # Maximum index position of split array
116
+ max = (ary.length - 1)
117
+
118
+ # Bottom of slice range
119
+ floor = 0
120
+
121
+ # Top of slice range
122
+ ceiling = (limit-1)
123
+
124
+ while true
125
+
126
+ slice = prefix + ary.slice(floor..ceiling).join(prefix)
127
+
128
+ output += '"' + slice + '"'
129
+
130
+ break if ceiling >= max
131
+
132
+ floor += limit
133
+ ceiling += limit
134
+ output += "+\n"
135
+
136
+ end
137
+
138
+ return output
139
+
140
+ end
141
+
142
+ # Prefix the string with a symbol wrapped in two characters.
143
+ def prefix(symbol: '+', wrapper: ["[","]"], space_char: " ", space_rep: 1, ind_char: "", ind_rep: 1)
144
+
145
+ # build the indention string
146
+ indention = ind_char * ind_rep
147
+
148
+ # build the spacer string
149
+ spacer = space_char * space_rep
150
+
151
+ # build the symbol string
152
+ symbol = indention + wrapper.insert(1,symbol).join('') + spacer
153
+
154
+ return symbol + self
155
+
156
+ end
157
+
158
+ # Returna a duplicate of the string with a character prefix.
159
+ def simple_prefix(char)
160
+
161
+ return char+self
162
+
163
+ end
164
+
165
+ # Return a duplicate of the string with a character on each side.
166
+ def wrap(char)
167
+
168
+ return char+self+char
169
+
170
+ end
171
+
172
+ # Return a duplicate of the string suffixed with a single character.
173
+ def suffix(char)
174
+
175
+ return self+char
176
+
177
+ end
178
+
179
+ # Convert the string to a CSV value. Setting comma delimit to false
180
+ # will return the string wrapped in double quotes.
181
+ def to_csv_value(comma_delimit=true)
182
+
183
+ return comma_delimit ? self.wrap('"').suffix(',') : self.wrap('"')
184
+
185
+ end
186
+
187
+ # Return the string will all :: and capital letters converted to
188
+ # underscores.
189
+ def to_underscore()
190
+
191
+ # sauce: https://stackoverflow.com/questions/1509915/converting-camel-case-to-underscore-case-in-ruby
192
+ return self.gsub(/::/, '/')
193
+ .gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2')
194
+ .gsub(/([a-z\d])([A-Z])/,'\1_\2')
195
+ .tr("-", "_")
196
+ .downcase
197
+
198
+ end
199
+
200
+ # Convenience method for to_underscore()
201
+ def snake_name()
202
+
203
+ return self.to_underscore
204
+
205
+ end
206
+
207
+ # Return a duplicate of the string prefixed with @ converted to a symbol.
208
+ def to_instance_variable_name(snake_case=true, symbolize=true)
209
+
210
+ name = self.to_s
211
+ name = name.to_underscore if snake_case
212
+ name = ('@' + name) if name !~ /^@/
213
+ name = name.to_sym if symbolize
214
+
215
+ return name
216
+
217
+ end
218
+
219
+ # Convenience method for to_instance_variable_name()
220
+ def to_ivar_name(snake_case=true, symbolize=true)
221
+
222
+ to_instance_variable_name(snake_case, symbolize)
223
+
224
+ end
225
+
226
+ # Pads each binary component in the string with \x00. A duplicate
227
+ # of the string is modified and returned.
228
+ def utf_pad()
229
+
230
+ return self.unpack('H2'*self.bytesize)
231
+ .map {|l| l = "\x00" + [l].pack('H2')}
232
+ .join('')
233
+
234
+ end
235
+
236
+ # Return the string as an array of base 16 values. Base can be altered by
237
+ # updating the _radix_ argument.
238
+ def bin_to_array(upcase: true, radix: 16)
239
+
240
+ return self.bytes.map do |b|
241
+
242
+ if upcase
243
+ b = b.to_s(radix).upcase
244
+ else
245
+ b = b.to_s(radix)
246
+ end
247
+
248
+ if b.length < 2
249
+ b = '0' + b
250
+ else
251
+ b
252
+ end
253
+
254
+ end
255
+
256
+ end
257
+
258
+ # Returns a duplicate of the string unpacked in \x literal form. Useful
259
+ # when dynamically generating shellcode.
260
+ def to_hex_string(literal: true, prefix: '\x')
261
+
262
+ out = self.bin_to_array()
263
+
264
+ if literal
265
+ out = prefix + out.join(prefix)
266
+ else
267
+ out = out.map! {|e| [e].pack("H2") }.join('')
268
+ end
269
+
270
+ return out
271
+
272
+ end
273
+
274
+ # Return a duplicate string in literal form with each character
275
+ # suffixed with \u
276
+ def to_utf8(prefix='\u')
277
+
278
+ return prefix + self.bin_to_array.join(prefix)
279
+
280
+ end
281
+
282
+ # Return a duplicate string in literal from where each char is
283
+ # converted to utf16 literal format. Endianness can be altered
284
+ # via the _endianness_ argument.
285
+ def to_utf16(endianness='le')
286
+
287
+ if endianness !~ /^(le|be)$/i
288
+
289
+ raise "Error: valid arguments to endianness parameter: le or be"
290
+
291
+ end
292
+
293
+ pad = '00'
294
+ prefix = '\u'
295
+
296
+ # get a copy of the string in hex form
297
+ # and pad each byte
298
+ buff = prefix + self.bin_to_array
299
+ .map do |b|
300
+
301
+ if endianness =~ /^le$/i
302
+ (b = b + pad)
303
+ else
304
+ (b = pad + b)
305
+ end
306
+
307
+ end.join(prefix)
308
+
309
+ return buff
310
+
311
+ end
312
+
313
+ # Poor mans URL encoding: each character is unpacked to
314
+ # it's hex form and then suffixed with %.
315
+ def to_url_encoded()
316
+ return '%' + self.bin_to_array.join('%')
317
+ end
318
+
319
+ # Base64 encode and return a duplicate string.
320
+ def to_base64(strict=false)
321
+ if strict
322
+ return Base64::strict_encode64(self)
323
+ else
324
+ return Base64::encode64(self)
325
+ end
326
+ end
327
+
328
+ # Base64 decde and return a duplicate string.
329
+ def decode64(strict=false)
330
+ if strict
331
+ return Base64::strict_decode64(self)
332
+ else
333
+ return Base64::decode64(self)
334
+ end
335
+ end
336
+
337
+ # Encode and return a duplicate of the string in _0b0010110_ format.
338
+ def to_binary(prefix='0b')
339
+
340
+ return prefix+self.bytes
341
+ .map do |b|
342
+
343
+ b = b.to_s(2)
344
+ b = '0' * (8 - b.length) + b
345
+
346
+ end
347
+ .join(prefix)
348
+
349
+ end
350
+
351
+ # Return a duplicate of the string with the case altered randomly.
352
+ def obfuscate_case()
353
+
354
+ return self.split('').map do |c|
355
+
356
+ if rand(0..1) > 0
357
+
358
+ c = c.upcase
359
+
360
+ else
361
+
362
+ c = c.downcase
363
+
364
+ end
365
+
366
+ end.join('')
367
+
368
+ end
369
+
370
+ # Inser _string_ at a random place in the current string.
371
+ def obfuscate_string_insert(string)
372
+
373
+ return self.insert(rand(0..(self.length - 1)), string)
374
+
375
+ end
376
+
377
+ end