Beispiel #1
0
def atypes_process_bptr_test():
    mem = MockMemory()
    alloc = MemoryAlloc(mem)
    # alloc proc
    proc = Process.alloc(alloc)
    # set list
    proc.seg_list = 0x100
    assert proc.seg_list == BAddr(0x40)
    # check in mem seg list baddr
    struct = proc.get_type_struct()
    off = struct.pr_SegList_field.offset
    addr = proc.addr + off
    assert mem.r32(addr) == 0x40
    # setup CLI
    cli = CLI.alloc(alloc)
    proc.cli = cli
    assert type(proc.cli) is CLI
    assert proc.cli == cli.addr
    # check in mem CLI baddr
    off = struct.pr_CLI_field.offset
    addr = proc.addr + off
    assert mem.r32(addr) == BAddr.from_addr(cli.addr).get_baddr()
    cli.free()
    # done
    proc.free()
    assert alloc.is_all_free()
def init_struct_test():
    mem = MockMemory()
    # setup init table
    init_tab = 0x100
    mem_ptr = 0x200
    ib = InitStructBuilder(mem, init_tab)
    ib.init_byte(0, 21)
    ib.init_word(12, 0xDEAD)
    ib.init_long(34, 0xCAFEBABE)
    ib.init_struct(ib.SIZE_LONG, 40, [23, 42])
    ib.init_struct(ib.SIZE_WORD, 64, [11, 7])
    ib.init_struct(ib.SIZE_BYTE, 80, [1, 2, 3])
    ib.end()
    # build struct
    i = InitStruct(mem)
    i.init_struct(init_tab, mem_ptr, 32)
    # check struct
    assert mem.r8(mem_ptr + 0) == 21
    assert mem.r16(mem_ptr + 12) == 0xDEAD
    assert mem.r32(mem_ptr + 34) == 0xCAFEBABE
    assert mem.r32(mem_ptr + 40) == 23
    assert mem.r32(mem_ptr + 44) == 42
    assert mem.r16(mem_ptr + 64) == 11
    assert mem.r16(mem_ptr + 66) == 7
    assert mem.r8(mem_ptr + 80) == 1
    assert mem.r8(mem_ptr + 81) == 2
    assert mem.r8(mem_ptr + 82) == 3
Beispiel #3
0
def libtypes_process_bptr_test():
    mem = MockMemory()
    alloc = MemoryAlloc(mem)
    # alloc proc
    proc = Process.alloc(alloc)
    # set list (as baddr)
    proc.seg_list.bptr = 0x40
    assert proc.seg_list.bptr == 0x40
    # check in mem seg list baddr
    off = proc.sdef.pr_SegList.offset
    addr = proc.addr + off
    assert mem.r32(addr) == 0x40
    # setup CLI
    cli = CLI.alloc(alloc)
    proc.cli.ref = cli
    assert type(proc.cli.ref) is CLI
    assert proc.cli.aptr == cli.addr
    # check in mem CLI baddr
    off = proc.sdef.pr_CLI.offset
    addr = proc.addr + off
    assert mem.r32(addr) == cli.addr >> 2
    cli.free()
    # done
    proc.free()
    assert alloc.is_all_free()
Beispiel #4
0
def atypes_process_bptr_test():
  mem = MockMemory()
  alloc = MemoryAlloc(mem)
  # alloc proc
  proc = Process.alloc(alloc)
  # set list
  proc.seg_list = 0x100
  assert proc.seg_list == BAddr(0x40)
  # check in mem seg list baddr
  struct = proc.get_type_struct()
  off = struct.pr_SegList_field.offset
  addr = proc.addr + off
  assert mem.r32(addr) == 0x40
  # setup CLI
  cli = CLI.alloc(alloc)
  proc.cli = cli
  assert type(proc.cli) is CLI
  assert proc.cli == cli.addr
  # check in mem CLI baddr
  off = struct.pr_CLI_field.offset
  addr = proc.addr + off
  assert mem.r32(addr) == BAddr.from_addr(cli.addr).get_baddr()
  cli.free()
  # done
  proc.free()
  assert alloc.is_all_free()
