metasm/exe_format/dex.rb in metasm-1.0.3 vs metasm/exe_format/dex.rb in metasm-1.0.4

- old
+ new

@@ -329,21 +329,31 @@ def encode_u4(val) Expression[val].encode(:u32, @endianness) end def decode_u2(edata = @encoded) edata.decode_imm(:u16, @endianness) end def decode_u4(edata = @encoded) edata.decode_imm(:u32, @endianness) end def sizeof_u2 ; 2 ; end def sizeof_u4 ; 4 ; end + def encode_uleb(val, signed=false) + v = val + out = EncodedData.new + while v > 0x7f or v < -0x40 or (signed and v > 0x3f) + out << Expression[0x80 | (v&0x7f)].encode(:u8, @endianness) + v >>= 7 + end + out << Expression[v & 0x7f].encode(:u8, @endianness) + end def decode_uleb(ed = @encoded, signed=false) v = s = 0 - while s < 5*7 + while s < 10*7 b = ed.read(1).unpack('C').first.to_i v |= (b & 0x7f) << s - break if (b&0x80) == 0 s += 7 + break if (b&0x80) == 0 end v = Expression.make_signed(v, s) if signed v end + def encode_sleb(val) encode_uleb(val, true) end def decode_sleb(ed = @encoded) decode_uleb(ed, true) end attr_accessor :header, :strings, :types, :protos, :fields, :methods, :classes def initialize(endianness=:little) @endianness = endianness @@ -423,10 +433,10 @@ dasm = super() @classes.each { |c| next if not c.data (c.data.direct_methods + c.data.virtual_methods).each { |m| n = @types[c.classidx] + '->' + m.name - dasm.comment[m.codeoff+m.code.insns_off] = [n] + dasm.add_comment m.codeoff+m.code.insns_off, n } } dasm.function[:default] = @cpu.disassembler_default_func dasm end