lib/rex/encoding/xor/dword_additive.rb in librex-0.0.68 vs lib/rex/encoding/xor/dword_additive.rb in librex-0.0.70
- old
+ new
@@ -1,6 +1,5 @@
-#!/usr/bin/env ruby
# -*- coding: binary -*-
require 'rex/encoding/xor/exceptions'
require 'rex/encoding/xor/generic'
@@ -14,80 +13,80 @@
module Encoding
module Xor
class DwordAdditive < Generic
- def DwordAdditive.keysize
- 4
- end
+ def DwordAdditive.keysize
+ 4
+ end
- def DwordAdditive._packspec
- 'V'
- end
+ def DwordAdditive._packspec
+ 'V'
+ end
- def DwordAdditive.pack_key(key)
- return [ key ].pack(_packspec)
- end
- def DwordAdditive.unpack_key(key)
- return key.unpack(_packspec)[0]
- end
+ def DwordAdditive.pack_key(key)
+ return [ key ].pack(_packspec)
+ end
+ def DwordAdditive.unpack_key(key)
+ return key.unpack(_packspec)[0]
+ end
- # hook in the key mutation routine of encode for the additive feedback
- def DwordAdditive._encode_mutate_key(buf, key, pos, len)
- if (pos + 1) % len == 0
- # add the last len bytes (in this case 4) with the key,
- # dropping off any overflow
- key = pack_key(
- unpack_key(key) + unpack_key(buf[pos - (len - 1), len]) &
- (1 << (len << 3)) - 1
- )
- end
+ # hook in the key mutation routine of encode for the additive feedback
+ def DwordAdditive._encode_mutate_key(buf, key, pos, len)
+ if (pos + 1) % len == 0
+ # add the last len bytes (in this case 4) with the key,
+ # dropping off any overflow
+ key = pack_key(
+ unpack_key(key) + unpack_key(buf[pos - (len - 1), len]) &
+ (1 << (len << 3)) - 1
+ )
+ end
- return key
- end
+ return key
+ end
- #
- # I realize this algorithm is broken. We invalidate some keys
- # in _find_bad_keys that could actually be perfectly fine. However,
- # it seems to work ok for now, and this is all just a lame adhoc method.
- # Maybe someday we can revisit this and make it a bit less ghetto...
- #
+ #
+ # I realize this algorithm is broken. We invalidate some keys
+ # in _find_bad_keys that could actually be perfectly fine. However,
+ # it seems to work ok for now, and this is all just a lame adhoc method.
+ # Maybe someday we can revisit this and make it a bit less ghetto...
+ #
- def DwordAdditive._find_good_key(data, badkeys, badchars)
+ def DwordAdditive._find_good_key(data, badkeys, badchars)
- ksize = keysize
- kstart = ""
- ksize.times { kstart << rand(256) } # random key starting place
+ ksize = keysize
+ kstart = ""
+ ksize.times { kstart << rand(256) } # random key starting place
- key = kstart.dup
+ key = kstart.dup
- #
- # now for the ghettoness of an algorithm:
- # try the random key we picked
- # if the key failed, figure out which key byte corresponds
- # increment that key byte
- # if we wrapped a byte all the way around, fail :(
- #
+ #
+ # now for the ghettoness of an algorithm:
+ # try the random key we picked
+ # if the key failed, figure out which key byte corresponds
+ # increment that key byte
+ # if we wrapped a byte all the way around, fail :(
+ #
- loop do
- # ok, try to encode it, any bad chars present?
- pos = _check(data, key, badchars)
+ loop do
+ # ok, try to encode it, any bad chars present?
+ pos = _check(data, key, badchars)
- # yay, no problems, we found a key!
- break if !pos
+ # yay, no problems, we found a key!
+ break if !pos
- strip = pos % ksize
+ strip = pos % ksize
- # increment the offending key byte
- key[strip] = key[strip] + 1 & 0xff
+ # increment the offending key byte
+ key[strip] = key[strip] + 1 & 0xff
- # We wrapped around!
- if key[strip] == kstart[strip]
- raise KeySearchError, "Key space exhausted on strip #{strip}!", caller
- end
- end
+ # We wrapped around!
+ if key[strip] == kstart[strip]
+ raise KeySearchError, "Key space exhausted on strip #{strip}!", caller
+ end
+ end
- return key
- end
+ return key
+ end
end end end end # DwordAdditive/Xor/Encoding/Rex