def init_struct_test():
  mem = MockMemory()
  # setup init table
  init_tab = 0x100
  mem_ptr = 0x200
  ib = InitStructBuilder(mem, init_tab)
  ib.init_byte(0, 21)
  ib.init_word(12, 0xdead)
  ib.init_long(34, 0xcafebabe)
  ib.init_struct(ib.SIZE_LONG, 40, [23, 42])
  ib.init_struct(ib.SIZE_WORD, 64, [11, 7])
  ib.init_struct(ib.SIZE_BYTE, 80, [1, 2, 3])
  ib.end()
  # build struct
  i = InitStruct(mem)
  i.init_struct(init_tab, mem_ptr, 32)
  # check struct
  assert mem.r8(mem_ptr + 0) == 21
  assert mem.r16(mem_ptr + 12) == 0xdead
  assert mem.r32(mem_ptr + 34) == 0xcafebabe
  assert mem.r32(mem_ptr + 40) == 23
  assert mem.r32(mem_ptr + 44) == 42
  assert mem.r16(mem_ptr + 64) == 11
  assert mem.r16(mem_ptr + 66) == 7
  assert mem.r8(mem_ptr + 80) == 1
  assert mem.r8(mem_ptr + 81) == 2
  assert mem.r8(mem_ptr + 82) == 3
Beispiel #6
0
def astructs_astruct_baddr_test():
    mem = MockMemory()
    ms = MyStruct(mem, 0x10)
    # write int to baddr
    ms.ms_SegList.set(0x40)
    # bptr auto converts back to baddr
    assert ms.ms_SegList.get() == 0x40
    # baddr is stored in mem
    assert mem.r32(0x14) == 0x40
    # write baddr
    ms.ms_SegList.set(0x20)
    assert mem.r32(0x14) == 0x20
Beispiel #7
0
def astruct_astruct_baddr_test():
    mem = MockMemory()
    ms = MyStruct(mem, 0x10)
    # write int (addr) to baddr
    ms.ms_SegList = 0x100
    # baddr auto converts back to addr
    assert ms.ms_SegList == 0x100
    # but its an BAddr
    assert type(ms.ms_SegList) is BAddr
    assert ms.ms_SegList == BAddr(0x40)
    # baddr is stored in mem
    assert mem.r32(0x14) == 0x40
    # write baddr
    ms.ms_SegList = BAddr(0x20)
    assert ms.ms_SegList == BAddr(0x20)
    assert mem.r32(0x14) == 0x20
Beispiel #8
0
def mem_cache_rwx_write_test():
    mem = MemoryCache(0x100, 0x210)
    # build cache contents
    mem.w8(0x100, 42)
    assert mem.r8(0x100) == 42
    mem.w16(0x200, 0xdead)
    assert mem.r16(0x200) == 0xdead
    mem.w32(0x300, 0xcafebabe)
    assert mem.r32(0x300) == 0xcafebabe
    mem.write(0, 0x101, 43)
    assert mem.read(0, 0x101) == 43
    mem.write(1, 0x202, 0x1234)
    assert mem.read(1, 0x202) == 0x1234
    mem.write(2, 0x304, 0x11223344)
    assert mem.read(2, 0x304) == 0x11223344
    # write to main mem
    main_mem = MockMemory()
    mem.write_cache(main_mem)
    # check main mem
    assert main_mem.r8(0x100) == 42
    assert main_mem.r16(0x200) == 0xdead
    assert main_mem.r32(0x300) == 0xcafebabe
    assert main_mem.read(0, 0x101) == 43
    assert main_mem.read(1, 0x202) == 0x1234
    assert main_mem.read(2, 0x304) == 0x11223344
Beispiel #9
0
def mem_cache_rwx_read_test():
    mem = MockMemory()
    # build main mem contents
    mem.w8(0x100, 42)
    assert mem.r8(0x100) == 42
    mem.w16(0x200, 0xDEAD)
    assert mem.r16(0x200) == 0xDEAD
    mem.w32(0x300, 0xCAFEBABE)
    assert mem.r32(0x300) == 0xCAFEBABE
    mem.write(0, 0x101, 43)
    assert mem.read(0, 0x101) == 43
    mem.write(1, 0x202, 0x1234)
    assert mem.read(1, 0x202) == 0x1234
    mem.write(2, 0x304, 0x11223344)
    assert mem.read(2, 0x304) == 0x11223344
    # write to cache
    cmem = MemoryCache(0x100, 0x210)
    cmem.read_cache(mem)
    # check cache mem
    assert cmem.r8(0x100) == 42
    assert cmem.r16(0x200) == 0xDEAD
    assert cmem.r32(0x300) == 0xCAFEBABE
    assert cmem.read(0, 0x101) == 43
    assert cmem.read(1, 0x202) == 0x1234
    assert cmem.read(2, 0x304) == 0x11223344
