librex 0.0.46 → 0.0.47

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.
@@ -3,7 +3,7 @@
3
3
  A non-official re-packaging of the Rex library as a gem for easy of usage of the Metasploit REX framework in a non Metasploit application. I received permission from HDM to create this package.
4
4
 
5
5
  Currently based on:
6
- SVN Revision: 13557
6
+ SVN Revision: 13604
7
7
 
8
8
  # Credits
9
9
  The Metasploit development team <http://www.metasploit.com>
@@ -133,7 +133,7 @@ def self.open_browser(url='http://metasploit.com/')
133
133
  # "sensible-browser" opens the "default" browser in Ubuntu and others, so try that first
134
134
  # but also provide fallbacks
135
135
  ['sensible-browser', 'firefox', 'opera', 'chromium-browser', 'konqueror'].each do |browser|
136
- ENV['PATH'].split(':').each do |path|
136
+ ENV['PATH'].split(':').each do |path|
137
137
  # Does the browser exists?
138
138
  if File.exists?("#{path}/#{browser}")
139
139
  system("#{browser} #{url} &")
@@ -263,7 +263,7 @@ module Rex
263
263
  @state[:service].each do |k,v|
264
264
  case k
265
265
  when "protocol"
266
- port_hash[:protocol] = v
266
+ port_hash[:proto] = v
267
267
  when "port"
268
268
  port_hash[:port] = v
269
269
  when "status"
@@ -351,10 +351,10 @@ module Rex
351
351
  db.emit(:address,@report_data[:host],&block) if block
352
352
  host_object = db_report(:host, @report_data.merge(
353
353
  :workspace => @args[:wspace] ) )
354
- if host_object
355
- db.report_import_note(host_object.workspace, host_object)
356
- end
357
- host_object
354
+ if host_object
355
+ db.report_import_note(host_object.workspace, host_object)
356
+ end
357
+ host_object
358
358
  end
359
359
  end
360
360
 
@@ -281,7 +281,7 @@ module Rex
281
281
  @state[:service].each do |k,v|
282
282
  case k
283
283
  when "protocol"
284
- port_hash[:protocol] = v
284
+ port_hash[:proto] = v
285
285
  when "port"
286
286
  port_hash[:port] = v
287
287
  when "name"
@@ -273,7 +273,7 @@ module Rex
273
273
  @state[:port].each do |k,v|
274
274
  case k
275
275
  when "protocol"
276
- port_hash[:protocol] = v
276
+ port_hash[:proto] = v
277
277
  when "portid"
278
278
  port_hash[:port] = v
279
279
  when "state"
@@ -8,13 +8,21 @@ module Extensions
8
8
  module Stdapi
9
9
  module Railgun
10
10
 
11
+ #
12
+ # A container holding useful Windows API Constants.
13
+ #
11
14
  class ApiConstants
12
15
 
13
16
  # This will be lazily loaded in self.manager
14
17
  @@manager = nil
18
+
19
+ # Mutex to ensure we don't add constants more than once via thread races.
15
20
  @@manager_semaphore = Mutex.new
16
21
 
17
- # provides a frozen constant manager for the constants defined in self.add_constants
22
+ #
23
+ # Provides a frozen constant manager for the constants defined in
24
+ # self.add_constants
25
+ #
18
26
  def self.manager
19
27
 
20
28
  # The first check for nil is to potentially skip the need to synchronize
@@ -35,6 +43,9 @@ class ApiConstants
35
43
  return @@manager
36
44
  end
37
45
 
46
+ #
47
+ # Slurp in a giant list of known constants.
48
+ #
38
49
  def self.add_constants(win_const_mgr)
39
50
  win_const_mgr.add_const('MCI_DGV_SETVIDEO_TINT',0x00004003)
40
51
  win_const_mgr.add_const('EVENT_TRACE_FLAG_PROCESS',0x00000001)
