metasm/exe_format/coff_decode.rb in metasm-1.0.2 vs metasm/exe_format/coff_decode.rb in metasm-1.0.3
- old
+ new
@@ -64,11 +64,11 @@
end
class RelocObj
def decode(coff)
super(coff)
- @sym = coff.symbols[@symidx]
+ @sym = coff.symbols[@symidx] if coff.symbols
end
end
class ExportDirectory
# decodes a COFF export table from coff.cursection
@@ -87,11 +87,11 @@
e = Export.new
e.ordinal = i + @ordinal_base
addr = addrs[i]
if addr >= coff.directory['export_table'][0] and addr < coff.directory['export_table'][0] + coff.directory['export_table'][1] and coff.sect_at_rva(addr)
name = coff.decode_strz
- e.forwarder_lib, name = name.split('.', 2)
+ e.forwarder_lib, name = name.split('.', 2) if name.index('.')
if name[0] == ?#
e.forwarder_ordinal = name[1..-1].to_i
else
e.forwarder_name = name
end
@@ -109,10 +109,11 @@
ords = []
num_names.times { ords << coff.decode_half }
end
if namep and ords
namep.zip(ords).each { |np, oi|
+ next if not @exports[oi]
@exports[oi].name_p = np
if coff.sect_at_rva(np)
@exports[oi].name = coff.decode_strz
end
}
@@ -427,11 +428,11 @@
# converts an RVA (offset from base address of file when loaded in memory) to the section containing it using the section table
# updates @cursection and @cursection.encoded.ptr to point to the specified address
# may return self when rva points to the coff header
# returns nil if none match, 0 never matches
def sect_at_rva(rva)
- return if not rva or rva <= 0
+ return if not rva or not rva.kind_of?(::Integer) or rva <= 0
if sections and not @sections.empty?
if s = @sections.find { |s_| s_.virtaddr <= rva and s_.virtaddr + EncodedData.align_size((s_.virtsize == 0 ? s_.rawsize : s_.virtsize), @optheader.sect_align) > rva }
s.encoded.ptr = rva - s.virtaddr
@cursection = s
elsif rva < @sections.map { |s_| s_.virtaddr }.min
@@ -549,9 +550,10 @@
curencoded.ptr = s.relocaddr
s.relocs = []
s.relocnr.times { s.relocs << RelocObj.decode(self) }
new_label 'pcrel'
s.relocs.each { |r|
+ next if not r.sym
case r.type
when 'DIR32'
s.encoded.reloc[r.va] = Metasm::Relocation.new(Expression[r.sym.name], :u32, @endianness)
when 'REL32'
l = new_label('pcrel')