lib/rex/ole/header.rb in librex-0.0.68 vs lib/rex/ole/header.rb in librex-0.0.70

- old
+ new

@@ -1,10 +1,6 @@ # -*- coding: binary -*- -## -# $Id: header.rb 15548 2012-06-29 06:08:20Z rapid7 $ -# Version: $Revision: 15548 $ -## ## # Rex::OLE - an OLE implementation # written in 2010 by Joshua J. Drake <jduck [at] metasploit.com> ## @@ -18,187 +14,187 @@ require 'rex/ole/util' class Header - attr_accessor :_csectFat, :_sectFat - attr_accessor :_csectMiniFat, :_sectMiniFatStart - attr_accessor :_ulMiniSectorCutoff, :_uMiniSectorShift - attr_accessor :_csectDif, :_sectDifStart - attr_accessor :_sectDirStart - attr_accessor :_uMajorVersion + attr_accessor :_csectFat, :_sectFat + attr_accessor :_csectMiniFat, :_sectMiniFatStart + attr_accessor :_ulMiniSectorCutoff, :_uMiniSectorShift + attr_accessor :_csectDif, :_sectDifStart + attr_accessor :_sectDirStart + attr_accessor :_uMajorVersion - attr_accessor :sector_size, :idx_per_sect - attr_accessor :mini_sector_size + attr_accessor :sector_size, :idx_per_sect + attr_accessor :mini_sector_size - def initialize - set_defaults + def initialize + set_defaults - # calculate some numbers (save a little math) - @sector_size = 1 << @_uSectorShift - @mini_sector_size = 1 << @_uMiniSectorShift - @idx_per_sect = @sector_size / 4 - end + # calculate some numbers (save a little math) + @sector_size = 1 << @_uSectorShift + @mini_sector_size = 1 << @_uMiniSectorShift + @idx_per_sect = @sector_size / 4 + end - def set_defaults - @_abSig = SIG - @_clid = CLSID.new - @_uByteOrder = LITTLE_ENDIAN + def set_defaults + @_abSig = SIG + @_clid = CLSID.new + @_uByteOrder = LITTLE_ENDIAN - @_uMinorVersion = 0x3e - @_uMajorVersion = 0x03 + @_uMinorVersion = 0x3e + @_uMajorVersion = 0x03 - @_uSectorShift = 9 # 512 byte sectors - @_uMiniSectorShift = 6 # 64 byte mini-sectors + @_uSectorShift = 9 # 512 byte sectors + @_uMiniSectorShift = 6 # 64 byte mini-sectors - @_csectDir = nil # TBD (v4 only, 1 required) + @_csectDir = nil # TBD (v4 only, 1 required) - @_csectFat = nil # TBD (one required) - @_sectDirStart = nil # TBD (one required) + @_csectFat = nil # TBD (one required) + @_sectDirStart = nil # TBD (one required) - @_signature = 0 # no transactions support + @_signature = 0 # no transactions support - @_ulMiniSectorCutoff = 0x1000 # 4k - @_sectMiniFatStart = SECT_END # TBD - @_csectMiniFat = 0 # TBD + @_ulMiniSectorCutoff = 0x1000 # 4k + @_sectMiniFatStart = SECT_END # TBD + @_csectMiniFat = 0 # TBD - @_sectDifStart = SECT_END # TBD (default to none) - @_csectDif = 0 # TBD (default to none) + @_sectDifStart = SECT_END # TBD (default to none) + @_csectDif = 0 # TBD (default to none) - @_sectFat = [] # TBD - end + @_sectFat = [] # TBD + end - def to_s - ret = "{\n" - ret << " _abSig => \"%s\"" % Util.Printable(@_abSig) - ret << ",\n" - ret << " _clid => %s" % @_clid.to_s - ret << ",\n" - ret << " _uMinorVersion => 0x%04x" % @_uMinorVersion - ret << ",\n" - ret << " _uMajorVersion => 0x%04x" % @_uMajorVersion - ret << ",\n" - ret << " _uByteOrder => 0x%04x" % @_uByteOrder - ret << ",\n" - ret << " _uSectorShift => 0x%04x" % @_uSectorShift - ret << ",\n" - ret << " _uMiniSectorShift => 0x%04x" % @_uMiniSectorShift - ret << ",\n" + def to_s + ret = "{\n" + ret << " _abSig => \"%s\"" % Util.Printable(@_abSig) + ret << ",\n" + ret << " _clid => %s" % @_clid.to_s + ret << ",\n" + ret << " _uMinorVersion => 0x%04x" % @_uMinorVersion + ret << ",\n" + ret << " _uMajorVersion => 0x%04x" % @_uMajorVersion + ret << ",\n" + ret << " _uByteOrder => 0x%04x" % @_uByteOrder + ret << ",\n" + ret << " _uSectorShift => 0x%04x" % @_uSectorShift + ret << ",\n" + ret << " _uMiniSectorShift => 0x%04x" % @_uMiniSectorShift + ret << ",\n" - if (@_csectDir) - ret << " _csectDir => 0x%08x" % @_csectDir - else - ret << " _csectDir => UNALLOCATED" % @_csectDir - end - ret << ",\n" + if (@_csectDir) + ret << " _csectDir => 0x%08x" % @_csectDir + else + ret << " _csectDir => UNALLOCATED" % @_csectDir + end + ret << ",\n" - if (@_csectFat) - ret << " _csectFat => 0x%08x" % @_csectFat - else - ret << " _csectFat => UNALLOCATED" - end - ret << ",\n" + if (@_csectFat) + ret << " _csectFat => 0x%08x" % @_csectFat + else + ret << " _csectFat => UNALLOCATED" + end + ret << ",\n" - if (@_sectDirStart) - ret << " _sectDirStart => 0x%08x" % @_sectDirStart - else - ret << " _sectDirStart => UNALLOCATED" - end - ret << ",\n" + if (@_sectDirStart) + ret << " _sectDirStart => 0x%08x" % @_sectDirStart + else + ret << " _sectDirStart => UNALLOCATED" + end + ret << ",\n" - ret << " _signature => 0x%08x" % @_signature - ret << ",\n" - ret << " _uMiniSectorCutoff => 0x%08x" % @_ulMiniSectorCutoff - ret << ",\n" - ret << " _sectMiniFatStart => 0x%08x" % @_sectMiniFatStart - ret << ",\n" - ret << " _csectMiniFat => 0x%08x" % @_csectMiniFat - ret << ",\n" - ret << " _sectDifStart => 0x%08x" % @_sectDifStart - ret << ",\n" - ret << " _csectDif => 0x%08x" % @_csectDif - #ret << ",\n" - #ret << " _sectFat => " - #ret << Rex::Text.to_hex_dump32array(@_sectFat) - ret << "\n}" - ret - end + ret << " _signature => 0x%08x" % @_signature + ret << ",\n" + ret << " _uMiniSectorCutoff => 0x%08x" % @_ulMiniSectorCutoff + ret << ",\n" + ret << " _sectMiniFatStart => 0x%08x" % @_sectMiniFatStart + ret << ",\n" + ret << " _csectMiniFat => 0x%08x" % @_csectMiniFat + ret << ",\n" + ret << " _sectDifStart => 0x%08x" % @_sectDifStart + ret << ",\n" + ret << " _csectDif => 0x%08x" % @_csectDif + #ret << ",\n" + #ret << " _sectFat => " + #ret << Rex::Text.to_hex_dump32array(@_sectFat) + ret << "\n}" + ret + end - # - # low-level functions - # - def read(fd) - buf = fd.read(HDR_SZ) + # + # low-level functions + # + def read(fd) + buf = fd.read(HDR_SZ) - @_abSig = buf[0x00,8] - if (@_abSig != SIG) and (@_abSig != SIG_BETA) - raise RuntimeError, 'Invalid signature for OLE file' - end - @_clid = CLSID.new(buf[0x08,16]) + @_abSig = buf[0x00,8] + if (@_abSig != SIG) and (@_abSig != SIG_BETA) + raise RuntimeError, 'Invalid signature for OLE file' + end + @_clid = CLSID.new(buf[0x08,16]) - @_uByteOrder = Util.get16(buf, 0x1c) - Util.set_endian(@_uByteOrder) + @_uByteOrder = Util.get16(buf, 0x1c) + Util.set_endian(@_uByteOrder) - @_uMinorVersion = Util.get16(buf, 0x18) - @_uMajorVersion = Util.get16(buf, 0x1a) + @_uMinorVersion = Util.get16(buf, 0x18) + @_uMajorVersion = Util.get16(buf, 0x1a) - @_uSectorShift = Util.get16(buf, 0x1e) - @_uMiniSectorShift = Util.get16(buf, 0x20) + @_uSectorShift = Util.get16(buf, 0x1e) + @_uMiniSectorShift = Util.get16(buf, 0x20) - # ignore reserved bytes + # ignore reserved bytes - @_csectDir = Util.get32(buf, 0x28) # NOTE: only for v4 files + @_csectDir = Util.get32(buf, 0x28) # NOTE: only for v4 files - @_csectFat = Util.get32(buf, 0x2c) - @_sectDirStart = Util.get32(buf, 0x30) + @_csectFat = Util.get32(buf, 0x2c) + @_sectDirStart = Util.get32(buf, 0x30) - @_signature = Util.get32(buf, 0x34) + @_signature = Util.get32(buf, 0x34) - @_ulMiniSectorCutoff = Util.get32(buf, 0x38) - @_sectMiniFatStart = Util.get32(buf, 0x3c) - @_csectMiniFat = Util.get32(buf, 0x40) + @_ulMiniSectorCutoff = Util.get32(buf, 0x38) + @_sectMiniFatStart = Util.get32(buf, 0x3c) + @_csectMiniFat = Util.get32(buf, 0x40) - @_sectDifStart = Util.get32(buf, 0x44) - @_csectDif = Util.get32(buf, 0x48) + @_sectDifStart = Util.get32(buf, 0x44) + @_csectDif = Util.get32(buf, 0x48) - @_sectFat = Util.get32array(buf[0x4c, (109 * 4)]) - end + @_sectFat = Util.get32array(buf[0x4c, (109 * 4)]) + end - def write(fd) - hdr = "" - hdr << @_abSig - hdr << @_clid.pack - hdr << Util.pack16(@_uMinorVersion) - hdr << Util.pack16(@_uMajorVersion) - hdr << Util.pack16(@_uByteOrder) - hdr << Util.pack16(@_uSectorShift) - hdr << Util.pack16(@_uMiniSectorShift) - if (@_uMajorVersion == 0x04) - hdr << "\x00" * 6 # reserved bytes - hdr << Util.pack32(@_csectDir) - else - hdr << "\x00" * 10 # reserved bytes - end + def write(fd) + hdr = "" + hdr << @_abSig + hdr << @_clid.pack + hdr << Util.pack16(@_uMinorVersion) + hdr << Util.pack16(@_uMajorVersion) + hdr << Util.pack16(@_uByteOrder) + hdr << Util.pack16(@_uSectorShift) + hdr << Util.pack16(@_uMiniSectorShift) + if (@_uMajorVersion == 0x04) + hdr << "\x00" * 6 # reserved bytes + hdr << Util.pack32(@_csectDir) + else + hdr << "\x00" * 10 # reserved bytes + end - fs_count = @_csectFat - fs_count ||= 0 - hdr << Util.pack32(fs_count) + fs_count = @_csectFat + fs_count ||= 0 + hdr << Util.pack32(fs_count) - dir_start = @_sectDirStart - dir_start ||= SECT_END - hdr << Util.pack32(dir_start) + dir_start = @_sectDirStart + dir_start ||= SECT_END + hdr << Util.pack32(dir_start) - hdr << Util.pack32(@_signature) - hdr << Util.pack32(@_ulMiniSectorCutoff) - hdr << Util.pack32(@_sectMiniFatStart) - hdr << Util.pack32(@_csectMiniFat) - hdr << Util.pack32(@_sectDifStart) - hdr << Util.pack32(@_csectDif) - hdr << Util.pack32array(@_sectFat) + hdr << Util.pack32(@_signature) + hdr << Util.pack32(@_ulMiniSectorCutoff) + hdr << Util.pack32(@_sectMiniFatStart) + hdr << Util.pack32(@_csectMiniFat) + hdr << Util.pack32(@_sectDifStart) + hdr << Util.pack32(@_csectDif) + hdr << Util.pack32array(@_sectFat) - fd.seek(0, ::IO::SEEK_SET) - fd.write(hdr) - end + fd.seek(0, ::IO::SEEK_SET) + fd.write(hdr) + end end end end