Beispiel #10
0
def mem_cache_rwx_write_test():
  mem = MemoryCache(0x100, 0x210)
  # build cache contents
  mem.w8(0x100, 42)
  assert mem.r8(0x100) == 42
  mem.w16(0x200, 0xdead)
  assert mem.r16(0x200) == 0xdead
  mem.w32(0x300, 0xcafebabe)
  assert mem.r32(0x300) == 0xcafebabe
  mem.write(0, 0x101, 43)
  assert mem.read(0, 0x101) == 43
  mem.write(1, 0x202, 0x1234)
  assert mem.read(1, 0x202) == 0x1234
  mem.write(2, 0x304, 0x11223344)
  assert mem.read(2, 0x304) == 0x11223344
  # write to main mem
  main_mem = MockMemory()
  mem.write_cache(main_mem)
  # check main mem
  assert main_mem.r8(0x100) == 42
  assert main_mem.r16(0x200) == 0xdead
  assert main_mem.r32(0x300) == 0xcafebabe
  assert main_mem.read(0, 0x101) == 43
  assert main_mem.read(1, 0x202) == 0x1234
  assert main_mem.read(2, 0x304) == 0x11223344
Beispiel #11
0
def astruct_astruct_baddr_test():
  mem = MockMemory()
  ms = MyStruct(mem, 0x10)
  # write int (addr) to baddr
  ms.ms_SegList = 0x100
  # baddr auto converts back to addr
  assert ms.ms_SegList == 0x100
  # but its an BAddr
  assert type(ms.ms_SegList) is BAddr
  assert ms.ms_SegList == BAddr(0x40)
  # baddr is stored in mem
  assert mem.r32(0x14) == 0x40
  # write baddr
  ms.ms_SegList = BAddr(0x20)
  assert ms.ms_SegList == BAddr(0x20)
  assert mem.r32(0x14) == 0x20
Beispiel #12
0
def mem_access_bptr_test():
    mem = MockMemory()
    a = AccessStruct(mem, MyBCPLStruct, 0x42)
    # write/read addr
    a.w_s("bs_TestBptr", 44)
    assert a.r_s("bs_TestBptr") == 44
    # check auto converted baddr
    assert mem.r32(0x42) == 11
Beispiel #13
0
def astructs_enum_inst_test():
    mem = MockMemory()
    mem.w32(4, 3)
    # instance
    me = MyEnum(mem=mem, addr=4)
    assert me.get() == MyEnum.a
    assert str(me) == "a"
    assert repr(me) == "MyEnum('a')"
    assert int(me) == MyEnum.a
    # change
    me.set(MyEnum.c)
    assert me.get() == MyEnum.c
    assert str(me) == "c"
    assert int(me) == MyEnum.c
    assert mem.r32(4) == MyEnum.c
    me.set("b")
    assert me.get() == MyEnum.b
    assert str(me) == "b"
    assert int(me) == MyEnum.b
    assert mem.r32(4) == MyEnum.b
Beispiel #14
0
def machine_mem_rw_test():
    mem = MockMemory()

    mem.w8(0x100, 42)
    assert mem.r8(0x100) == 42

    mem.w16(0x200, 0xDEAD)
    assert mem.r16(0x200) == 0xDEAD

    mem.w32(0x300, 0xCAFEBABE)
    assert mem.r32(0x300) == 0xCAFEBABE

    mem.write(0, 0x101, 43)
    assert mem.read(0, 0x101) == 43

    mem.write(1, 0x202, 0x1234)
    assert mem.read(1, 0x202) == 0x1234

    mem.write(2, 0x304, 0x11223344)
    assert mem.read(2, 0x304) == 0x11223344

    # invalid values
    with pytest.raises(ValueError):
        mem.w8(0x100, 0x100)
    with pytest.raises(ValueError):
        mem.w8(0x100, -1)
    # invalid values
    with pytest.raises(struct.error):
        mem.w16(0x100, 0x10000)
    with pytest.raises(struct.error):
        mem.w16(0x100, -2)
    # invalid values
    with pytest.raises(struct.error):
        mem.w32(0x100, 0x100000000)
    with pytest.raises(struct.error):
        mem.w32(0x100, -3)
    # invalid type
    with pytest.raises(TypeError):
        mem.w8(0x100, "hello")
    # invalid type
    with pytest.raises(struct.error):
        mem.w16(0x100, "hello")
    # invalid type
    with pytest.raises(struct.error):
        mem.w32(0x100, "hello")
    # invalid width
    with pytest.raises(ValueError):
        mem.write(7, 0x202, 12)
    with pytest.raises(ValueError):
        mem.read(7, 0x202)
