class Android::Dex::DexObject
parsing dex object @see source.android.com/devices/tech/dalvik/dex-format.html
Attributes
@return [Integer] object size
Public Class Methods
# File lib/android/dex/dex_object.rb, line 10 def initialize(data, offset) @data = data @offset = offset @params = {} @parsing_off = 0 # parsing offset parse() @size = @parsing_off end
Public Instance Methods
@param [Symbol] sym should be included in symbols
@return [Object] dex header value which is related with sym
# File lib/android/dex/dex_object.rb, line 28 def [](sym) @params[sym.to_sym] end
@return [String]
# File lib/android/dex/dex_object.rb, line 33 def inspect str = "<#{self.class}\n" @params.each do |key,val| str.concat " #{key}: #{val}\n" end str.concat '>' end
returns symbol keys @return [Array<Symbol>] header key
# File lib/android/dex/dex_object.rb, line 22 def symbols @params.keys end
Private Instance Methods
# File lib/android/dex/dex_object.rb, line 42 def parse raise 'this method should be overloaded.' end
read class values from data buffer as array @param [Class] cls target class @param [Integer] size num of data @return [Array<cls>] object array
# File lib/android/dex/dex_object.rb, line 97 def read_class_array(cls, size) ret_array = [] size.times do item = cls.new(@data, @offset + @parsing_off) ret_array << item @parsing_off += item.size end ret_array end
read short int from data buffer @return [Integer] short value
# File lib/android/dex/dex_object.rb, line 65 def read_sleb value, len = Dex::sleb128(@data, @offset + @parsing_off) @parsing_off += len value end
read integer from data buffer @return [Integer] integer value
# File lib/android/dex/dex_object.rb, line 72 def read_uleb value, len = Dex::uleb128(@data, @offset + @parsing_off) @parsing_off += len value end
read integer from data buffer and plus 1 @return [Integer] integer value
# File lib/android/dex/dex_object.rb, line 79 def read_uleb128p1 value, len = Dex::uleb128p1(@data, @offset + @parsing_off) @parsing_off += len value end
# File lib/android/dex/dex_object.rb, line 46 def read_value(type) types = { :byte => [1, 'c'], :ubyte => [1, 'C'], :short => [2, 's'], #ugh!:depend on machine endian :ushort => [2, 'v'], :int => [4, 'i'], #ugh!:depend on machine endian :uint => [4, 'V'], :long => [8, 'q'], :ulong => [8, 'Q'], } len, pack_str = types.fetch(type) value = @data[@offset+@parsing_off, len].unpack(pack_str)[0] @parsing_off += len return value end
read various values from data buffer as array @param [Symbol] type @param [Integer] size num of data @return [Array] value array
# File lib/android/dex/dex_object.rb, line 88 def read_value_array(type, size) ret_array = [] size.times { ret_array << read_value(type) } ret_array end