@@ -0,0 +1,31 @@
1
+ module Rex
2
+ module Post
3
+ module Meterpreter
4
+ module Extensions
5
+ module Stdapi
6
+ module Railgun
7
+ module Def
8
+
9
+ class Def_crypt32
10
+
11
+ def self.create_dll(dll_path = 'crypt32')
12
+ dll = DLL.new(dll_path, ApiConstants.manager)
13
+
14
+ dll.add_function('CryptUnprotectData', 'BOOL', [
15
+ ['PBLOB','pDataIn', 'in'],
16
+ ['PWCHAR', 'szDataDescr', 'out'],
17
+ ['PBLOB', 'pOptionalEntropy', 'in'],
18
+ ['PDWORD', 'pvReserved', 'in'],
19
+ ['PBLOB', 'pPromptStruct', 'in'],
20
+ ['DWORD', 'dwFlags', 'in'],
21
+ ['PBLOB', 'pDataOut', 'out']
22
+ ])
23
+
24
+ return dll
25
+ end
26
+
27
+ end
28
+
29
+ end; end; end; end; end; end; end
30
+
31
+
@@ -36,7 +36,7 @@ module Stdapi
36
36
  module Railgun
37
37
 
38
38
  #
39
- # represents a DLL, e.g. kernel32.dll
39
+ # Represents a DLL, e.g. kernel32.dll
40
40
  #
41
41
  class DLL
42
42
 
@@ -62,6 +62,15 @@ class DLL
62
62
  return functions[name]
63
63
  end
64
64
 
65
+ #
66
+ # Perform a function call in this DLL on the remote system.
67
+ #
68
+ # Returns a Hash containing the return value, the result of GetLastError(),
69
+ # and any +inout+ parameters.
70
+ #
71
+ # Raises an exception if +func_symbol+ is not a known function in this DLL,
72
+ # i.e., it hasn't been defined in a Def.
73
+ #
65
74
  def call_function(func_symbol, args, client)
66
75
  func_name = func_symbol.to_s
67
76
 
@@ -74,22 +83,29 @@ class DLL
74
83
  return process_function_call(function, args, client)
75
84
  end
76
85
 
77
- # syntax for params:
78
- # add_function("MessageBoxW", # name
79
- # "DWORD", # return value
80
- # [["DWORD","hWnd","in"], # params
81
- # ["PWCHAR","lpText","in"],
82
- # ["PWCHAR","lpCaption","in"],
83
- # ["DWORD","uType","in"],
84
- # ])
86
+ #
87
+ # Define a function for this DLL.
85
88
  #
86
89
  # Every function argument is described by a tuple (type,name,direction)
87
90
  #
88
- # windows_name: Use it when the actual windows name is different from the ruby variable
89
- # for example when the actual func name is myFunc@4
90
- # or when you want to create an alternative version of an existing function
91
+ # Example:
92
+ # add_function("MessageBoxW", # name
93
+ # "DWORD", # return value
94
+ # [ # params
95
+ # ["DWORD","hWnd","in"],
96
+ # ["PWCHAR","lpText","in"],
97
+ # ["PWCHAR","lpCaption","in"],
98
+ # ["DWORD","uType","in"],
99
+ # ])
100
+ #
101
+ # Use +windows_name+ when the actual windows name is different from the
102
+ # ruby variable. You might need to do this for example when the actual
103
+ # func name is myFunc@4 or when you want to create an alternative version
104
+ # of an existing function.
105
+ #
106
+ # When the new function is called it will return a list containing the
107
+ # return value and all inout params. See #call_function.
91
108
  #
92
- # When new function is called it will return a list containing the return value and all inout params
93
109
  def add_function(name, return_type, params, windows_name=nil)
94
110
  if windows_name == nil
95
111
  windows_name = name
@@ -99,7 +115,6 @@ class DLL
99
115
 
100
116
  private
101
117
 
102
- # called when a function like "MessageBoxW" is called
103
118
  def process_function_call(function, args, client)
104
119
  raise "#{function.params.length} arguments expected. #{args.length} arguments provided." unless args.length == function.params.length
105
120
 
@@ -53,13 +53,18 @@ module Railgun
53
53
  # The Railgun class to dynamically expose the Windows API.
54
54
  #
55
55
  class Railgun
56
- # If you want to add additional DLL definitions to be preloaded
57
- # create a definition class 'rex/post/meterpreter/extensions/stdapi/railgun/def/'
58
- # Naming is important and should follow convention.
59
- # For example, if your dll's name was "my_dll"
60
- # file name - def_my_dll.rb
61
- # class name - Def_my_dll
62
- # entry below - 'my_dll'
56
+
57
+ #
58
+ # Railgun::DLL's that have builtin definitions.
59
+ #
60
+ # If you want to add additional DLL definitions to be preloaded create a
61
+ # definition class 'rex/post/meterpreter/extensions/stdapi/railgun/def/'.
62
+ # Naming is important and should follow convention. For example, if your
63
+ # dll's name was "my_dll"
64
+ # file name:: def_my_dll.rb
65
+ # class name:: Def_my_dll
66
+ # entry below:: 'my_dll'
67
+ #
63
68
  BUILTIN_DLLS = [
64
69
  'kernel32',
65
70
  'ntdll',
@@ -69,30 +74,25 @@ class Railgun
69
74
  'advapi32',
70
75
  'shell32',
71
76
  'netapi32',
77
+ 'crypt32'
72
78
  ].freeze
