# File tests/encodeddata.rb, line 11 def compile(src) p = Metasm::Shellcode.assemble(Metasm::UnknownCPU.new(32, :little), src) p.encoded end
# File tests/encodeddata.rb, line 16 def test_basic e = compile <<EOS toto db 42 tutu db 48 dd bla EOS assert_equal(6, e.virtsize) assert_equal(2, e.export.keys.length) assert_equal(0, e.export['toto']) assert_equal(1, e.reloc.keys.length) assert_equal('bla', e.reloc[2].target.reduce.rexpr) end
# File tests/encodeddata.rb, line 103 def test_fixup e = compile <<EOS db 1 db toto + tata dd tutu EOS assert_equal(2, e.reloc.length) e.fixup!('toto' => 42) assert_raise(Metasm::EncodeError) { e.fixup('tata' => 192349129) } e.fixup('tata' => -12) assert_equal(30.chr[0], e.data[1]) assert_equal(1, e.reloc.length) assert_equal(2, e.offset_of_reloc('tutu')) assert_equal(2, e.offset_of_reloc(Metasm::Expression[:+, 'tutu'])) e.fixup('tutu' => 1024) assert_equal("\11\\x1e\00\\44\\00\\00"", e.data) ee = Metasm::Expression[:+, 'bla'].encode(:u16, :big) ee.fixup('bla' => 1024) assert_equal("\44\\00"", ee.data) eee = compile <<EOS db abc - def def: db 12 dup(?, 3 dup('x')) abc: EOS assert_equal((12*4).chr[0], eee.data[0]) end
# File tests/encodeddata.rb, line 29 def test_slice e = compile <<EOS db 4 dup(1) toto: db 4 dup(2) db 4 dup(?) foo: dd bla tutu: EOS e1 = e[4, 8] e2 = e[4..11] e3 = e[4...12] e4 = e['toto', 8] e5 = e['toto'...'foo'] assert_equal([e1.data, e1.virtsize], [e2.data, e2.virtsize]) assert_equal([e1.data, e1.virtsize], [e3.data, e3.virtsize]) assert_equal([e1.data, e1.virtsize], [e4.data, e4.virtsize]) assert_equal([e1.data, e1.virtsize], [e5.data, e5.virtsize]) assert_equal(nil, e[53, 12]) assert_equal(2, e[2, 2].export['toto']) assert_equal(4, e[0, 4].export['toto']) assert_equal(1, e[0, 16].reloc.length) assert_equal(0, e[0, 15].reloc.length) assert_equal(0, e[13, 8].reloc.length) assert_equal(1, e[12, 4].reloc.length) assert_equal(16, e[0, 50].virtsize) assert_equal(1, e[15, 50].virtsize) e.align 5 assert_equal(20, e.virtsize) e.align 5 assert_equal(20, e.virtsize) e.fill 30 assert_equal(30, e.virtsize) end
# File tests/encodeddata.rb, line 65 def test_slice2 e = compile <<EOS db '1' toto: .pad tutu: db '0' .offset toto+11 EOS assert_equal(12, e.virtsize) assert_equal(11, e.export['tutu']) e[1..10] = 'abcdefghij' assert_equal(12, e.virtsize) assert_equal(2, e.export.length) e[1, 10] = 'jihgfedcba' assert_equal(12, e.virtsize) e[1...11] = 'abcdefghij' assert_equal(12, e.virtsize) e.patch('toto', 'tutu', 'xxx') assert_equal('1xxxdefghij0', e.data) e[1..10] = 'z' assert_equal(3, e.virtsize) assert_equal(2, e.export['tutu']) assert_raise(Metasm::EncodeError) { e.patch('toto', 'tutu', 'toolong') } e = compile <<EOS db '1' dd rel db '2' EOS assert_equal(1, e.reloc.length) assert_equal(1, e[1, 4].reloc.length) assert_equal(1, e[1..4].reloc.length) assert_equal(1, e[1...5].reloc.length) assert_equal(0, e[2, 8].reloc.length) assert_equal(0, e[1, 3].reloc.length) end