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