73
79
 
74
80
  ##
75
- # dlls
76
- #
77
- # Returns a hash containing DLLs added to this instance with self.add_dll
78
- # as well as references to any frozen cached dlls added directly in self.get_dll
79
- # and copies of any frozen dlls (added directly with self.add_function)
80
- # that the user attempted to modify with self.add_function
81
+ # Returns a Hash containing DLLs added to this instance with #add_dll
82
+ # as well as references to any frozen cached dlls added directly in #get_dll
83
+ # and copies of any frozen dlls (added directly with #add_function)
84
+ # that the user attempted to modify with #add_function.
81
85
  #
82
86
  # Keys are friendly DLL names and values are the corresponding DLL instance
83
87
  attr_accessor :dlls
84
88
 
85
89
  ##
86
- # client
87
- #
88
90
  # Contains a reference to the client that corresponds to this instance of railgun
89
91
  attr_accessor :client
90
92
 
91
93
  ##
92
- # @@cached_dlls
93
- #
94
94
  # These DLLs are loaded lazily and then shared amongst all railgun instances.
95
- # For safety reasons this variable should only be read/written within get_dll.
95
+ # For safety reasons this variable should only be read/written within #get_dll.
96
96
  @@cached_dlls = {}
97
97
 
98
98
  # if you are going to touch @@cached_dlls, wear protection
@@ -103,20 +103,30 @@ class Railgun
103
103
  self.dlls = {}
104
104
  end
105
105
 
106
+ #
107
+ # Return this Railgun's Util instance.
108
+ #
106
109
  def util
107
110
  if @util.nil?
108
- Util.new(self, client.platform)
111
+ @util = Util.new(self, client.platform)
109
112
  end
110
113
 
111
114
  return @util
112
115
  end
113
116
 
117
+ #
118
+ # Return this Railgun's WinConstManager instance, initially populated with
119
+ # constants defined in ApiConstants.
120
+ #
114
121
  def constant_manager
115
122
  # Loads lazily
116
123
  return ApiConstants.manager
117
124
  end
118
125
 
119
- # read data from a memory address on the host (useful for working with LPVOID parameters)
126
+ #
127
+ # Read data from a memory address on the host (useful for working with
128
+ # LPVOID parameters)
129
+ #
120
130
  def memread(address, length)
121
131
 
122
132
  raise "Invalid parameters." if(not address or not length)
@@ -134,7 +144,10 @@ class Railgun
134
144
  return nil
135
145
  end
136
146
 
137
- # write data to a memory address on the host (useful for working with LPVOID parameters)
147
+ #
148
+ # Write data to a memory address on the host (useful for working with
149
+ # LPVOID parameters)
150
+ #
138
151
  def memwrite(address, data, length)
139
152
 
140
153
  raise "Invalid parameters." if(not address or not data or not length)
@@ -153,9 +166,13 @@ class Railgun
153
166
  return false
154
167
  end
155
168
 
156
- # adds a function to an existing DLL-definition.
157
- # if the DLL-definition is frozen (idealy this should be true for all cached dlls)
158
- # an unfrozen copy is created and used henceforth for this instance.
169
+ #
170
+ # Adds a function to an existing DLL definition.
171
+ #
172
+ # If the DLL definition is frozen (ideally this should be the case for all
173
+ # cached dlls) an unfrozen copy is created and used henceforth for this
174
+ # instance.
175
+ #
159
176
  def add_function(dll_name, function_name, return_type, params, windows_name=nil)
160
177
 
161
178
  unless known_dll_names.include?(dll_name)
@@ -176,9 +193,16 @@ class Railgun
176
193
  dll.add_function(function_name, return_type, params, windows_name)
177
194
  end
178
195
 
