about summary refs log tree commit diff stats
path: root/tests/test_snapshot.py
blob: 789caf52dbf3ba18d5845d289871e5ac8a0ca4d8 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
import unittest
import pytest

from focaccia.arch import x86
from focaccia.snapshot import ProgramState, RegisterAccessError

@pytest.fixture
def arch():
    return x86.ArchX86()

@pytest.fixture
def state(arch):
    return ProgramState(arch)

@pytest.mark.parametrize("reg", x86.regnames)
def test_register_access_empty_state(state, reg):
    with pytest.raises(RegisterAccessError):
        state.read_register(reg)

def test_register_read_write(arch):
    state = ProgramState(arch)
    for reg in x86.regnames:
        state.set_register(reg, 0x42)
    for reg in x86.regnames:
        val = state.read_register(reg)
        assert val == 0x42

def test_register_aliases_empty_state(arch):
    state = ProgramState(arch)
    for reg in arch.all_regnames:
        with pytest.raises(RegisterAccessError): 
            state.read_register(reg)

def test_register_aliases_read_write(arch):
    state = ProgramState(arch)
    for reg in ['EAX', 'EBX', 'ECX', 'EDX']:
        state.set_register(reg, 0xa0ff0)

    for reg in ['AH', 'BH', 'CH', 'DH']:
        assert state.read_register(reg) == 0xf, reg
    for reg in ['AL', 'BL', 'CL', 'DL']:
        assert state.read_register(reg) == 0xf0, reg
    for reg in ['AX', 'BX', 'CX', 'DX']:
        assert state.read_register(reg) == 0x0ff0, reg
    for reg in ['EAX', 'EBX', 'ECX', 'EDX',
                'RAX', 'RBX', 'RCX', 'RDX']:
        assert state.read_register(reg) == 0xa0ff0, reg

def test_flag_aliases(arch):
    flags = ['CF', 'PF', 'AF', 'ZF', 'SF', 'TF', 'IF', 'DF', 'OF',
             'IOPL', 'NT', 'RF', 'VM', 'AC', 'VIF', 'VIP', 'ID']
    state = ProgramState(arch)

    state.set_register('RFLAGS', 0)
    for flag in flags:
        assert state.read_register(flag) == 0

    state.set_register('RFLAGS',
                       x86.compose_rflags({'ZF': 1, 'PF': 1, 'OF': 0}))
    assert state.read_register('ZF') == 1, arch.get_reg_accessor('ZF')
    assert state.read_register('PF') == 1
    assert state.read_register('OF') == 0
    assert state.read_register('AF') == 0
    assert state.read_register('ID') == 0
    assert state.read_register('SF') == 0

    for flag in flags:
        state.set_register(flag, 1)
    for flag in flags:
        assert state.read_register(flag) == 1

    state.set_register('OF', 1)
    state.set_register('AF', 1)
    state.set_register('SF', 1)
    assert state.read_register('OF') == 1
    assert state.read_register('AF') == 1
    assert state.read_register('SF') == 1