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