179
- # adds a function to an existing DLL-definition
180
- # you can override the dll name if you want to include a path or the DLL name contains
181
- # non-ruby-approved characters
196
+ #
197
+ # Adds a DLL to this Railgun.
198
+ #
199
+ # The +windows_name+ is the name used on the remote system and should be
200
+ # set appropriately if you want to include a path or the DLL name contains
201
+ # non-ruby-approved characters.
202
+ #
203
+ # Raises an exception if a dll with the given name has already been
204
+ # defined.
205
+ #
182
206
  def add_dll(dll_name, windows_name=dll_name)
183
207
 
184
208
  if dlls.has_key? dll_name
@@ -193,8 +217,11 @@ class Railgun
193
217
  return BUILTIN_DLLS | dlls.keys
194
218
  end
195
219
 
196
- # Attempts to provide a DLL instance of the given name. Handles lazy loading and caching
197
- # Note that if a DLL of the given name does not exist, then nil is returned
220
+ #
221
+ # Attempts to provide a DLL instance of the given name. Handles lazy
222
+ # loading and caching. Note that if a DLL of the given name does not
223
+ # exist, returns nil
224
+ #
198
225
  def get_dll(dll_name)
199
226
 
200
227
  # If the DLL is not local, we now either load it from cache or load it lazily.
@@ -224,11 +251,13 @@ class Railgun
224
251
  return dlls[dll_name]
225
252
  end
226
253
 
227
- # we fake having members like user32 and kernel32.
254
+ #
255
+ # Fake having members like user32 and kernel32.
228
256
  # reason is that
229
257
  # ...user32.MessageBoxW()
230
258
  # is prettier than
231
259
  # ...dlls["user32"].functions["MessageBoxW"]()
260
+ #
232
261
  def method_missing(dll_symbol, *args)
233
262
  dll_name = dll_symbol.to_s
234
263
 
@@ -241,12 +270,16 @@ class Railgun
241
270
  return DLLWrapper.new(dll, client)
242
271
  end
243
272
 
244
- # Give the programmer access to constants
273
+ #
274
+ # Return a Windows constant matching +str+.
275
+ #
245
276
  def const(str)
246
277
  return constant_manager.parse(str)
247
278
  end
248
279
 
280
+ #
249
281
  # The multi-call shorthand (["kernel32", "ExitProcess", [0]])
282
+ #
250
283
  def multi(functions)
251
284
  if @multicaller.nil?
252
285
  @multicaller = MultiCaller.new(client, self)
@@ -18,7 +18,7 @@ class Railgun::UnitTest < Test::Unit::TestCase
18
18
  # DLLs we know should be available at the time of this writing,
19
19
  # and DLLs that because of changes since then should be available
20
20
  STOCK_DLLS =
21
- ['kernel32', 'ntdll', 'user32', 'ws2_32',
21
+ ['kernel32', 'ntdll', 'user32', 'ws2_32', 'crypt32',
22
22
  'iphlpapi', 'netapi32', 'advapi32', 'shell32'] | Railgun::BUILTIN_DLLS
23
23
 
24
24
  include MockMagic
@@ -6,6 +6,10 @@ module Meterpreter
6
6
  module Extensions
7
7
  module Stdapi
8
8
  module Railgun
9
+
10
+ #
11
+ # Utility methods and constants for dealing with most types of variables.
12
+ #
9
13
  class Util
10
14
 
11
15
  # Bring in some useful string manipulation utility functions
@@ -29,8 +33,10 @@ class Util
29
33
  :wchar_t => 2,
30
34
  }
31
35
 
32
- # Maps a data type to its corresponding primitive or special type :pointer
33
- # Note, primitive types are mapped to themselves
36
+ #
37
+ # Maps a data type to its corresponding primitive or special type
38
+ # +:pointer+. Note, primitive types are mapped to themselves.
39
+ #
34
40
  # typedef info: http://msdn.microsoft.com/en-us/library/aa383751(v=vs.85).aspx
