class TestIa32

Public Instance Methods

assemble(src, cpu=@@cpu32) click to toggle source
# File tests/ia32.rb, line 13
def assemble(src, cpu=@@cpu32)
        Metasm::Shellcode.assemble(cpu, src).encode_string
end
assert_equal(a, b) click to toggle source
Calls superclass method
# File tests/ia32.rb, line 17
def assert_equal(a, b) super(b, a) end
backtrace(asm, expr, cpu=@@cpu32) click to toggle source
# File tests/ia32.rb, line 119
def backtrace(asm, expr, cpu=@@cpu32)
        raw = assemble(asm + "\n nop", cpu)
        disassemble(raw, cpu).backtrace(expr, raw.length-1).first
end
bin(s) click to toggle source
# File tests/ia32.rb, line 19
def bin(s)
        if s.respond_to?(:force_encoding)
                s.force_encoding('BINARY')
        else
                s
        end
end
disassemble(bin, cpu=@@cpu32) click to toggle source
# File tests/ia32.rb, line 91
def disassemble(bin, cpu=@@cpu32)
        Metasm::Shellcode.disassemble(cpu, bin)
end
test_16() click to toggle source
# File tests/ia32.rb, line 41
def test_16
        assert_equal(assemble("push 142", @@cpu16), bin("\x68\x8e\00""))
        assert_equal(assemble("code16 push 142", @@cpu16), bin("\x68\x8e\00""))
        assert_equal(assemble("code16 push 142"), bin("\x68\x8e\00""))
        assert_equal(assemble("push.i16 142"), bin("\x66\x68\x8e\00""))
        assert_equal(assemble("mov eax, 42"), bin("\xb8\x2a\00\\00\\00""))
        assert_equal(assemble("code16 mov ax, 42"), bin("\xb8\x2a\00""))
end
test_C() click to toggle source
# File tests/ia32.rb, line 85
def test_C
        src = "int bla(void) { volatile int i=0; return (int)++i; }"
        assert_equal(Metasm::Shellcode.compile_c(@@cpu32, src).encode_string,
                        ["5589E583EC04C745FC00000000FF45FC8B45FC89EC5DC3"].pack('H*'))
end
test_avx() click to toggle source
# File tests/ia32.rb, line 111
def test_avx
        assert_equal(disassemble(bin("\xc4\xc3\x75\x42\xc2\x03")).decoded[0].instruction.to_s, "vmpsadbw ymm0, ymm1, ymm2, 3")
        assert_equal(assemble("vmpsadbw ymm0, ymm1, ymm2, 3"), bin("\xc4\xc3\x75\x42\xc2\x03"))
        assert_equal(assemble("vpblendvb xmm1, xmm2, xmm3, xmm4"), bin("\xc4\xc3\x69\x4c\xcb\x40"))
        assert_equal(assemble("vgatherdpd xmm1, qword ptr [edx+xmm1], xmm2"), bin("\xc4\xc2\xe9\x92\x0c\x0a"))
        assert_equal(disassemble(bin("\xc4\xc2\xe9\x92\x0c\x0a")).decoded[0].instruction.to_s, "vgatherdpd xmm1, qword ptr [edx+xmm1], xmm2")
end
test_backtrace() click to toggle source
# File tests/ia32.rb, line 124
def test_backtrace
        assert_equal(backtrace("mov eax, 10", :eax), Metasm::Expression[10])
        assert_equal(backtrace("mov eax, 0x1234\n ror eax, 8", :eax), Metasm::Expression[0x34000012])
        assert_equal(backtrace("mov eax, 0x1234\n ror al, 4", :eax), Metasm::Expression[0x1243])
        assert_equal(backtrace("mov eax, 0x1234\n shr al, 4", :eax), Metasm::Expression[0x1203])
        assert_equal(backtrace("mov eax, 0x1234\n shl ah, 4", :eax), Metasm::Expression[0x2034])
        assert_equal(backtrace("mov eax, 0xf000_0000\n add eax, 0x2000_0000\n shr eax, 28", :eax), Metasm::Expression[1])
        assert_equal(backtrace("mov eax, 0xf000_0000\n add eax, 0x2000_0000\n ror eax, 28", :eax), Metasm::Expression[1])
        assert_equal(backtrace("mov eax, 1\n mov ebx, 2\n xchg al, bl", :eax), Metasm::Expression[2])
        assert_equal(backtrace("mov eax, 0x01020304\n xchg al, ah", :eax), Metasm::Expression[0x01020403])
end
test_basic() click to toggle source
# File tests/ia32.rb, line 27
def test_basic
        assert_equal(assemble("nop"), bin("\x90"))
        assert_equal(assemble("push eax"), bin("\x50"))
        assert_equal(assemble("push 2"), bin("\x6a\x02"))
        assert_equal(assemble("push 142"), bin("\x68\x8e\00\\00\\00""))
end
test_dasm() click to toggle source
# File tests/ia32.rb, line 95
def test_dasm
        d = disassemble(bin("\x90"))
        assert_equal(d.decoded[0].class, Metasm::DecodedInstruction)
        assert_equal(d.decoded[0].opcode.name, "nop")

        assert_equal(disassemble(bin("\x66\x0f\xc7\x08")).decoded[0], nil)
        assert_equal(disassemble(bin("\x0f\xc7\x08")).decoded[0].opcode.name, "cmpxchg8b")
end
test_err() click to toggle source
# File tests/ia32.rb, line 78
def test_err
        assert_raise(Metasm::ParseError) { assemble("add eax") }
        assert_raise(Metasm::ParseError) { assemble("add add, ebx") }
        assert_raise(Metasm::ParseError) { assemble("add 42, ebx") }
        assert_raise(Metasm::ParseError) { assemble("add [bx+ax]") }
end
test_jmp() click to toggle source
# File tests/ia32.rb, line 50
def test_jmp
        assert_equal(assemble("jmp $"), bin("\xeb\xfe"))
        assert_equal(assemble("jmp.i32 $"), bin("\xe9\xfb\xff\xff\xff"))
end
test_mrmsz() click to toggle source
# File tests/ia32.rb, line 66
def test_mrmsz
        assert_equal(assemble("mov [eax], ebx"), bin("\x89\x18"))
        assert_equal(assemble("mov [eax], bl"), bin("\x88\x18"))
        assert_equal(assemble("mov ebx, [eax]"), bin("\x8b\x18"))
        assert_equal(assemble("mov bl, [eax]"), bin("\x8a\x18"))
        assert_equal(assemble("mov bl, [bx]"), bin("\x67\x8a\x1f"))
        assert_equal(assemble("mov bl, [bx]", @@cpu16), bin("\x8a\x1f"))
        assert_equal(assemble("code16 mov bl, [bx]"), bin("\x8a\x1f"))
        assert_equal(assemble("mov bl, [0]"), bin("\x8a\x1d\00\\00\\00\\00""))
        assert_equal(assemble("mov.a16 bl, [0]"), bin("\x67\x8a\x1e\00\\00""))
end
test_opsz() click to toggle source
# File tests/ia32.rb, line 55
def test_opsz
        assert_equal(assemble("cbw"), bin("\x66\x98"))
        assert_equal(assemble("cwde"), bin("\x98"))

        assert_equal(assemble("cbw", @@cpu16), bin("\x98"))
        assert_equal(assemble("cwde", @@cpu16), bin("\x66\x98"))

        assert_equal(assemble("cmpxchg8b [eax]"), bin("\x0f\xc7\x08"))
        assert_equal(assemble("cmpxchg8b [bx]", @@cpu16), bin("\x66\x0f\xc7\x0f"))
end
test_pfx() click to toggle source
# File tests/ia32.rb, line 104
def test_pfx
        assert_equal(assemble("nop"), bin("\x90"))
        assert_equal(assemble("pause"), bin("\xf3\x90"))
        assert_equal(disassemble(bin("\x90")).decoded.values.first.opcode.name, "nop")
        assert_equal(disassemble(bin("\xf3\x90")).decoded.values.first.opcode.name, "pause")
end
test_sz() click to toggle source
# File tests/ia32.rb, line 34
def test_sz
        assert_equal(assemble("dec eax"), bin("\x48"))
        assert_equal(assemble("dec ax"), bin("\x66\x48"))
        assert_equal(assemble("dec al"), bin("\xfe\xc8"))
        assert_equal(assemble("arpl [edi+70h], bp"), "cop")
end