Beispiel #15
0
def machine_mem_rw_test():
  mem = MockMemory()

  mem.w8(0x100, 42)
  assert mem.r8(0x100) == 42

  mem.w16(0x200, 0xdead)
  assert mem.r16(0x200) == 0xdead

  mem.w32(0x300, 0xcafebabe)
  assert mem.r32(0x300) == 0xcafebabe

  mem.write(0, 0x101, 43)
  assert mem.read(0, 0x101) == 43

  mem.write(1, 0x202, 0x1234)
  assert mem.read(1, 0x202) == 0x1234

  mem.write(2, 0x304, 0x11223344)
  assert mem.read(2, 0x304) == 0x11223344

  # invalid values
  with pytest.raises(ValueError):
    mem.w8(0x100, 0x100)
  with pytest.raises(ValueError):
    mem.w8(0x100, -1)
  # invalid values
  with pytest.raises(struct.error):
    mem.w16(0x100, 0x10000)
  with pytest.raises(struct.error):
    mem.w16(0x100, -2)
  # invalid values
  with pytest.raises(struct.error):
    mem.w32(0x100, 0x100000000)
  with pytest.raises(struct.error):
    mem.w32(0x100, -3)
  # invalid type
  with pytest.raises(ValueError):
    mem.w8(0x100, 'hello')
  # invalid type
  with pytest.raises(struct.error):
    mem.w16(0x100, 'hello')
  # invalid type
  with pytest.raises(struct.error):
    mem.w32(0x100, 'hello')
  # invalid width
  with pytest.raises(ValueError):
    mem.write(7, 0x202, 12)
  with pytest.raises(ValueError):
    mem.read(7, 0x202)
Beispiel #16
0
def astructs_bitfield_inst_test():
    mem = MockMemory()
    mem.w32(4, 1)
    # instance
    bf = MyBF(mem=mem, addr=4)
    assert str(bf) == "a"
    assert repr(bf) == "MyBF('a')"
    assert int(bf) == MyBF.a
    assert bf.has_bits(MyBF.a)
    assert bf.has_bits("a")
    # set bit
    bf.set_bits(MyBF.c)
    assert str(bf) == "a|c"
    assert int(bf) == MyBF.c | MyBF.a
    assert bf.has_bits("c")
    assert bf.has_bits(MyBF.c)
    assert bf.has_bits("a")
    assert bf.has_bits(MyBF.a)
    assert mem.r32(4) == MyBF.c | MyBF.a
    # clr bit
    bf.clr_bits(MyBF.a)
    assert str(bf) == "c"
    assert int(bf) == MyBF.c
    assert bf.has_bits("c")
    assert bf.has_bits(MyBF.c)
    assert not bf.has_bits("a")
    assert not bf.has_bits(MyBF.a)
    assert mem.r32(4) == MyBF.c
    # set value
    bf.set(MyBF.a | MyBF.b)
    assert str(bf) == "a|b"
    assert int(bf) == MyBF.b | MyBF.a
    assert bf.has_bits("b")
    assert bf.has_bits(MyBF.b)
    assert bf.has_bits("a")
    assert bf.has_bits(MyBF.a)
    assert mem.r32(4) == MyBF.b | MyBF.a
def make_functions_ptr_test():
  mem = MockMemory()
  # build an offset array
  ptr = 0
  fptrs = [0x100, 0x202, 0x404, 0x808, 0x10000]
  for fptr in fptrs:
    mem.w32(ptr, fptr)
    ptr += 4
  mem.w32s(ptr, -1)
  # build func table
  lib_base = 0x800
  mf = MakeFuncs(mem)
  size = mf.make_functions(lib_base, 0)
  assert size == len(fptrs) * 6
  # check jump table
  ptr = lib_base - 6
  for fptr in fptrs:
    assert mem.r16(ptr) == op_jmp
    assert mem.r32(ptr+2) == fptr
    ptr -= 6
def make_functions_offset_test():
  mem = MockMemory()
  # build an offset array
  ptr = 0
  offsets = [-10, 2, 16, 32, 68, 100]
  for off in offsets:
    mem.w16s(ptr, off)
    ptr += 2
  mem.w16s(ptr, -1)
  # build func table
  disp_base = 0x1000
  lib_base = 0x800
  mf = MakeFuncs(mem)
  size = mf.make_functions(lib_base, 0, disp_base)
  assert size == len(offsets) * 6
  # check jump table
  ptr = lib_base - 6
  for off in offsets:
    addr = disp_base + off
    assert mem.r16(ptr) == op_jmp
    assert mem.r32(ptr+2) == addr
    ptr -= 6