class Metasm::JavaClass

Constants

CONSTANT_TAG
MAGIC

Attributes

attributes[RW]
class_info[RW]
constant_pool[RW]
fields[RW]
header[RW]
interfaces[RW]
methods[RW]

Public Class Methods

new(endianness=:big) click to toggle source
Calls superclass method Metasm::ExeFormat::new
# File metasm/exe_format/javaclass.rb, line 301
def initialize(endianness=:big)
        @endianness = endianness
        @encoded = EncodedData.new
        super()
end

Public Instance Methods

attribute_create(name, data) click to toggle source
# File metasm/exe_format/javaclass.rb, line 416
def attribute_create(name, data)
        a = AttributeInfo.new
        a.attribute_name_index = cp_auto_utf8(name)
        a.attribute_length = data.size
        a.data = data
        a
end
cp_add(cpi, tag) click to toggle source
# File metasm/exe_format/javaclass.rb, line 358
def cp_add(cpi, tag)
        cpe = ConstantPoolInfo.new
        cpe.tag = tag
        cpe.info = cpi
        cpe.idx = @constant_pool.constant_pool_count

        @constant_pool.constant_pool << cpe
        @constant_pool.constant_pool_count += 1
        @constant_pool.constant_pool_count += 1 if tag =~ /Long|Double/

        cpe.idx
end
cp_add_methodref(classname, name, descriptor) click to toggle source
# File metasm/exe_format/javaclass.rb, line 403
def cp_add_methodref(classname, name, descriptor)
        nat = ConstantNameAndType.new
        nat.name_index = cp_auto_utf8(name)
        nat.descriptor_index = cp_auto_utf8(descriptor)
        natidx = cp_add(nat, 'NameAndType')

        cpi = ConstantRef.new
        cpi.class_index = cp_auto_class(classname)
        cpi.name_and_type_index = natidx

        cp_add(cpi, 'Methodref')
end
cp_auto_class(classname) click to toggle source
# File metasm/exe_format/javaclass.rb, line 393
def cp_auto_class(classname)
        if idx = cp_find('Class') { |i| string_at(i.index) == classname }
                return idx
        end

        cpi = ConstantIndex.new
        cpi.index = cp_auto_utf8(classname)
        cp_add(cpi, 'Class')
end
cp_auto_utf8(string) click to toggle source
# File metasm/exe_format/javaclass.rb, line 382
def cp_auto_utf8(string)
        if idx = cp_find('Utf8') { |i| i.bytes == string }
                return idx
        end

        cpi = ConstantUtf8.new
        cpi.bytes = string
        cpi.length = string.length
        cp_add(cpi, 'Utf8')
end
cp_find(tag) { |info| ... } click to toggle source
# File metasm/exe_format/javaclass.rb, line 371
def cp_find(tag)
        constant_pool.constant_pool.each { |e|
                next if !e or e.tag != tag
                if yield(e.info)
                        return e.idx
                end
        }
        nil
end
cpu_from_headers() click to toggle source
# File metasm/exe_format/javaclass.rb, line 329
def cpu_from_headers
        raise 'JVM'
end
decode() click to toggle source
# File metasm/exe_format/javaclass.rb, line 307
def decode
        @header = Header.decode(self)
        @constant_pool = ConstantPool.decode(self)
        @class_info = ClassInfo.decode(self)
        @interfaces = Interfaces.decode(self)
        @fields = Fields.decode(self)
        @methods = Methods.decode(self)
        @attributes = Attributes.decode(self)
end
decode_methodref(mref) click to toggle source
# File metasm/exe_format/javaclass.rb, line 349
def decode_methodref(mref)
        class_idx = mref.info.class_index
        nt_idx = mref.info.name_and_type_index
        name_idx = @constant_pool[nt_idx].info.name_index
        desc_idx = @constant_pool[nt_idx].info.descriptor_index

        string_at(class_idx) + '/' + string_at(name_idx) + string_at(desc_idx)
end
decode_u1(edata = @encoded) click to toggle source
# File metasm/exe_format/javaclass.rb, line 292
def decode_u1(edata = @encoded) edata.decode_imm(:u8, @endianness) end
decode_u2(edata = @encoded) click to toggle source
# File metasm/exe_format/javaclass.rb, line 293
def decode_u2(edata = @encoded) edata.decode_imm(:u16, @endianness) end
decode_u4(edata = @encoded) click to toggle source
# File metasm/exe_format/javaclass.rb, line 294
def decode_u4(edata = @encoded) edata.decode_imm(:u32, @endianness) end
each_section() click to toggle source
# File metasm/exe_format/javaclass.rb, line 333
def each_section
        raise 'n/a'
end
encode() click to toggle source
# File metasm/exe_format/javaclass.rb, line 317
def encode
        @encoded = EncodedData.new
        @encoded << @header.encode(self)
        @encoded << @constant_pool.encode(self)
        @encoded << @class_info.encode(self)
        @encoded << @interfaces.encode(self)
        @encoded << @fields.encode(self)
        @encoded << @methods.encode(self)
        @encoded << @attributes.encode(self)
        @encoded.data
end
encode_u1(val) click to toggle source
# File metasm/exe_format/javaclass.rb, line 289
def encode_u1(val) Expression[val].encode(:u8, @endianness) end
encode_u2(val) click to toggle source
# File metasm/exe_format/javaclass.rb, line 290
def encode_u2(val) Expression[val].encode(:u16, @endianness) end
encode_u4(val) click to toggle source
# File metasm/exe_format/javaclass.rb, line 291
def encode_u4(val) Expression[val].encode(:u32, @endianness) end
get_default_entrypoints() click to toggle source
# File metasm/exe_format/javaclass.rb, line 337
def get_default_entrypoints
        []
end
sizeof_u1() click to toggle source
# File metasm/exe_format/javaclass.rb, line 295
def sizeof_u1 ; 1 ; end
sizeof_u2() click to toggle source
# File metasm/exe_format/javaclass.rb, line 296
def sizeof_u2 ; 2 ; end
sizeof_u4() click to toggle source
# File metasm/exe_format/javaclass.rb, line 297
def sizeof_u4 ; 4 ; end
string_at(idx) click to toggle source
# File metasm/exe_format/javaclass.rb, line 341
def string_at(idx)
        loop do
                tmp = @constant_pool[idx].info
                return tmp.bytes if tmp.kind_of? ConstantUtf8
                idx = tmp.index
        end
end