示例#1
0
def test_structs():
    s = SimState(arch='AMD64')

    register_types(parse_types("""
struct abcd {
  int a;
  long b;
};
"""))

    s.mem[0x8000].struct.abcd = {'a': 10, 'b': 20}
    assert s.mem[0x8000].struct.abcd.a.concrete == 10
    assert s.solver.eval(s.memory.load(0x8000, 16), cast_to=bytes) == bytes.fromhex('0a000000000000001400000000000000')
示例#2
0
def test_structs():
    s = SimState(arch='AMD64')

    register_types(parse_types("""
struct abcd {
  int a;
  long b;
};
"""))

    s.mem[0x8000].struct.abcd = {'a': 10, 'b': 20}
    assert s.mem[0x8000].struct.abcd.a.concrete == 10
    assert s.solver.eval(
        s.memory.load(0x8000, 16),
        cast_to=bytes) == bytes.fromhex('0a000000000000001400000000000000')
示例#3
0
def test_structs():
    s = SimState(arch='AMD64')

    register_types(parse_types("""
struct abcd {
  int a;
  long b;
};
"""))

    s.memory.store(0x8000, bytes(16))
    s.mem[0x8000].struct.abcd = {'a': 10, 'b': 20}
    nose.tools.assert_equal(s.mem[0x8000].struct.abcd.a.concrete, 10)
    nose.tools.assert_equal(
        s.solver.eval(s.memory.load(0x8000, 16), cast_to=bytes),
        bytes.fromhex('0a000000000000001400000000000000'))
示例#4
0
def test_structs():
    s = SimState(arch="AMD64")

    register_types(
        parse_types("""
struct test_structs {
  int a;
  long b;
};
"""))

    s.memory.store(0x8000, bytes(16))
    s.mem[0x8000].struct.test_structs = {"a": 10, "b": 20}
    assert s.mem[0x8000].struct.test_structs.a.concrete == 10
    assert s.solver.eval(
        s.memory.load(0x8000, 16),
        cast_to=bytes) == bytes.fromhex("0a000000000000001400000000000000")
示例#5
0
def test_struct_bitfield_simple():
    """
    Tests if a struct with bitfields like
    struct {
        uint32_t a:8, b:1, c:23;
    }
    can be used with a memview
    :return:
    """
    state = SimState(arch="AMD64")
    register_types(
        SimStruct(
            name="bitfield_struct",
            pack=True,
            fields=OrderedDict([
                ("a", SimTypeNumOffset(8, signed=False)),
                ("b", SimTypeNumOffset(1, signed=False)),
                ("c", SimTypeNumOffset(23, signed=False)),
            ]),
        ))

    data = [
        (b"\x0e\x02\x00\x00", (14, 0, 1)),
        (b"\x14T\x00\x00", (20, 0, 42)),
        (b"\x04\n\x01\x00", (4, 0, 133)),
        (b"\x04j\x01\x00", (4, 0, 181)),
        (b"\x04\xa2\x01\x00", (4, 0, 209)),
        (b"\x04\xf4\x01\x00", (4, 0, 250)),
        (b"\x04\\\x02\x00", (4, 0, 302)),
        (b"\x04\x98\x02\x00", (4, 0, 332)),
        (b"\x04\xe0\x02\x00", (4, 0, 368)),
        (b"\x04\x1e\x03\x00", (4, 0, 399)),
    ]
    state.memory.store(
        0x8000,
        b"\x0e\x02\x00\x00"
        b"\x14T\x00\x00"
        b"\x04\n\x01\x00"
        b"\x04j\x01\x00"
        b"\x04\xa2\x01\x00"
        b"\x04\xf4\x01\x00"
        b"\x04\\\x02\x00"
        b"\x04\x98\x02\x00"
        b"\x04\xe0\x02\x00"
        b"\x04\x1e\x03\x00",
    )
    view = state.mem[0x8000].struct.bitfield_struct.array(5)
    for (idx, (b, result)) in enumerate(data):
        v = view[idx]
        s = v.concrete
        assert (s.a == result[0]
                ), f"Field a was {s.a}, expected {result[0]}, from bytes {b}"
        assert (
            v.a.concrete == result[0]
        ), f"Field a was {v.a.concrete}, expected {result[0]}, from bytes {b}"

        assert (s.b == result[1]
                ), f"Field b was {s.b}, expected {result[1]}, from bytes {b}"
        assert (v.b.concrete == result[1]
                ), f"Field b was {s.b}, expected {result[1]}, from bytes {b}"

        assert (s.c == result[2]
                ), f"Field c was {s.c}, expected {result[2]}, from bytes {b}"
        assert (
            v.c.concrete == result[2]
        ), f"Field c was {v.c.concrete}, expected {result[2]}, from bytes {b}"
示例#6
0
def register_jni_relevant_data_type():
    register_types(parse_type('struct JNINativeMethod ' +\
                              '{const char* name;' +\
                              'const char* signature;' +\
                              'void* fnPtr;}'))