43 lines
1.9 KiB
Python
43 lines
1.9 KiB
Python
import pytest
|
|
from tools.havoc_debug_protocol import evaluate_condition
|
|
|
|
def test_register_condition_true():
|
|
registers = {"eax": 0x50}
|
|
condition = {"register": "eax", "op": "!=", "value": "0x47"}
|
|
assert evaluate_condition(condition, registers, read_memory=None) is True
|
|
|
|
def test_register_condition_false():
|
|
registers = {"eax": 0x47}
|
|
condition = {"register": "eax", "op": "!=", "value": "0x47"}
|
|
assert evaluate_condition(condition, registers, read_memory=None) is False
|
|
|
|
def test_register_condition_equals():
|
|
registers = {"eip": 0x436070}
|
|
condition = {"register": "eip", "op": "==", "value": "0x436070"}
|
|
assert evaluate_condition(condition, registers, read_memory=None) is True
|
|
|
|
def test_memory_condition_with_offset():
|
|
def fake_read_memory(addr, size):
|
|
assert addr == 0x47eb48 + 0x18
|
|
assert size == 4
|
|
return (0x47).to_bytes(4, "little")
|
|
condition = {"memory": "0x47eb48+0x18", "size": 4, "op": "==", "value": "0x47"}
|
|
assert evaluate_condition(condition, {}, fake_read_memory) is True
|
|
|
|
def test_memory_condition_no_offset():
|
|
def fake_read_memory(addr, size):
|
|
assert addr == 0x47da88
|
|
return (0).to_bytes(size, "little")
|
|
condition = {"memory": "0x47da88", "size": 4, "op": "==", "value": "0x0"}
|
|
assert evaluate_condition(condition, {}, fake_read_memory) is True
|
|
|
|
def test_comparison_operators():
|
|
registers = {"ecx": 10}
|
|
assert evaluate_condition({"register": "ecx", "op": "<", "value": "0xb"}, registers, None)
|
|
assert evaluate_condition({"register": "ecx", "op": ">", "value": "0x9"}, registers, None)
|
|
assert evaluate_condition({"register": "ecx", "op": "<=", "value": "0xa"}, registers, None)
|
|
assert evaluate_condition({"register": "ecx", "op": ">=", "value": "0xa"}, registers, None)
|
|
|
|
def test_unknown_register_raises():
|
|
with pytest.raises(KeyError):
|
|
evaluate_condition({"register": "bogus", "op": "==", "value": "0x0"}, {}, None)
|