35
41
  TYPE_DEFINITIONS = {
36
42
  ##
@@ -312,7 +318,9 @@ class Util
312
318
  @is_64bit = is_64bit_platform?(platform)
313
319
  end
314
320
 
321
+ #
315
322
  # Given a packed pointer, unpacks it according to architecture
323
+ #
316
324
  def unpack_pointer(packed_pointer)
317
325
  if is_64bit
318
326
  # XXX: Only works if attacker and victim are like-endianed
@@ -322,14 +330,15 @@ class Util
322
330
  end
323
331
  end
324
332
 
325
- ###
326
- # Summary: Returns true if pointer will be considered a 'null' pointer
327
333
  #
328
- # If given nil, returns true
329
- # If given 0, returns true
330
- # If given a string, if 0 after unpacking, returns true
334
+ # Returns true if +pointer+ will be considered a 'null' pointer.
335
+ #
336
+ # If +pointer+ is nil or 0, returns true
337
+ # If +pointer+ is a String, if 0 after unpacking, returns true
331
338
  # false otherwise
332
- ##
339
+ #
340
+ # See #unpack_pointer
341
+ #
333
342
  def is_null_pointer(pointer)
334
343
  if pointer.class == String
335
344
  pointer = unpack_pointer(pointer)
@@ -338,12 +347,13 @@ class Util
338
347
  return pointer.nil? || pointer == 0
339
348
  end
340
349
 
341
- ###
342
- # Summary: Reads null-terminated unicode strings from memory.
343
350
  #
344
- # Given a pointer to a null terminated array of WCHARs, return a ruby string
345
- # Null pointers cause an empty string to be returned
346
- ##
351
+ # Reads null-terminated unicode strings from memory.
352
+ #
353
+ # Given a pointer to a null terminated array of WCHARs, return a ruby
354
+ # String. If +pointer+ is NULL (see #is_null_pointer) returns an empty
355
+ # string.
356
+ #
347
357
  def read_wstring(pointer, length = nil)
348
358
  # Return an empty string for null pointers
349
359
  if is_null_pointer(pointer)
@@ -364,12 +374,12 @@ class Util
364
374
  return str
365
375
  end
366
376
 
367
- ###
368
- # Summary: Read a given number of bytes from memory or from a provided buffer.
369
377
  #
370
- # If 'buffer' is not provided, read 'size' bytes from the client's memory
371
- # If 'buffer' is provided, reads 'size' characters from the index of 'address'
372
- ##
378
+ # Read a given number of bytes from memory or from a provided buffer.
379
+ #
380
+ # If +buffer+ is not provided, read +size+ bytes from the client's memory.
381
+ # If +buffer+ is provided, reads +size+ characters from the index of +address+.
382
+ #
373
383
  def memread(address, size, buffer = nil)
374
384
  if buffer.nil?
375
385
  return railgun.memread(address, size)
@@ -378,12 +388,16 @@ class Util
378
388
  end
379
389
  end
380
390
 
391
+ #
381
392
  # Read and unpack a pointer from the given buffer at a given offset
393
+ #
382
394
  def read_pointer(buffer, offset = 0)
383
395
  unpack_pointer(buffer[offset, (offset + pointer_size)])
384
396
  end
385
397
 
398
+ #
386
399
  # Reads data structures and several windows data types
400
+ #
387
401
  def read_data(type, position, buffer = nil)
388
402
  if buffer.nil?
389
403
  buffer = memread(position, sizeof_type(type))
@@ -426,8 +440,11 @@ class Util
426
440
  return raw
427
441
  end
428
442
 
429
- # Read 'length' number of instances of 'type' from 'bufptr'
430
- # bufptr is an index in 'buffer' or, if buffer is nil, a memory address
443
+ #
444
+ # Read +length+ number of instances of +type+ from +bufptr+ .
445
+ #
446
+ # +bufptr+ is an index in +buffer+ or, if +buffer+ is nil, a memory address
447
+ #
431
448
  def read_array(type, length, bufptr, buffer = nil)
432
449
  if length <= 0
433
450
  return []
@@ -448,8 +465,10 @@ class Util
448
465
  end
449
466
  end
450
467
 
451
- # construct the data structure described in 'definition' from 'buffer'
452
- # starting from the index 'offset'
468
+ #
469
+ # Construct the data structure described in +definition+ from +buffer+
470
+ # starting from the index +offset+
471
+ #
453
472
  def read_struct(definition, buffer, offset = 0)
454
473
  data = {}
455
474
 
@@ -520,7 +539,9 @@ class Util
520
539
  raise "Unable to determine size for type #{type}."
521
540
  end
522
541
 
523
- # Calculates the size of the struct after alignment
542
+ #
543
+ # Calculates the size of +struct+ after alignment.
544
+ #
524
545
  def sizeof_struct(struct)
525
546
  offsets = struct_offsets(struct, 0)
526
547
  last_data_size = sizeof_type(struct.last[1])
@@ -529,9 +550,11 @@ class Util
529
550
  return size_no_padding + calc_padding(size_no_padding)
530
551
  end
531
552
 
532
- # Given a description of a data structure, returns an array containing
553
+ #
554
+ # Given a description of a data structure, returns an Array containing
533
555
  # the offset from the beginning for each subsequent element, taking into
534
- # consideration alignment and padding
556
+ # consideration alignment and padding.
557
+ #
535
558
  def struct_offsets(definition, offset)
536
559
  padding = 0
537
560
  offsets = []
@@ -558,7 +581,9 @@ class Util
558
581
  is_64bit ? 8 : 4
559
582
  end
560
583
 
561
- # Bytes that needed to be added to be aligned
584
+ #
585
+ # Number of bytes that needed to be added to be aligned.
586
+ #
562
587
  def calc_padding(offset)
563
588
  align = required_alignment
564
589
 
@@ -571,9 +596,11 @@ class Util
571
596
  end
572
597
  end
573
598
 
599
+ #
574
600
  # Given an explicit array definition (e.g. BYTE[23]) return size (e.g. 23) and
575
- # and type (e.g. BYTE). If a constant is given, attempt to resolve it
576
- # that constant
601
+ # and +type+ (e.g. BYTE). If a constant is given, attempt to resolve it
602
+ # that constant.
603
+ #
577
604
  def split_array_type(type)
578
605
  if type =~ /^(\w+)\[(\w+)\]$/
579
606
  element_type = $1
@@ -595,18 +622,17 @@ class Util
595
622
  platform =~ /win64/
596
623
  end
597
624
 
598
- ###
599
- # Summary:
600
- # Evaluates a bit field, returning a hash representing the meaning
601
- # and state of each bit.
625
+ #
626
+ # Evaluates a bit field, returning a hash representing the meaning and
627
+ # state of each bit.
602
628
  #
603
629
  # Parameters:
604
- # value: a bit field represented by a Fixnum
605
- # mappings: { 'WINAPI_CONSTANT_NAME' => :descriptive_symbol, ... }
630
+ # +value+:: a bit field represented by a Fixnum
631
+ # +mappings+:: { 'WINAPI_CONSTANT_NAME' => :descriptive_symbol, ... }
606
632
  #
607
633
  # Returns:
608
634
  # { :descriptive_symbol => true/false, ... }
609
- ##
635
+ #
610
636
  def judge_bit_field(value, mappings)
611
637
  flags = {}
612
638
  rg = railgun
@@ -1,4 +1,4 @@
1
- # $Id: server.rb 13165 2011-07-14 02:34:25Z scriptjunkie $
1
+ # $Id: server.rb 13577 2011-08-18 00:18:43Z scriptjunkie $
2
2
 
3
3
  require 'rex/socket'
4
4
  require 'rex/proto/dhcp'
@@ -228,7 +228,7 @@ protected
228
228
  spot = spot + optionLen + 2
229
229
  if optionType == 53
230
230
  messageType = optionValue.unpack("C").first
231
- elsif optionType == 150
231
+ elsif optionType == 150 or (optionType == 60 and optionValue.include? "PXEClient")
232
232
  pxeclient = true
233
233
  end
234
234
  end
@@ -82,6 +82,10 @@ module DispatcherShell
82
82
  shell.update_prompt(prompt, prompt_char, mode)
83
83
  end
84
84
 
85
+ def cmd_help_help
86
+ print_line "There's only so much I can do"
87
+ end
88
+
85
89
  #
86
90
  # Displays the help banner. With no arguments, this is just a list of
87
91
  # all commands grouped by dispatcher. Otherwise, tries to use a method
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: librex
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.46
4
+ version: 0.0.47
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -10,10 +10,10 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2011-08-13 00:00:00.000000000Z
13
+ date: 2011-08-21 00:00:00.000000000Z
14
14
  dependencies: []
15
15
  description: Rex provides a variety of classes useful for security testing and exploit
16
- development. Based on SVN Revision 13557
16
+ development. Based on SVN Revision 13604
17
17
  email:
18
18
  - hdm@metasploit.com
19
19
  - jacob.hammack@hammackj.com
@@ -239,6 +239,7 @@ files:
239
239
  - lib/rex/post/meterpreter/extensions/stdapi/railgun/buffer_item.rb
240
240
  - lib/rex/post/meterpreter/extensions/stdapi/railgun/buffer_item.rb.ut.rb
241
241
  - lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_advapi32.rb
242
+ - lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_crypt32.rb
242
243
  - lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_iphlpapi.rb
243
244
  - lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_kernel32.rb
244
245
  - lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_netapi32.rb