Class: Rex::OLE::MiniFAT

Inherits:
DIFAT
  • Object
show all
Defined in:
lib/rex/ole/minifat.rb

Instance Method Summary collapse

Methods inherited from DIFAT

#+, #<<, #[], #[]=, #each, #initialize, #length, #reset, #slice!, #to_s

Constructor Details

This class inherits a constructor from Rex::OLE::DIFAT

Instance Method Details

#allocate_sectorObject



41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
# File 'lib/rex/ole/minifat.rb', line 41

def allocate_sector
	idx = @entries.index(SECT_FREE)

	if (not idx)
		# add a sector worth
		idx = @entries.length
		@stg.header.idx_per_sect.times {
			@entries << SECT_FREE
		}
	end

	# default mini-sectors to end of chain
	@entries[idx] = SECT_END
	idx
end

#readObject

low-level functions



20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# File 'lib/rex/ole/minifat.rb', line 20

def read
	@entries = []

	visited = []
	sect = @stg.header._sectMiniFatStart
	@stg.header._csectMiniFat.times { |idx|
		break if sect == SECT_END

		if (visited.include?(sect))
			raise RuntimeError, 'Sector chain loop detected (0x%08x)' % sect
		end
		visited << sect

		buf = @stg.read_sector(sect, @stg.header.sector_size)
		@stg.header.idx_per_sect.times { |idx|
			@entries << Util.get32(buf, (idx*4))
		}
		sect = @stg.next_sector(sect)
	}
end

#writeObject



57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
# File 'lib/rex/ole/minifat.rb', line 57

def write
	return if (@entries.length < 1)

	mf_start = nil
	mfs_count = 0
	prev_sect = nil
	copy = @entries.dup
	while (copy.length > 0)
		part = copy.slice!(0, @stg.header.idx_per_sect)
		sbuf = Util.pack32array(part)
		idx = @stg.write_sector(sbuf, nil, prev_sect)
		mfs_count += 1
		mf_start ||= idx
	end
	@stg.header._sectMiniFatStart = mf_start
	@stg.header._csectMiniFat = mfs_count
end