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')