class Android::Dex::DexObject

parsing dex object @see source.android.com/devices/tech/dalvik/dex-format.html

Attributes

size[R]

@return [Integer] object size

Public Class Methods

new(data, offset) click to toggle source
# 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

[](sym) click to toggle source

@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
inspect() click to toggle source

@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
symbols() click to toggle source

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

parse() click to toggle source
# File lib/android/dex/dex_object.rb, line 42
def parse
  raise 'this method should be overloaded.'
end
read_class_array(cls, size) click to toggle source

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_sleb() click to toggle source

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_uleb() click to toggle source

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_uleb128p1() click to toggle source

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
read_value(type) click to toggle source
# 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_value_array(type, size) click to toggle source

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